Initial: Mesh-Skills, Configs, Scripts
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
---
|
||||
name: hermes-fleet-maintenance
|
||||
description: "Update/maintain Hermes agents in the mesh (weekly sync)."
|
||||
version: 1.0.0
|
||||
author: Hermes Agent
|
||||
platforms: [linux]
|
||||
related_skills: [multi-agent-mesh, hermes-agent]
|
||||
---
|
||||
|
||||
# Hermes-Fleet-Maintenance
|
||||
|
||||
Wöchentliche bzw. bei Bedarf ad-hoc Wartung ALLER Hermes-Agenten im Mesh (VPS/Master + Unraid + Switch + Laptop) auf denselben Stand bringen. Ergänzt `multi-agent-mesh` (Orchestrierung) um den konkreten **Update-Ablauf und den Cadence-Entscheid**.
|
||||
|
||||
## Entscheid (NUTZERWUNSCH 2026-08-06)
|
||||
|
||||
- **Wöchentlich** (Montag) alle Agenten synchron updaten — NICHT täglich (Overhead 7×, kein Gewinn).
|
||||
- 🔥 **Sicherheits-Hotfixes** (SSH, Auth, Keys, ZeroTier) SOFORT ziehen, keine Wochen-Frist.
|
||||
- Vor dem Durchziehen Changelog kurz auf **Breaking-Changes** prüfen.
|
||||
- Sync-Rhythmus hält das Mesh kompatibel (keine Versions-Drift zwischen Agenten).
|
||||
- Agenten updaten **nur** auf Anweisung des Masters (passt zu multi-agent-mesh Update-Kontrollpolitik).
|
||||
|
||||
## Ablauf: Versions-Check + Update
|
||||
|
||||
### 1. Ist-Stand erfassen
|
||||
Alle vier parallel abfragen (pro Agent tauschen IP/Name):
|
||||
|
||||
```bash
|
||||
# Master lokal:
|
||||
hermes --version | head -1
|
||||
# Remotes (Passwort-Auth — Key-Auth ist im Mesh NICHT eingerichtet):
|
||||
sshpass -p 'PW' ssh -o ConnectTimeout=8 -o StrictHostKeyChecking=no mehlzoerwer@<ZT-IP> \
|
||||
'~/.local/bin/hermes --version 2>/dev/null | head -1; ~/.local/bin/hermes update --check 2>&1 | tail -2'
|
||||
```
|
||||
|
||||
Notizen:
|
||||
- Hermes liegt auf ALLEN Remotes unter `~/.local/bin/hermes` (nicht `/usr/local/bin`).
|
||||
- `hermes update --check` antwortet `⚕ Update available` oder `✓ Already up to date`.
|
||||
- **Key-Auth (BatchMode) schlägt fehl → `Permission denied (publickey,password)`.** Immer Passwort via `sshpass` nutzen (Passwort ist im Mesh einheitlich).
|
||||
|
||||
### 2. Update durchziehen (parallel, `--yes`)
|
||||
`--yes` überspringt interaktive Prompts (Config-Migration/Stash) — nötig für non-interaktives SSH.
|
||||
|
||||
```bash
|
||||
# Master lokal:
|
||||
hermes update --yes 2>&1 | tail -15
|
||||
# Je Remote:
|
||||
timeout 240 sshpass -p 'PW' ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no mehlzoerwer@<ZT-IP> \
|
||||
'~/.local/bin/hermes update --yes 2>&1' 2>&1 | grep -vi warning | tail -8
|
||||
```
|
||||
|
||||
Erfolgsmarker: `✓ Update complete!` und `✓ Configuration is up to date`. (3 Hosts parallel + Master = ~30-60s.)
|
||||
|
||||
### 3. Verifizieren
|
||||
`hermes --version` auf allen 4 erneut — Ziel: identische Version (z.B. `v0.20.0`). Differenz = Versions-Drift → nachziehen.
|
||||
|
||||
## Automatisierung: Wochen-Watchdog (no_agent + Telegram)
|
||||
|
||||
Bewährtes Muster für den Montags-Rhythmus: **ein re-runnable Script** + **`no_agent`-Cron** (kein LLM-Tokenverbrauch), das sich nur meldet wenn etwas zu tun/melden war.
|
||||
|
||||
- Script im Repo: `scripts/update_fleet.sh` (fertiges Vorlage-Script — Werte: IPs, `PW`, Pfad anpassen).
|
||||
- Cron: `no_agent=true` (Script-STDOUT = Nachricht), `deliver=telegram`, z.B. `0 6 * * 1`.
|
||||
- **Silent-Watchdog-Semantik:** leeres STDOUT = still (nichts senden); nicht-leer = Nachricht an Nutzer.
|
||||
|
||||
## ⚠️ Fallstricke
|
||||
|
||||
- **Cron `script`-Pfad MUSS relativ zu `~/.hermes/scripts/` sein** — nur den Dateinamen angeben (`update_fleet.sh`), nicht `/root/.hermes/scripts/...` → sonst Fehler `Script path must be relative to ~/.hermes/scripts/`. Script dort ablegen + `chmod +x`.
|
||||
- Cron **immer erst manuell testen** (`/root/.hermes/scripts/update_fleet.sh`) bevor man ihn plant.
|
||||
- `hermes update` **killt laufende Agenten/Gateway** — nicht mitten in kritischer Arbeit auf dem Ziel-Host ziehen.
|
||||
- Ausgabe mit `grep -vi warning` bereinigen — sshpass-Meldungen (Warnung vor Passwort auf Kommandozeile) sind Lärm.
|
||||
- `timeout` vorbehalten, falls ein Remote hängt — verhindert dass ein Host den ganzen Batch blockiert.
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# Woechentliches Mesh-Hermes-Update: alle Agenten synchron updaten + verifizieren.
|
||||
# no_agent cron watchdog: stdout = Nachricht an Nutzer; leere Ausgabe = still.
|
||||
# ANPASSEN: PW, hosts[] (IP:Name), MASTER_HERMES/REMOTE_HERMES Pfade.
|
||||
set -u
|
||||
|
||||
SSHPASS='PW' # <<< Mesh-einheitliches Passwort eintragen
|
||||
SSH=(sshpass -p "$SSHPASS" ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no)
|
||||
MASTER_HERMES=/root/.local/bin/hermes
|
||||
REMOTE_HERMES='~/.local/bin/hermes'
|
||||
|
||||
hosts=(172.24.34.142:UnraidHermes 172.24.20.26:SwitchHermes 172.24.178.202:LaptopHermes)
|
||||
|
||||
report=""
|
||||
status_ok=1
|
||||
|
||||
# --- Master (lokal) ---
|
||||
if [ -x "$MASTER_HERMES" ]; then
|
||||
mver_before=$("$MASTER_HERMES" --version 2>/dev/null | head -1)
|
||||
"$MASTER_HERMES" update --yes >/tmp/hermes_upd_master.log 2>&1
|
||||
mver_after=$("$MASTER_HERMES" --version 2>/dev/null | head -1)
|
||||
report+="Master: ${mver_before##*v} -> ${mver_after##*v}\n"
|
||||
[ "$mver_before" != "$mver_after" ] || report+=" (kein Update noetig)\n"
|
||||
else
|
||||
report+="Master: hermes nicht gefunden\n"; status_ok=0
|
||||
fi
|
||||
|
||||
# --- Sub-Agenten (per SSH) ---
|
||||
for entry in "${hosts[@]}"; do
|
||||
ip="${entry%%:*}"; name="${entry##*:}"
|
||||
out=$("${SSH[@]}" "mehlzoerwer@$ip" \
|
||||
"$REMOTE_HERMES update --yes 2>&1 | tail -1; $REMOTE_HERMES --version 2>/dev/null | head -1" 2>/dev/null)
|
||||
if [ -n "$out" ]; then
|
||||
ver=$(echo "$out" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
||||
report+="$name: $ver\n"
|
||||
else
|
||||
report+="$name: KEINE VERBINDUNG / FEHLER\n"; status_ok=0
|
||||
fi
|
||||
done
|
||||
|
||||
report="Hermes-Mesh Update ($(date '+%d.%m. %H:%M')):\n$report"
|
||||
[ $status_ok -eq 1 ] && report+="Status: alle ok" || report+="Status: PROBLEM - bitte pruefen!"
|
||||
|
||||
printf '%b' "$report"
|
||||
Reference in New Issue
Block a user