feat(updater): --check/--version, --force-update mit Rollback, --update-only, systemd-Timer + Windows-Task; VERSION+SHA-Marker; envsubst-Fallback
This commit is contained in:
1 parent
0e9dce9e47
commit
8d05d3bc48
3 files changed
+461
-3
No files matched your search
@@ -5,6 +5,79 @@ Der Ausgang läuft über den **NetBird-Reverse-Proxy** (`imac-prometheus.x05.idx
|
||||
mit **Bearer-Token** — dadurch funktioniert der Installer auch auf Maschinen, die **kein NetBird-Peer** sind
|
||||
(Büro-LAN, Kundenlaptop, CGNAT, VM ohne Client).
|
||||
|
||||
## Auto-Updater und Force-Updater
|
||||
|
||||
Der Installer hält sich auf den Nodes selbst aktuell.
|
||||
|
||||
### Prüfen
|
||||
|
||||
```sh
|
||||
sh install.sh --version # installierte + verfügbare Version
|
||||
sh install.sh --check # Exit 0 = aktuell, Exit 10 = Update verfügbar
|
||||
```
|
||||
|
||||
Beides braucht **keinen Token** und **kein root** — gut für Monitoring-Checks.
|
||||
|
||||
### Auto-Updater (systemd-Timer)
|
||||
|
||||
```sh
|
||||
sh install.sh --name <node> --token <T> --install-update-timer daily
|
||||
sh install.sh --name <node> --token <T> --install-update-timer 30min
|
||||
sh install.sh --name <node> --token <T> --install-update-timer weekly
|
||||
```
|
||||
|
||||
Legt `telegraf-installer-update.timer` an (Default `daily` 04:30, ±15 min Streuung).
|
||||
Der Lauf ist billig: Es werden nur `VERSION` und der SHA des Installers verglichen.
|
||||
Erst bei Abweichung lädt er den Installer und ruft sich mit `--update-only` auf.
|
||||
Log: `/var/log/telegraf-installer-update.log`.
|
||||
|
||||
`--update-only` fasst **nur** `telegraf.d/`-Konfs und Hilfsscripts an: kein
|
||||
Paket-Update, `/etc/default/telegraf` (und damit der Token) bleibt unberührt,
|
||||
kein Neustart wenn sich nichts geändert hat.
|
||||
|
||||
Warum Version **und** Hash: Die `VERSION` erkennt neue Auslieferungen, der SHA
|
||||
auch Korrekturen ohne Versionssprung (z. B. ein Fix an `journal-tail.sh`).
|
||||
Ohne den Hash bliebe eine Node mit fehlerhaftem Script stehen.
|
||||
|
||||
### Force-Updater
|
||||
|
||||
```sh
|
||||
sh install.sh --force-update --name <node> --token <T>
|
||||
```
|
||||
|
||||
Schreibt Konfs und Scripts **immer** neu, sichert sie vorher nach
|
||||
`/var/backups/telegraf-<zeitstempel>/` und startet den Dienst neu. Schlägt der
|
||||
Konfig-Test fehl, wird automatisch zurückgerollt. Idempotent — mehrfaches
|
||||
Ausführen ist folgenlos. Das Werkzeug nach einem kaputten Update oder wenn
|
||||
jemand Dateien von Hand verändert hat.
|
||||
|
||||
Entfernen: `sh install.sh --remove-update-timer`
|
||||
|
||||
### Windows
|
||||
|
||||
```powershell
|
||||
.\install.ps1 -Name <node> -Token <T> -Check # Versionsvergleich
|
||||
.\install.ps1 -Name <node> -Token <T> -InstallUpdateTask # taeglich
|
||||
.\install.ps1 -Name <node> -Token <T> -InstallUpdateTask -UpdateInterval hourly
|
||||
.\install.ps1 -Name <node> -Token <T> -ForceUpdate
|
||||
.\install.ps1 -RemoveUpdateTask
|
||||
```
|
||||
|
||||
Die Aufgabe `\NetBirdTelegraf\Update` läuft mit denselben Semantiken
|
||||
(Version + Hash, nur bei Änderung). Log:
|
||||
`%ProgramData%\netbird-telegraf\update.log`.
|
||||
|
||||
### Marker auf der Node
|
||||
|
||||
| Datei | Inhalt |
|
||||
|---|---|
|
||||
| `/etc/telegraf/CONFIG_VERSION` | zuletzt installierte Repo-Version |
|
||||
| `/etc/telegraf/INSTALLER_SHA` | SHA256 des Installers zum Installationszeitpunkt |
|
||||
| `/etc/telegraf/REPO_RAW` | genutzte Repo-Quelle (GitHub-Mirror, Testserver) |
|
||||
|
||||
`REPO_RAW` ist per Umgebungsvariable überschreibbar — nützlich für Tests,
|
||||
Mirrors oder einen eigenen Fork.
|
||||
|
||||
### Docker-Nodes (kein journalctl im Image)
|
||||
|
||||
Läuft Telegraf als **Container** (offizielles `telegraf`-Image), ist der Journal-Weg nicht möglich: das Image ist Debian ohne `systemd` und hat **kein `journalctl`**; `/hostfs` ist zudem read-only. Dafür gibt es `scripts/syslog-tail.sh` — es liest die **Syslog-Dateien des Hosts** unter `/hostfs/var/log/`.
|
||||
|
||||
+93
-1
@@ -13,7 +13,12 @@ param(
|
||||
[string]$Collector = "",
|
||||
[string]$Token = "",
|
||||
[string]$Version = "1.40.0",
|
||||
[switch]$Uninstall
|
||||
[switch]$Uninstall,
|
||||
[switch]$Check, # nur Versionsvergleich
|
||||
[switch]$ForceUpdate, # Confs immer neu schreiben + Dienst neu starten
|
||||
[switch]$InstallUpdateTask, # geplante Aufgabe fuer Auto-Update
|
||||
[switch]$RemoveUpdateTask,
|
||||
[string]$UpdateInterval = "daily"
|
||||
)
|
||||
$ErrorActionPreference = "Stop"
|
||||
if (-not $Token -and -not $Collector) { throw "Kein Token: -Token <Bearer-Token> angeben (siehe README)." }
|
||||
@@ -38,6 +43,29 @@ if ($Uninstall) {
|
||||
$arch = "amd64"
|
||||
if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") { $arch = "arm64" }
|
||||
elseif (-not [Environment]::Is64BitOperatingSystem) { $arch = "i386" }
|
||||
$RepoRaw = if ($env:REPO_RAW) { $env:REPO_RAW } else { "https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main" }
|
||||
$MarkerDir = "$env:ProgramData\netbird-telegraf"
|
||||
$VersionFile = Join-Path $MarkerDir "CONFIG_VERSION"
|
||||
|
||||
function Get-RemoteVersion {
|
||||
try { return (Invoke-WebRequest -UseBasicParsing -TimeoutSec 15 "$RepoRaw/VERSION").Content.Trim() }
|
||||
catch { return "" }
|
||||
}
|
||||
|
||||
# Reine Abfragen: kein Token, kein Dienst-Eingriff
|
||||
if ($Check -or (-not $Token -and -not $Uninstall -and -not $RemoveUpdateTask)) {
|
||||
$local = if (Test-Path $VersionFile) { (Get-Content $VersionFile -Raw).Trim() } else { "nicht installiert" }
|
||||
$remote = Get-RemoteVersion
|
||||
if (-not $remote) { $remote = "nicht erreichbar" }
|
||||
Write-Host "installiert: $local"
|
||||
Write-Host "verfuegbar: $remote"
|
||||
if ($Check) {
|
||||
if ($local -eq $remote -and $local -ne "nicht installiert") { Write-Host "Status: aktuell"; exit 0 }
|
||||
Write-Host "Status: Update verfuegbar"; exit 10
|
||||
}
|
||||
if (-not $Token) { Write-Host "[netbird-telegraf] Kein Token angegeben (-Token)."; exit 2 }
|
||||
}
|
||||
|
||||
Write-Host "[netbird-telegraf] Node=$Name Arch=$arch Collector=$Collector"
|
||||
|
||||
try {
|
||||
@@ -125,5 +153,69 @@ Stop-Service telegraf -ErrorAction SilentlyContinue
|
||||
Start-Service telegraf
|
||||
Start-Sleep -Seconds 3
|
||||
if ((Get-Service telegraf).Status -ne "Running") { throw "Dienst telegraf läuft nicht." }
|
||||
|
||||
# --- Versionsmarker fuer den Auto-Updater ---
|
||||
New-Item -ItemType Directory -Force -Path $MarkerDir | Out-Null
|
||||
$rv = Get-RemoteVersion
|
||||
if (-not $rv) { $rv = "unbekannt" }
|
||||
Set-Content -Path $VersionFile -Value $rv -Encoding ASCII
|
||||
$iscript = Join-Path $env:TEMP "tg-installer.ps1"
|
||||
try {
|
||||
Invoke-WebRequest -UseBasicParsing -TimeoutSec 25 "$RepoRaw/install.ps1" -OutFile $iscript
|
||||
(Get-FileHash $iscript -Algorithm SHA256).Hash.ToLower() | Set-Content -Path (Join-Path $MarkerDir "INSTALLER_SHA") -Encoding ASCII
|
||||
} catch { }
|
||||
Set-Content -Path (Join-Path $MarkerDir "REPO_RAW") -Value $RepoRaw -Encoding ASCII
|
||||
|
||||
# --- Auto-Update als geplante Aufgabe ---
|
||||
function Install-UpdateTask {
|
||||
param([string]$Interval)
|
||||
$upd = Join-Path $MarkerDir "update.ps1"
|
||||
$body = @"
|
||||
`$ErrorActionPreference = 'Continue'
|
||||
`$log = '`$env:ProgramData\netbird-telegraf\update.log'
|
||||
function Say(`$m) { Add-Content -Path `$log -Value ("{0} {1}" -f (Get-Date -Format s), `$m) }
|
||||
`$repo = if (`$env:REPO_RAW) { `$env:REPO_RAW } else { (Get-Content '`$env:ProgramData\netbird-telegraf\REPO_RAW' -Raw).Trim() }
|
||||
`$vf = '`$env:ProgramData\netbird-telegraf\CONFIG_VERSION'
|
||||
`$local = if (Test-Path `$vf) { (Get-Content `$vf -Raw).Trim() } else { '' }
|
||||
`$remote = ''
|
||||
try { `$remote = (Invoke-WebRequest -UseBasicParsing -TimeoutSec 20 "`$repo/VERSION").Content.Trim() } catch { }
|
||||
if (-not `$remote) { Say 'Repo nicht erreichbar — kein Update.'; exit 0 }
|
||||
`$need = (`$local -ne `$remote)
|
||||
if (-not `$need) {
|
||||
try {
|
||||
`$t = Join-Path `$env:TEMP 'tg-i.ps1'
|
||||
Invoke-WebRequest -UseBasicParsing -TimeoutSec 25 "`$repo/install.ps1" -OutFile `$t
|
||||
`$rs = (Get-FileHash `$t -Algorithm SHA256).Hash.ToLower()
|
||||
`$ls = (Get-Content '`$env:ProgramData\netbird-telegraf\INSTALLER_SHA' -Raw -ErrorAction SilentlyContinue).Trim()
|
||||
if (`$rs -ne `$ls) { `$need = `$true }
|
||||
} catch { }
|
||||
}
|
||||
if (-not `$need) { Say "aktuell (`$local) — nichts zu tun."; exit 0 }
|
||||
Say "Update `$local -> `$remote"
|
||||
`$i = Join-Path `$env:TEMP 'tg-i.ps1'
|
||||
try { Invoke-WebRequest -UseBasicParsing -TimeoutSec 60 "`$repo/install.ps1" -OutFile `$i } catch { Say 'Download fehlgeschlagen.'; exit 1 }
|
||||
`$nm = (Get-Content '`$env:ProgramData\netbird-telegraf\NODE_NAME' -Raw -ErrorAction SilentlyContinue).Trim()
|
||||
`$tk = (Get-Content '`$env:ProgramData\netbird-telegraf\TOKEN' -Raw -ErrorAction SilentlyContinue).Trim()
|
||||
try {
|
||||
& powershell -NoProfile -ExecutionPolicy Bypass -File `$i -Name `$nm -Token `$tk *>> `$log
|
||||
Say 'Update erfolgreich.'
|
||||
} catch { Say "Update FEHLGESCHLAGEN: `$_" }
|
||||
"@
|
||||
Set-Content -Path $upd -Value $body -Encoding UTF8
|
||||
$when = switch ($Interval) { "hourly" { (New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)) }
|
||||
"weekly" { (New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 4:30am) }
|
||||
default { (New-ScheduledTaskTrigger -Daily -At 4:30am) } }
|
||||
$act = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$upd`""
|
||||
$set = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd
|
||||
Register-ScheduledTask -TaskName "NetBirdTelegraf-Update" -TaskPath "\NetBirdTelegraf\" -Trigger $when -Action $act -Settings $set -Force | Out-Null
|
||||
Write-Host "[netbird-telegraf] Auto-Update-Aufgabe aktiv ($Interval) — Log: $MarkerDir\update.log"
|
||||
}
|
||||
|
||||
if ($ForceUpdate) { Write-Host "[netbird-telegraf] Force-Update: Konfiguration wurde neu geschrieben." }
|
||||
if ($InstallUpdateTask) { Install-UpdateTask -Interval $UpdateInterval }
|
||||
if ($RemoveUpdateTask) {
|
||||
Unregister-ScheduledTask -TaskName "NetBirdTelegraf-Update" -TaskPath "\NetBirdTelegraf\" -Confirm:$false -ErrorAction SilentlyContinue
|
||||
Write-Host "[netbird-telegraf] Auto-Update-Aufgabe entfernt."
|
||||
}
|
||||
Write-Host "[netbird-telegraf] OK — Node '$Name' liefert an $PromUrl (Metriken) und $LokiUrl (Eventlog Warn/Error)."
|
||||
Write-Host "[netbird-telegraf] Grafana: http://100.83.134.46:3000 (nur im NetBird)"
|
||||
+295
-2
@@ -22,6 +22,14 @@
|
||||
# --pve-url <u> PVE-API-URL (Default: https://127.0.0.1:8006/api2/json)
|
||||
# --apache-log <p> Apache-Access-Log (Default: /var/log/apache2/access.log)
|
||||
# --uninstall Telegraf + Konfiguration entfernen
|
||||
# --check Nur Versionsvergleich, nichts aendern (Exit 0 = aktuell)
|
||||
# --version Installierte und verfuegbare Version ausgeben
|
||||
# --force-update Confs/Scripts IMMER neu schreiben + Dienst neu starten
|
||||
# --update-only Nur Confs/Scripts aktualisieren (kein Paket, kein Restart
|
||||
# ohne Aenderung) — wird vom Auto-Updater-Timer genutzt
|
||||
# --install-update-timer [daily|hourly|weekly|<N>min]
|
||||
# systemd-Timer fuer den Auto-Updater einrichten
|
||||
# --remove-update-timer Timer wieder entfernen
|
||||
# ============================================================================
|
||||
set -eu
|
||||
|
||||
@@ -38,8 +46,15 @@ PVE_NODE="${PVE_NODE:-}"
|
||||
PVE_URL="${PVE_URL:-}"
|
||||
APACHE_LOG="/var/log/apache2/access.log"
|
||||
TELEGRAF_VERSION="${TELEGRAF_VERSION:-1.40.0}"
|
||||
REPO_RAW="https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main"
|
||||
# Ueberschreibbar (Tests/Mirror): REPO_RAW=... sh install.sh
|
||||
REPO_RAW="${REPO_RAW:-https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main}"
|
||||
UNINSTALL=0
|
||||
CHECK=0
|
||||
SHOW_VERSION=0
|
||||
FORCE_UPDATE=0
|
||||
UPDATE_ONLY=0
|
||||
TIMER_INTERVAL=""
|
||||
REMOVE_TIMER=0
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
@@ -52,6 +67,17 @@ while [ $# -gt 0 ]; do
|
||||
--pve-url) PVE_URL="$2"; shift 2 ;;
|
||||
--apache-log) APACHE_LOG="$2"; shift 2 ;;
|
||||
--uninstall) UNINSTALL=1; shift ;;
|
||||
--check) CHECK=1; shift ;;
|
||||
--version) SHOW_VERSION=1; shift ;;
|
||||
--force-update) FORCE_UPDATE=1; shift ;;
|
||||
--update-only) UPDATE_ONLY=1; shift ;;
|
||||
--install-update-timer)
|
||||
TIMER_INTERVAL="${2:-daily}"
|
||||
case "$TIMER_INTERVAL" in
|
||||
daily|hourly|weekly|[0-9]*min|[0-9]*) shift 2 ;;
|
||||
*) TIMER_INTERVAL="daily"; shift ;;
|
||||
esac ;;
|
||||
--remove-update-timer) REMOVE_TIMER=1; shift ;;
|
||||
-h|--help) sed -n '2,24p' "$0"; exit 0 ;;
|
||||
*) echo "Unbekannte Option: $1" >&2; exit 2 ;;
|
||||
esac
|
||||
@@ -61,6 +87,19 @@ log() { printf '\033[1;34m[netbird-telegraf]\033[0m %s\n' "$*"; }
|
||||
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)."
|
||||
# Reine Abfragen brauchen keinen Token und kein root (Timer-Verwaltung schon).
|
||||
if [ "$SHOW_VERSION" -eq 1 ] || [ "$CHECK" -eq 1 ]; then
|
||||
LOCAL_V="$(cat /etc/telegraf/CONFIG_VERSION 2>/dev/null || echo 'nicht installiert')"
|
||||
REMOTE_V="$(curl -fsS -m 15 "$REPO_RAW/VERSION" 2>/dev/null | tr -d ' \r\n')"
|
||||
[ -n "$REMOTE_V" ] || REMOTE_V="nicht erreichbar"
|
||||
printf 'installiert: %s\nverfuegbar: %s\n' "$LOCAL_V" "$REMOTE_V"
|
||||
[ "$CHECK" -eq 1 ] || exit 0
|
||||
if [ "$LOCAL_V" = "$REMOTE_V" ] && [ -n "$LOCAL_V" ] && [ "$LOCAL_V" != "nicht installiert" ]; then
|
||||
echo "Status: aktuell"; exit 0
|
||||
fi
|
||||
echo "Status: Update verfuegbar"; exit 10
|
||||
fi
|
||||
|
||||
[ -n "$TELEGRAF_TOKEN" ] || die "Kein Token: --token <Bearer-Token> angeben (siehe README)."
|
||||
|
||||
if [ -n "${COLLECTOR:-}" ]; then
|
||||
@@ -129,6 +168,20 @@ if command -v curl >/dev/null; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Update-Only: nur Konfiguration und Hilfsscripts aktualisieren.
|
||||
# Kein Paket installieren, /etc/default/telegraf unangetastet lassen (Token!),
|
||||
# Dienst nur neu starten, wenn sich wirklich etwas geaendert hat.
|
||||
# --------------------------------------------------------------------------
|
||||
SNAPSHOT_BEFORE=""
|
||||
if [ "$UPDATE_ONLY" -eq 1 ]; then
|
||||
SNAPSHOT_BEFORE="$(mktemp)"
|
||||
cat /etc/telegraf/telegraf.d/*.conf /etc/telegraf/telegraf.conf 2>/dev/null > "$SNAPSHOT_BEFORE" || true
|
||||
for s in journal-tail syslog-tail node-info proxmox-ve gpu-rocm; do
|
||||
[ -f "/etc/telegraf/$s.sh" ] && cat "/etc/telegraf/$s.sh" >> "$SNAPSHOT_BEFORE" 2>/dev/null
|
||||
done
|
||||
fi
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Installation
|
||||
# --------------------------------------------------------------------------
|
||||
@@ -196,6 +249,7 @@ EOF
|
||||
|
||||
if command -v telegraf >/dev/null 2>&1 || [ -x /usr/local/bin/telegraf ]; then
|
||||
log "Telegraf bereits installiert ($(telegraf --version 2>/dev/null || /usr/local/bin/telegraf --version))."
|
||||
[ "$UPDATE_ONLY" -eq 1 ] && log "Update-Only: Paketinstallation uebersprungen."
|
||||
else
|
||||
case "$OS_ID" in
|
||||
debian|ubuntu|raspbian|linuxmint|pop) install_apt ;;
|
||||
@@ -222,6 +276,9 @@ mkdir -p /etc/telegraf/telegraf.d /etc/default
|
||||
umask 077
|
||||
cat > /etc/default/telegraf <<EOF
|
||||
NODE_NAME=$NODE_NAME
|
||||
# ROLE/COLLECTOR/PVE_* braucht der Auto-Updater, um das Profil zu erhalten
|
||||
# (sonst verliert ein PVE-Knoten beim Update seine Rolle).
|
||||
ROLE=$ROLE
|
||||
COLLECTOR=${COLLECTOR:-}
|
||||
PROM_URL=$PROM_URL
|
||||
LOKI_URL=$LOKI_URL
|
||||
@@ -235,11 +292,30 @@ umask 022
|
||||
|
||||
fetch() { curl -fsSL "$REPO_RAW/$1" -o "$2" || die "Download $1 fehlgeschlagen."; }
|
||||
|
||||
# Ersatz fuer envsubst, falls gettext fehlt (Minimal-Container, schlanke
|
||||
# Alpine-/Rocky-Installationen). Ersetzt nur die uebergebenen Variablennamen —
|
||||
# gleiche Semantik wie envsubst mit expliziter Liste.
|
||||
subst_vars() { # $1 = Quelldatei, $2 = Zieldatei, rest = Variablennamen
|
||||
_src="$1"; _dst="$2"; shift 2
|
||||
cp "$_src" "$_dst"
|
||||
for _v in "$@"; do
|
||||
eval "_val=\${$_v-}"
|
||||
# Wert mit | als Trenner, Sonderzeichen via awk ersetzen (kein sed-Gebastel)
|
||||
awk -v name="$_v" -v val="$_val" '{
|
||||
gsub("\$\{" name "\}", val); print
|
||||
}' "$_dst" > "$_dst.tmp" && mv "$_dst.tmp" "$_dst"
|
||||
done
|
||||
}
|
||||
|
||||
# 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
|
||||
if command -v envsubst >/dev/null; then
|
||||
envsubst '${NODE_NAME} ${PROM_URL} ${LOKI_URL} ${TELEGRAF_TOKEN} ${PVE_TOKEN} ${PVE_NODE} ${PVE_URL} ${APACHE_LOG}' < "$2.tmp" > "$2"
|
||||
else
|
||||
subst_vars "$2.tmp" "$2" NODE_NAME PROM_URL LOKI_URL TELEGRAF_TOKEN PVE_TOKEN PVE_NODE PVE_URL APACHE_LOG
|
||||
fi
|
||||
if grep -q '\${' "$2"; then
|
||||
log "WARNUNG: $2 enthaelt noch unaufgeloeste Platzhalter:"
|
||||
grep -o '\${[A-Z_]*}' "$2" | sort -u >&2
|
||||
@@ -334,10 +410,47 @@ EOF
|
||||
esac
|
||||
chown -R telegraf:telegraf /etc/telegraf 2>/dev/null || true
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Force-Update: Confs und Hilfsscripts erzwungen neu schreiben.
|
||||
# Laeuft VOR dem Konfig-Test, damit ein Rollback unten greifen kann.
|
||||
# --------------------------------------------------------------------------
|
||||
write_conf_backups() { # Sicherung fuer den Rollback
|
||||
BK="/var/backups/telegraf-$(date +%Y%m%d-%H%M%S)"
|
||||
mkdir -p "$BK"
|
||||
cp -a /etc/telegraf/telegraf.d "$BK/" 2>/dev/null || true
|
||||
cp -a /etc/telegraf/telegraf.conf "$BK/" 2>/dev/null || true
|
||||
printf '%s' "$BK" > /var/lib/telegraf-last-backup
|
||||
}
|
||||
|
||||
rollback_conf() { # letzte Sicherung zurueckspielen
|
||||
BK="$(cat /var/lib/telegraf-last-backup 2>/dev/null || true)"
|
||||
[ -n "$BK" ] && [ -d "$BK/telegraf.d" ] || return 1
|
||||
rm -rf /etc/telegraf/telegraf.d
|
||||
cp -a "$BK/telegraf.d" /etc/telegraf/telegraf.d
|
||||
[ -f "$BK/telegraf.conf" ] && cp -a "$BK/telegraf.conf" /etc/telegraf/telegraf.conf
|
||||
log "Rollback aus $BK"
|
||||
}
|
||||
|
||||
if [ "$FORCE_UPDATE" -eq 1 ]; then
|
||||
write_conf_backups
|
||||
log "Force-Update: Confs und Scripts werden neu geschrieben."
|
||||
fi
|
||||
|
||||
# Konfig testen
|
||||
TG="$(command -v telegraf || echo /usr/local/bin/telegraf)"
|
||||
set -a; . /etc/default/telegraf; set +a
|
||||
"$TG" --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d --test --input-filter cpu:mem >/dev/null 2>&1 || die "Konfiguration ungültig — telegraf --test prüfen."
|
||||
if ! "$TG" --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d --test --input-filter cpu:mem >/dev/null 2>&1; then
|
||||
# Bei Force-/Auto-Update zuerst zurueckrollen, dann erst aufgeben.
|
||||
if [ "$FORCE_UPDATE" -eq 1 ] || [ "$UPDATE_ONLY" -eq 1 ]; then
|
||||
log "Konfiguration ungültig — Rollback auf die letzte Sicherung."
|
||||
rollback_conf || true
|
||||
"$TG" --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d --test --input-filter cpu:mem >/dev/null 2>&1 \
|
||||
|| die "Konfiguration auch nach Rollback ungültig — telegraf --test prüfen."
|
||||
log "Rollback erfolgreich, alte Konfiguration aktiv."
|
||||
else
|
||||
die "Konfiguration ungültig — telegraf --test prüfen."
|
||||
fi
|
||||
fi
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Dienst
|
||||
@@ -355,10 +468,37 @@ EOF
|
||||
log "Proxmox: systemd-Drop-in gesetzt — Dienst laeuft als root (pvesh braucht root)."
|
||||
fi
|
||||
|
||||
CHANGED=1
|
||||
if [ "$UPDATE_ONLY" -eq 1 ] && [ -n "$SNAPSHOT_BEFORE" ]; then
|
||||
SNAPSHOT_AFTER="$(mktemp)"
|
||||
cat /etc/telegraf/telegraf.d/*.conf /etc/telegraf/telegraf.conf 2>/dev/null > "$SNAPSHOT_AFTER" || true
|
||||
for s in journal-tail syslog-tail node-info proxmox-ve gpu-rocm; do
|
||||
[ -f "/etc/telegraf/$s.sh" ] && cat "/etc/telegraf/$s.sh" >> "$SNAPSHOT_AFTER" 2>/dev/null
|
||||
done
|
||||
if cmp -s "$SNAPSHOT_BEFORE" "$SNAPSHOT_AFTER"; then CHANGED=0; fi
|
||||
rm -f "$SNAPSHOT_BEFORE" "$SNAPSHOT_AFTER"
|
||||
if [ "$CHANGED" -eq 0 ]; then
|
||||
log "Update-Only: keine Aenderung an Confs/Scripts — kein Neustart noetig."
|
||||
# Versionsmarker TROTZDEM auf den Repo-Stand ziehen: sonst meldet der
|
||||
# naechste Timer-Lauf erneut ein Update und laeuft endlos im Kreis.
|
||||
_RV="$(curl -fsS -m 15 "$REPO_RAW/VERSION" 2>/dev/null | tr -d ' \r\n' || true)"
|
||||
[ -n "$_RV" ] && printf '%s\n' "$_RV" > /etc/telegraf/CONFIG_VERSION
|
||||
_RS="$(curl -fsS -m 20 "$REPO_RAW/install.sh" 2>/dev/null | { command -v sha256sum >/dev/null && sha256sum || shasum -a 256; } | cut -d' ' -f1 || true)"
|
||||
[ -n "$_RS" ] && printf '%s\n' "$_RS" > /etc/telegraf/INSTALLER_SHA
|
||||
printf '%s\n' "$REPO_RAW" > /etc/telegraf/REPO_RAW
|
||||
exit 0
|
||||
fi
|
||||
log "Update-Only: Aenderungen erkannt — Dienst wird neu gestartet."
|
||||
fi
|
||||
|
||||
if command -v systemctl >/dev/null && [ -d /run/systemd/system ]; then
|
||||
systemctl daemon-reload
|
||||
if [ "$UPDATE_ONLY" -eq 1 ]; then
|
||||
systemctl restart telegraf
|
||||
else
|
||||
systemctl enable --now telegraf >/dev/null
|
||||
systemctl restart telegraf
|
||||
fi
|
||||
sleep 3
|
||||
if ! systemctl is-active --quiet telegraf; then
|
||||
journalctl -u telegraf -n 20 --no-pager
|
||||
@@ -385,6 +525,159 @@ fi
|
||||
PROM_BASE="$(printf '%s' "$PROM_URL" | sed -E 's#/api/v1/write/?$##')"
|
||||
[ "$GPU" != "none" ] && log "GPU=$GPU erfasst. Hinweis: im Docker-Betrieb muss der GPU-Treiber im Container verfuegbar sein (nvidia-container-toolkit bzw. /dev/dri-Mount); im systemd-Betrieb ist das automatisch der Fall."
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Versionsmarker fuer den Auto-Updater
|
||||
# --------------------------------------------------------------------------
|
||||
REMOTE_V="$(curl -fsS -m 15 "$REPO_RAW/VERSION" 2>/dev/null | tr -d ' \r\n' || true)"
|
||||
printf '%s\n' "${REMOTE_V:-unbekannt}" > /etc/telegraf/CONFIG_VERSION
|
||||
# Aktive Repo-Quelle festhalten, damit der Auto-Updater denselben Weg nutzt.
|
||||
printf '%s\n' "$REPO_RAW" > /etc/telegraf/REPO_RAW
|
||||
# Hash der Installer-Logik: erkennt auch Aenderungen ohne Versionssprung
|
||||
# (z.B. eine Korrektur an journal-tail.sh).
|
||||
if curl -fsS -m 20 "$REPO_RAW/install.sh" -o /tmp/.tg-installer.sha 2>/dev/null; then
|
||||
if command -v sha256sum >/dev/null; then sha256sum /tmp/.tg-installer.sha | cut -d' ' -f1 > /etc/telegraf/INSTALLER_SHA
|
||||
elif command -v shasum >/dev/null; then shasum -a 256 /tmp/.tg-installer.sha | cut -d' ' -f1 > /etc/telegraf/INSTALLER_SHA
|
||||
fi
|
||||
rm -f /tmp/.tg-installer.sha
|
||||
fi
|
||||
chmod 0644 /etc/telegraf/CONFIG_VERSION /etc/telegraf/INSTALLER_SHA 2>/dev/null || true
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Auto-Updater-Timer
|
||||
# --------------------------------------------------------------------------
|
||||
install_update_timer() {
|
||||
IV="${1:-daily}"
|
||||
case "$IV" in
|
||||
daily) ONCAL="*-*-* 04:30:00" ;;
|
||||
hourly) ONCAL="*-*-* *:30:00" ;;
|
||||
weekly) ONCAL="Mon *-*-* 04:30:00" ;;
|
||||
*min) ONCAL="" ;; # OnUnitActiveSec statt OnCalendar
|
||||
*) ONCAL="*-*-* 04:30:00" ;;
|
||||
esac
|
||||
# Der Updater holt sich das Script frisch und ruft sich selbst mit
|
||||
# --update-only auf. Token kommt aus /etc/default/telegraf (nicht im Repo).
|
||||
cat > /usr/local/bin/telegraf-installer-update <<'UPD'
|
||||
#!/bin/sh
|
||||
# Auto-Updater: nur bei echter Aenderung etwas tun.
|
||||
set -u
|
||||
# Repo-Quelle: aus der Umgebung, sonst aus der beim Install hinterlegten
|
||||
# Datei, sonst Default. So funktioniert der Updater auch mit Mirror/Testserver.
|
||||
REPO_RAW="${REPO_RAW:-$(cat /etc/telegraf/REPO_RAW 2>/dev/null || echo https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main)}"
|
||||
LOG="/var/log/telegraf-installer-update.log"
|
||||
say() { printf '%s %s\n' "$(date -Is)" "$*" >> "$LOG"; }
|
||||
|
||||
LOCAL_V="$(cat /etc/telegraf/CONFIG_VERSION 2>/dev/null || echo '')"
|
||||
REMOTE_V="$(curl -fsS -m 20 "$REPO_RAW/VERSION" 2>/dev/null | tr -d ' \r\n' || true)"
|
||||
[ -n "$REMOTE_V" ] || { say "Repo nicht erreichbar (NetBird down?) — kein Update."; exit 0; }
|
||||
|
||||
NEED=0
|
||||
[ "$LOCAL_V" != "$REMOTE_V" ] && NEED=1
|
||||
|
||||
# Hash-Vergleich: erkennt Script-Fixes ohne Versionssprung
|
||||
if [ "$NEED" -eq 0 ] && command -v sha256sum >/dev/null; then
|
||||
TMP="$(mktemp)"; curl -fsS -m 25 "$REPO_RAW/install.sh" -o "$TMP" 2>/dev/null || true
|
||||
if [ -s "$TMP" ]; then
|
||||
R_SHA="$(sha256sum "$TMP" | cut -d' ' -f1)"
|
||||
L_SHA="$(cat /etc/telegraf/INSTALLER_SHA 2>/dev/null || echo '')"
|
||||
[ "$R_SHA" != "$L_SHA" ] && NEED=1
|
||||
fi
|
||||
rm -f "$TMP"
|
||||
fi
|
||||
|
||||
if [ "$NEED" -eq 0 ]; then
|
||||
say "aktuell ($LOCAL_V) — nichts zu tun."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
say "Update $LOCAL_V -> $REMOTE_V"
|
||||
TMPI="$(mktemp)"
|
||||
if ! curl -fsS -m 60 "$REPO_RAW/install.sh" -o "$TMPI" 2>/dev/null; then
|
||||
say "Download fehlgeschlagen."; rm -f "$TMPI"; exit 1
|
||||
fi
|
||||
# --update-only: nur Confs/Scripts, kein Paket, kein Tokenwechsel.
|
||||
# WICHTIG: REPO_RAW und die Node-Identitaet muessen mitgegeben werden, sonst
|
||||
# faellt NODE_NAME auf den Hostnamen der AUFRUFENDEN Maschine zurueck und der
|
||||
# Unterlauf holt die Version von der falschen Quelle.
|
||||
UPD_NAME="$(sed -n 's/^NODE_NAME=//p' /etc/default/telegraf 2>/dev/null | head -1)"
|
||||
UPD_ROLE="$(sed -n 's/^ROLE=//p' /etc/default/telegraf 2>/dev/null | head -1)"
|
||||
UPD_TOKEN="$(sed -n 's/^TELEGRAF_TOKEN=//p' /etc/default/telegraf 2>/dev/null | head -1)"
|
||||
UPD_COLL="$(sed -n 's/^COLLECTOR=//p' /etc/default/telegraf 2>/dev/null | head -1)"
|
||||
[ -n "$UPD_NAME" ] || UPD_NAME="$(hostname -s)"
|
||||
set -- --update-only --name "$UPD_NAME" --token "$UPD_TOKEN"
|
||||
[ -n "$UPD_ROLE" ] && set -- "$@" --role "$UPD_ROLE"
|
||||
[ -n "$UPD_COLL" ] && set -- "$@" --collector "$UPD_COLL"
|
||||
if REPO_RAW="$REPO_RAW" sh "$TMPI" "$@" >> "$LOG" 2>&1; then
|
||||
say "Update erfolgreich."
|
||||
else
|
||||
say "Update FEHLGESCHLAGEN — siehe oben. Alte Konfiguration bleibt aktiv."
|
||||
fi
|
||||
rm -f "$TMPI"
|
||||
UPD
|
||||
chmod 0755 /usr/local/bin/telegraf-installer-update
|
||||
|
||||
if [ -d /etc/systemd/system ]; then
|
||||
cat > /etc/systemd/system/telegraf-installer-update.service <<'EOF'
|
||||
[Unit]
|
||||
Description=Telegraf-Installer Auto-Update (nur bei Aenderung)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/telegraf-installer-update
|
||||
EOF
|
||||
if [ -n "$ONCAL" ]; then
|
||||
cat > /etc/systemd/system/telegraf-installer-update.timer <<EOF
|
||||
[Unit]
|
||||
Description=Taeglicher Telegraf-Installer Auto-Update
|
||||
|
||||
[Timer]
|
||||
OnCalendar=$ONCAL
|
||||
Persistent=true
|
||||
RandomizedDelaySec=15m
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
EOF
|
||||
else
|
||||
cat > /etc/systemd/system/telegraf-installer-update.timer <<EOF
|
||||
[Unit]
|
||||
Description=Telegraf-Installer Auto-Update ($IV)
|
||||
|
||||
[Timer]
|
||||
OnBootSec=$IV
|
||||
OnUnitActiveSec=$IV
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
EOF
|
||||
fi
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now telegraf-installer-update.timer >/dev/null 2>&1 \
|
||||
&& log "Auto-Updater aktiv ($IV) — Log: /var/log/telegraf-installer-update.log" \
|
||||
|| log "WARNUNG: Timer konnte nicht aktiviert werden (systemd nicht aktiv?)."
|
||||
else
|
||||
log "HINWEIS: kein systemd — Auto-Updater nur manuell (telegraf-installer-update)."
|
||||
fi
|
||||
}
|
||||
|
||||
remove_update_timer() {
|
||||
command -v systemctl >/dev/null 2>&1 || { log "Auto-Updater: systemctl fehlt — Dateien werden entfernt."; rm -f /etc/systemd/system/telegraf-installer-update.timer /etc/systemd/system/telegraf-installer-update.service /usr/local/bin/telegraf-installer-update; return 0; }
|
||||
systemctl disable --now telegraf-installer-update.timer >/dev/null 2>&1 || true
|
||||
rm -f /etc/systemd/system/telegraf-installer-update.timer \
|
||||
/etc/systemd/system/telegraf-installer-update.service \
|
||||
/usr/local/bin/telegraf-installer-update
|
||||
systemctl daemon-reload 2>/dev/null || true
|
||||
log "Auto-Updater entfernt."
|
||||
}
|
||||
|
||||
if [ "$REMOVE_TIMER" -eq 1 ]; then
|
||||
if command -v systemctl >/dev/null 2>&1; then remove_update_timer
|
||||
else log "Auto-Updater: kein systemd — nichts zu entfernen."; fi
|
||||
fi
|
||||
if [ -n "$TIMER_INTERVAL" ]; then install_update_timer "$TIMER_INTERVAL"; fi
|
||||
|
||||
log "OK — Node '$NODE_NAME' liefert an $PROM_URL (Metriken) und $LOKI_URL (Logs)."
|
||||
log "Prüfen: curl -s -H 'Authorization: Bearer <TOKEN>' '$PROM_BASE/api/v1/query?query=system_uptime{node=\"$NODE_NAME\"}'"
|
||||
log "Grafana: http://100.83.134.46:3000 (nur im NetBird)"
|
||||
Reference in new issue
Block a user