fix(installer): /etc/default/telegraf quoten + robustes Sourcing (load_defaults); apache-Logpfade sammeln statt ersten nehmen

This commit is contained in:
mm committed 2026-09-14 00:32:07 +02:00
1 parent d614ffa56a
commit cba503e174
1 file changed
+49 -8
+49 -8
View File
@@ -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/<user>/logs/<domain>/access.log
# Plesk : /var/www/vhosts/<domain>/logs/access_log
# cPanel : /usr/local/apache/domlogs/<domain> (bzw. /home/<user>/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/<user>/logs/<domain>/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 \