diff --git a/scripts/x22-log-archive.sh b/scripts/x22-log-archive.sh new file mode 100755 index 0000000..c9e8942 --- /dev/null +++ b/scripts/x22-log-archive.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# x22-log-archive.sh — Alte Apache-Logs von x22 einsammeln, parsen, ins Archiv schieben. +# +# WARUM ES DIESES SKRIPT GIBT +# Alte Logs sollen dauerhaft auswertbar bleiben. Der Weg dorthin hat zwei Fallen, +# die beide still zuschlagen: +# 1. Ein Import in die PRODUKTIONS-TSDB kann die Zeitreferenz verschieben und +# damit alle Live-Daten als "too old" verwerfen. Deshalb geht der Import +# ausschliesslich in die getrennte Archiv-Instanz (:9091). +# 2. OpenMetrics-Zeitstempel sind SEKUNDEN. Millisekunden ergeben Bloecke im +# Jahr 58.662, die Prometheus verwirft — die Abfrage bleibt dann leer. +# Das Archiver-Skript prueft Punkt 2 selbst (Einheiten-Waechter) und bricht ab. +# +# AUFRUF auf x22 (als root): +# curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/scripts/x22-log-archive.sh -o /root/x22-archive.sh +# bash /root/x22-archive.sh # Messen (nichts wird veraendert) +# bash /root/x22-archive.sh --backfill # Logs parsen und Archiv-Tarball bauen +# +# Das Skript AENDERT NICHTS am laufenden Telegraf und importiert nichts selbst — +# es liefert eine Datei, die auf dem imac ins Archiv geschoben wird. + +set -eu + +REPO_RAW="${REPO_RAW:-https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main}" +OUT_DIR="${OUT_DIR:-/root/apache-archive}" +NODE="${NODE:-x22.idx.wf-keyhelp}" +BACKFILL=0 +[ "${1:-}" = "--backfill" ] && BACKFILL=1 + +log() { printf '\033[1;34m[x22-archiv]\033[0m %s\n' "$*"; } +warn() { printf '\033[1;33m[x22-archiv] WARNUNG:\033[0m %s\n' "$*" >&2; } +die() { printf '\033[1;31m[x22-archiv] FEHLER:\033[0m %s\n' "$*" >&2; exit 1; } + +[ "$(id -u)" -eq 0 ] || die "Bitte als root ausfuehren." + +# -------------------------------------------------------------------------- +# 1) Bestand messen — MESSEN, NICHT RATEN +# -------------------------------------------------------------------------- +log "Bestandsaufnahme der Apache-Logs …" +mkdir -p /tmp/x22-archiv +curl -fsSL "$REPO_RAW/scripts/apache-log-survey.py" -o /tmp/x22-archiv/survey.py \ + || die "survey.py konnte nicht geladen werden ($REPO_RAW/scripts/apache-log-survey.py)" +python3 /tmp/x22-archiv/survey.py --node "$NODE" 2>&1 | tee /tmp/x22-archiv/bestand.txt + +if [ "$BACKFILL" -eq 0 ]; then + echo + log "Das war nur die Messung — es wurde nichts veraendert." + echo " Fuer die Archivierung: bash $0 --backfill" + echo " Bestand: /tmp/x22-archiv/bestand.txt" + exit 0 +fi + +# -------------------------------------------------------------------------- +# 2) Archiv bauen +# -------------------------------------------------------------------------- +log "Archiver laden …" +curl -fsSL "$REPO_RAW/scripts/apache-log-archive.py" -o /tmp/x22-archiv/archive.py \ + || die "apache-log-archive.py konnte nicht geladen werden." + +log "Logs parsen und OpenMetrics erzeugen (kann bei viel Historie dauern) …" +python3 /tmp/x22-archiv/archive.py --node "$NODE" --out "$OUT_DIR" --include-raw 2>&1 | tail -20 + +# -------------------------------------------------------------------------- +# 3) Selbst pruefen, bevor irgendetwas weitergereicht wird +# -------------------------------------------------------------------------- +OM="$OUT_DIR/apache-archive.openmetrics" +[ -s "$OM" ] || die "Keine Ausgabe erzeugt: $OM fehlt oder ist leer." + +log "Selbstpruefung der Ausgabe" +python3 - "$OM" <<'PY' +import sys, time +path = sys.argv[1] +lines = [l for l in open(path) if l and not l.startswith("#")] +if not lines: + print(" FEHLER: keine Datenpunkte"); sys.exit(1) +ts = sorted(int(l.rsplit(" ", 1)[1]) for l in lines) +now = int(time.time()) +print(f" Datenpunkte: {len(lines)}") +print(f" Zeitraum: {time.strftime('%d.%m.%Y %H:%M', time.gmtime(ts[0]))}" + f" .. {time.strftime('%d.%m.%Y %H:%M', time.gmtime(ts[-1]))} UTC") +print(f" Einheit: Sekunden (Plausibilitaet geprueft)") +# Einheiten-Wache: alles nach 2100 ist kein Sekundenwert +if ts[-1] > 4102444800: + print(" FEHLER: Zeitstempel nach dem Jahr 2100 -> Millisekunden statt Sekunden"); sys.exit(1) +# Zukunft pruefen: das ist der Fehler, der die Produktion kosten kann +zukunft = [t for t in ts if t > now + 300] +if zukunft: + print(f" WARNUNG: {len(zukunft)} Punkte liegen in der ZUKUNFT " + f"(max {time.strftime('%d.%m.%Y %H:%M', time.gmtime(zukunft[-1]))}).") + print(" Diese Punkte stammen aus einer falschen Systemuhr oder falschen Logs.") +else: + print(" Zukunfts-Check: OK (kein Punkt nach jetzt)") +PY + +TAR="$OUT_DIR/apache-archive.tar.gz" +[ -s "$TAR" ] && log "Tarball: $TAR ($(du -h "$TAR" | cut -f1))" + +# -------------------------------------------------------------------------- +# 4) Uebergabe +# -------------------------------------------------------------------------- +cat <