diff --git a/install.sh b/install.sh index f542d05..5236d79 100755 --- a/install.sh +++ b/install.sh @@ -87,6 +87,25 @@ while [ $# -gt 0 ]; do done log() { printf '\033[1;34m[netbird-telegraf]\033[0m %s\n' "$*"; } + +# /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: +# "sh: /etc/default/telegraf: /pfad/zwei.log: Permission denied" — genau das +# passierte auf x22 und blockierte jedes weitere Update). +# Deshalb: nur syntaktisch heile Dateien auswerten, sonst sichern und warnen. +load_defaults() { + [ -r /etc/default/telegraf ] || return 0 + if sh -n /etc/default/telegraf >/dev/null 2>&1; then + set -a; . /etc/default/telegraf; set +a + return 0 + fi + printf '\033[1;33m[netbird-telegraf] WARNUNG:\033[0m /etc/default/telegraf ist nicht auswertbar — wird neu geschrieben.\n' + _bad="/etc/default/telegraf.unlesbar.$(date +%s)" + cp -a /etc/default/telegraf "$_bad" 2>/dev/null || true + printf '\033[1;33m[netbird-telegraf]\033[0m Sicherung: %s\n' "$_bad" + return 0 +} die() { printf '\033[1;31m[netbird-telegraf] FEHLER:\033[0m %s\n' "$*" >&2; exit 1; } [ "$(id -u)" -eq 0 ] || die "Bitte als root ausführen (sudo)." @@ -186,20 +205,30 @@ if [ "$HAS_APACHE" -eq 1 ] && [ -z "$APACHE_LOG" ]; then # KeyHelp : /home/users//logs//access.log # Plesk : /var/www/vhosts//logs/access_log # cPanel : /usr/local/apache/domlogs/ (bzw. /home//logs) + # ALLE passenden Muster sammeln, nicht nur das erste: auf einem KeyHelp-Host + # existieren oft BEIDE Strukturen — /var/log/apache2/keyhelp/access.log UND + # /home/users//logs//access.log. Nur eines zu waehlen verliert + # die Haelfte der Requests. if [ -z "$APACHE_LOG" ]; then + _pats="" for _pat in \ + "/var/log/apache2/*/access.log" \ "/home/users/*/logs/*/access.log" \ + "/home/*/logs/*/access.log" \ "/var/www/vhosts/*/logs/access_log" \ "/usr/local/apache/domlogs/*" \ - "/home/*/logs/*/access.log" \ - "/var/log/apache2/*access*.log" \ "/var/log/httpd/*access*.log"; do # shellcheck disable=SC2086 if ls $_pat >/dev/null 2>&1; then - APACHE_LOG="$_pat" - break + _pats="$_pats $_pat" fi done + # Globale Standarddatei nur, wenn sie NICHT leer ist (auf KeyHelp ist + # /var/log/apache2/access.log oft vorhanden, aber 0 Bytes). + for _p in /var/log/apache2/access.log /var/log/httpd/access_log; do + [ -s "$_p" ] && _pats="$_pats $_p" + done + [ -n "$_pats" ] && APACHE_LOG="$(printf '%s' "$_pats" | sed 's/^ //')" fi # Einzelne, flache Faelle weiterhin abdecken if [ -z "$APACHE_LOG" ]; then @@ -306,7 +335,13 @@ command_args="--config /etc/telegraf/telegraf.conf --config-directory /etc/teleg command_user=telegraf command_background=true pidfile=/run/telegraf.pid -start_pre() { set -a; [ -r /etc/default/telegraf ] && . /etc/default/telegraf; set +a; } +start_pre() { + # Nur auswerten, wenn die Datei syntaktisch heil ist — sonst startet der + # Dienst gar nicht (unquoted Werte mit Leerzeichen brechen das Sourcing). + if [ -r /etc/default/telegraf ] && sh -n /etc/default/telegraf 2>/dev/null; then + set -a; . /etc/default/telegraf; set +a + fi +} depend() { need net; } EOF chmod +x /etc/init.d/telegraf @@ -373,7 +408,13 @@ TELEGRAF_TOKEN=$TELEGRAF_TOKEN PVE_TOKEN=$PVE_TOKEN PVE_NODE=$PVE_NODE PVE_URL=$PVE_URL -APACHE_LOG=$APACHE_LOG +# WICHTIG: Diese Datei wird per ". /etc/default/telegraf" GESOURCT. Werte ohne +# Anfuehrungszeichen brechen bei Leerzeichen oder Sonderzeichen: bei mehreren +# Logpfaden versucht die Shell, den zweiten Pfad als Befehl auszufuehren +# ("...access.log: Permission denied"). Eckige Klammern (TOML-Liste) sind im +# Sourcing sogar Syntaxmuell. Deshalb alles quoten — die Werte werden in der +# Config nur als String gebraucht, nicht als Liste. +APACHE_LOG='$APACHE_LOG' EOF umask 022 @@ -397,7 +438,7 @@ subst_vars() { # $1 = Quelldatei, $2 = Zieldatei, rest = Variablennamen # Holt eine Conf und ersetzt ${...}-Platzhalter aus /etc/default/telegraf. fetch_conf() { fetch "$1" "$2.tmp" - set -a; [ -r /etc/default/telegraf ] && . /etc/default/telegraf; set +a + load_defaults if command -v envsubst >/dev/null; then envsubst '${NODE_NAME} ${PROM_URL} ${LOKI_URL} ${TELEGRAF_TOKEN} ${PVE_TOKEN} ${PVE_NODE} ${PVE_URL} ${APACHE_LOG} ${APACHE_FILES}' < "$2.tmp" > "$2" else @@ -539,7 +580,7 @@ fi # Ohne Filter werden ALLE Dateien geparst — genau wie beim Dienststart. Das ist # der einzige Test, der den Startfehler wirklich verhindert. TG="$(command -v telegraf || echo /usr/local/bin/telegraf)" -set -a; . /etc/default/telegraf; set +a +load_defaults conf_test() { _out="$("$TG" --config /etc/telegraf/telegraf.conf \