diff --git a/install.sh b/install.sh index 9ac3a7d..055579c 100755 --- a/install.sh +++ b/install.sh @@ -41,6 +41,10 @@ COLLECTOR="${COLLECTOR:-}" # nur setzen fuer den Direktweg im NetBird TELEGRAF_TOKEN="${TELEGRAF_TOKEN:-}" NODE_NAME="${NODE_NAME:-$(hostname -s 2>/dev/null || hostname)}" ROLE="auto" +# Wurden --name/--role auf der Kommandozeile gesetzt? Nur dann darf ein +# Update-Lauf die in /etc/default/telegraf hinterlegten Werte ueberschreiben. +NAME_GIVEN=0 +ROLE_GIVEN=0 PVE_TOKEN="${PVE_TOKEN:-}" PVE_NODE="${PVE_NODE:-}" PVE_URL="${PVE_URL:-}" @@ -62,10 +66,10 @@ REMOVE_TIMER=0 while [ $# -gt 0 ]; do case "$1" in - --name) NODE_NAME="$2"; shift 2 ;; + --name) NODE_NAME="$2"; NAME_GIVEN=1; shift 2 ;; --collector) COLLECTOR="${2:-}"; shift 2 ;; --token) TELEGRAF_TOKEN="$2"; shift 2 ;; - --role) ROLE="$2"; shift 2 ;; + --role) ROLE="$2"; ROLE_GIVEN=1; shift 2 ;; --pve-token) PVE_TOKEN="$2"; shift 2 ;; --pve-node) PVE_NODE="$2"; shift 2 ;; --pve-url) PVE_URL="$2"; shift 2 ;; @@ -90,6 +94,51 @@ done log() { printf '\033[1;34m[netbird-telegraf]\033[0m %s\n' "$*"; } +# -------------------------------------------------------------------------- +# Bestehende Installation: Werte aus /etc/default/telegraf nachladen +# +# WARUM: Der Auto-Updater liest Token, NODE_NAME und ROLE aus dieser Datei und +# gibt sie dem Unterlauf mit. Ein MANUELLER `--update-only`-Lauf tat das nicht +# und brach an der Token-Pruefung ab ("Kein Token"), obwohl der Token auf der +# Maschine liegt. Die Datei ist die Quelle der Wahrheit fuer eine bereits +# eingerichtete Node — die Kommandozeile ueberschreibt sie nur, wenn sie +# ausdruecklich etwas anderes sagt. +# +# Zweiter, stiller Fehler derselben Ursache: ohne --name fiel NODE_NAME auf den +# Hostnamen zurueck. Auf einem KeyHelp-Host heisst der Host aber nicht wie die +# Node ('x22' vs 'x22.idx.wf-keyhelp') — ein Update-Lauf haette die Node unter +# falschem Label neu registriert. Ebenso haette ein PVE-Knoten ohne --role seine +# Rolle auf 'auto' verloren (kein pvesh-Drop-in mehr). +# -------------------------------------------------------------------------- +_rd_default() { + sed -n "s/^$1=//p" /etc/default/telegraf 2>/dev/null | head -1 \ + | sed "s/^['\"]//; s/['\"]$//" +} +if [ -r /etc/default/telegraf ]; then + if [ -z "$TELEGRAF_TOKEN" ]; then + TELEGRAF_TOKEN="$(_rd_default TELEGRAF_TOKEN)" + [ -n "$TELEGRAF_TOKEN" ] && log "Token aus /etc/default/telegraf uebernommen." + fi + [ -z "$COLLECTOR" ] && COLLECTOR="$(_rd_default COLLECTOR)" + if [ "$NAME_GIVEN" -eq 0 ]; then + _n="$(_rd_default NODE_NAME)" + if [ -n "$_n" ] && [ "$_n" != "$NODE_NAME" ]; then + log "Node-Name aus /etc/default/telegraf uebernommen: $_n" + NODE_NAME="$_n" + fi + fi + if [ "$ROLE_GIVEN" -eq 0 ]; then + _r="$(_rd_default ROLE)" + if [ -n "$_r" ] && [ "$_r" != "none" ]; then + log "Rolle aus /etc/default/telegraf uebernommen: $_r" + ROLE="$_r" + fi + fi + [ -z "$PVE_NODE" ] && PVE_NODE="$(_rd_default PVE_NODE)" + [ -z "$PVE_URL" ] && PVE_URL="$(_rd_default PVE_URL)" + # APACHE_LOG kommt als gequotete Liste — die Quotes entfernt _rd_default. +fi + # /etc/default/telegraf robust einlesen. Ein direktes "." bricht die ganze # Installation ab, wenn die Datei einen unquoted Wert mit Leerzeichen oder # Sonderzeichen enthaelt (alte APACHE_LOG-Zeile mit zwei Pfaden: @@ -291,8 +340,13 @@ fi # APACHE_LOG kann mehrere, leerzeichengetrennte Pfade enthalten -> als # TOML-Liste rendern. Achtung: Pfade mit Leerzeichen sind in Apache-Logs # ungewoehnlich; wir quoten jeden Eintrag einzeln. -if [ "$HAS_APACHE" -eq 1 ]; then - APACHE_FILES="" +# APACHE_FILES IMMER berechnen, NICHT nur bei erkanntem Apache. +# Realer Fehler: bei ROLE=apache ohne Apache-Erkennung (z. B. httpd auf RHEL, +# oder Apache wurde entfernt) blieb die Variable leer. Die Conf rendert dann zu +# "files = " — ungueltiges TOML, Telegraf startet nicht mehr, ALLE Metriken aus. +# Der Guard war die Ursache; die Berechnung selbst ist harmlos. +APACHE_FILES="" +if [ "$HAS_APACHE" -eq 1 ] || [ "$ROLE" = "apache" ]; then # set -f: Pfadnamen-Expansion abschalten! Sonst ersetzt die Shell die # Glob-Muster durch die aktuell vorhandenen Dateien — die Conf enthielte # feste Einzelpfade und jede NEUE Domain fiele heraus, bis der Installer @@ -305,8 +359,11 @@ if [ "$HAS_APACHE" -eq 1 ]; then set +f [ -n "$APACHE_FILES" ] || APACHE_FILES='"/var/log/apache2/access.log"' APACHE_FILES="[$APACHE_FILES]" - export APACHE_FILES fi +# Sicherheitsnetz: die Variable MUSS nicht-leer sein, bevor apache.conf gerendert +# wird. Ein leerer Wert erzeugt ungueltiges TOML und kostet die ganze Node. +[ -n "${APACHE_FILES:-}" ] || APACHE_FILES='["/var/log/apache2/access.log"]' +export APACHE_FILES if [ "$ROLE" = "auto" ]; then ROLE="none" [ "$IS_PVE" -eq 1 ] && ROLE="proxmox"