feat(diagnose): --diagnose prueft Leserechte, leere Dateien, Parser und Offset in einem Aufruf

This commit is contained in:
mm committed 2026-09-14 00:35:11 +02:00
1 parent ce52d2c26b
commit 711d8bdc1d
1 file changed
+57
+57
View File
@@ -54,6 +54,7 @@ REPO_RAW="${REPO_RAW:-https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/br
UNINSTALL=0 UNINSTALL=0
CHECK=0 CHECK=0
SHOW_VERSION=0 SHOW_VERSION=0
DIAGNOSE=0
FORCE_UPDATE=0 FORCE_UPDATE=0
UPDATE_ONLY=0 UPDATE_ONLY=0
TIMER_INTERVAL="" TIMER_INTERVAL=""
@@ -72,6 +73,7 @@ while [ $# -gt 0 ]; do
--uninstall) UNINSTALL=1; shift ;; --uninstall) UNINSTALL=1; shift ;;
--check) CHECK=1; shift ;; --check) CHECK=1; shift ;;
--version) SHOW_VERSION=1; shift ;; --version) SHOW_VERSION=1; shift ;;
--diagnose) DIAGNOSE=1; shift ;;
--force-update) FORCE_UPDATE=1; shift ;; --force-update) FORCE_UPDATE=1; shift ;;
--update-only) UPDATE_ONLY=1; shift ;; --update-only) UPDATE_ONLY=1; shift ;;
--install-update-timer) --install-update-timer)
@@ -109,6 +111,61 @@ load_defaults() {
die() { printf '\033[1;31m[netbird-telegraf] FEHLER:\033[0m %s\n' "$*" >&2; exit 1; } 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)." [ "$(id -u)" -eq 0 ] || die "Bitte als root ausführen (sudo)."
# --------------------------------------------------------------------------
# --diagnose: prueft in EINEM Aufruf, warum ein Input nichts liefert.
# Prueft genau die Stellen, die schon still versagt haben:
# Rechte des Dienst-Benutzers, leere Dateien, Offset-Zustand, Parser-Fehler.
# --------------------------------------------------------------------------
if [ "$DIAGNOSE" -eq 1 ]; then
printf '=== Telegraf-Installer Diagnose ===\n'
TG="$(command -v telegraf || echo /usr/local/bin/telegraf)"
printf '\n-- Dienst --\n'
if command -v systemctl >/dev/null 2>&1; then
printf 'Status: %s\n' "$(systemctl is-active telegraf 2>/dev/null || echo unbekannt)"
printf 'Benutzer: %s\n' "$(systemctl show telegraf -p User --value 2>/dev/null || echo unbekannt)"
printf 'Gruppen: %s\n' "$(systemctl show telegraf -p SupplementaryGroups --value 2>/dev/null || echo -)"
fi
DBU="$(systemctl show telegraf -p User --value 2>/dev/null || echo telegraf)"
[ -n "$DBU" ] || DBU=telegraf
printf '\n-- Logpfade aus der aktiven Conf --\n'
CF="/etc/telegraf/telegraf.d/apache.conf"
[ -f "$CF" ] || CF="/etc/telegraf/telegraf.conf"
_files="$(sed -n 's/^[[:space:]]*files = \[\(.*\)\].*/\1/p' "$CF" | tr -d '"' | tr ',' ' ')"
[ -n "$_files" ] || { printf ' (keine files-Liste gefunden)\n'; }
_n=0; _ok=0; _empty=0; _noread=0
for _f in $_files; do
_n=$((_n+1))
if [ ! -e "$_f" ]; then printf ' FEHLT %s\n' "$_f"; continue; fi
_size="$(stat -c %s "$_f" 2>/dev/null || echo 0)"
if [ "$_size" -eq 0 ]; then printf ' LEER (0 B) %s\n' "$_f"; _empty=$((_empty+1)); continue; fi
# Lesbarkeit aus Sicht des Dienst-Benutzers — das war die stille Fehlerquelle.
if [ "$(id -u)" -eq 0 ] && command -v su >/dev/null 2>&1 && id "$DBU" >/dev/null 2>&1; then
if su -s /bin/sh "$DBU" -c "head -c 1 '$(_f//\'/\'})' >/dev/null 2>&1"; then
printf ' OK %s (%s Bytes)\n' "$_f" "$_size"; _ok=$((_ok+1))
else
printf ' NICHT LESBAR %s (Benutzer %s) ← URSACHE\n' "$_f" "$DBU"; _noread=$((_noread+1))
fi
else
printf ' vorhanden %s (%s Bytes)\n' "$_f" "$_size"
fi
done
printf ' -> %s Pfade, %s lesbar, %s leer, %s nicht lesbar\n' "$_n" "$_ok" "$_empty" "$_noread"
printf '\n-- Parser-Test (ohne Offset-Zwang) --\n'
_out="$("$TG" --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d --test --test-wait 2 2>&1)"
printf '%s\n' "$_out" | grep -c 'E!' | sed 's/^/ Fehlerzeilen: /'
printf '%s\n' "$_out" | grep -E 'E!' | head -3 | sed 's/^/ /'
printf '%s\n' "$_out" | grep -cE '^[>] ' | sed 's/^/ erzeugte Messungen: /'
printf '\n-- Offset-Zustand (erste Messung je Datei erst nach neuem Zugriff) --\n'
ls -la /var/lib/telegraf/ 2>/dev/null | tail -5 || printf ' (kein State-Verzeichnis)\n'
printf '\nHinweis: initial_read_offset = "saved-or-end" bedeutet, dass beim ERSTEN\n'
printf 'Lauf nur NEUES gelesen wird. Bestehende Zeilen kommen erst mit neuen\n'
printf 'Zugriffen. Fuer einen sofortigen Test: eine Datei anfordern und warten.\n'
exit 0
fi
# Reine Abfragen brauchen keinen Token und kein root (Timer-Verwaltung schon). # Reine Abfragen brauchen keinen Token und kein root (Timer-Verwaltung schon).
if [ "$SHOW_VERSION" -eq 1 ] || [ "$CHECK" -eq 1 ]; then if [ "$SHOW_VERSION" -eq 1 ] || [ "$CHECK" -eq 1 ]; then
LOCAL_V="$(cat /etc/telegraf/CONFIG_VERSION 2>/dev/null || echo 'nicht installiert')" LOCAL_V="$(cat /etc/telegraf/CONFIG_VERSION 2>/dev/null || echo 'nicht installiert')"