Feat: Auto-Rollback bei Engine-/Router-Update wenn Stack-Check fehlschlaegt

update-engine.sh / update-swap.sh sichern jetzt den alten Build/die alte Binary
VOR dem Ueberschreiben (.bak), verifizieren nach dem Restart per stack-postcheck.sh
und rollen bei Fehler automatisch zurueck (Binary/Dir wiederherstellen + restart +
erneut pruefen). Exit-Codes: 0 = neuer Build verifiziert, 1 = fehlgeschlagen aber
Rollback ok (alter Stand laeuft wieder), 2 = Update UND Rollback kaputt.

Da die Skripte den Postcheck nun selbst fahren (um reagieren zu koennen), entfaellt
das `&& stack-postcheck` in engine/swap-update-job. OS-Update behaelt den reinen
Detect-Check (apt-Downgrade waere unsicher). Backups sind winzig (Engine 86M,
Swap 14M) bei 1.6TB frei.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-28 11:34:41 +02:00
parent 9923743219
commit 4ee016d3a7
3 changed files with 81 additions and 16 deletions
+8 -8
View File
@@ -495,10 +495,10 @@ def engine_update_job(sudo_password: str | None = None) -> dict | None:
def on_done():
_engine_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Build-Vergleich
# update-engine.sh läuft via sudo als root und startet llama-swap am Ende selbst neu.
# Danach Stack-Funktionsprüfung (echte Inferenz) → Job wird rot, wenn der neue Build kaputt ist.
cmd = f"{ENGINE_UPDATE_CMD} && bash {STACK_POSTCHECK}"
job_id = jobengine.start_job(["bash", "-c", cmd],
# update-engine.sh sichert den alten Build, aktualisiert, startet llama-swap neu, prüft den
# Stack (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifiziertem
# neuen Build → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge.
job_id = jobengine.start_job(["bash", "-c", ENGINE_UPDATE_CMD],
"Engine-Update (llama.cpp Vulkan)",
on_done=on_done, sudo_password=sudo_password)
return {"ok": True, "job_id": job_id}
@@ -513,10 +513,10 @@ def swap_update_job(sudo_password: str | None = None) -> dict | None:
def on_done():
_swap_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Versions-Vergleich
# update-swap.sh läuft via sudo als root, ersetzt die Binary und startet llama-swap neu.
# Danach Stack-Funktionsprüfung (echte Inferenz) → Job wird rot, wenn der Router kaputt ist.
cmd = f"{SWAP_UPDATE_CMD} && bash {STACK_POSTCHECK}"
job_id = jobengine.start_job(["bash", "-c", cmd],
# update-swap.sh sichert die alte Binary, aktualisiert, startet llama-swap neu, prüft den Stack
# (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifizierter neuer
# Version → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge.
job_id = jobengine.start_job(["bash", "-c", SWAP_UPDATE_CMD],
"Router-Update (llama-swap)",
on_done=on_done, sudo_password=sudo_password)
return {"ok": True, "job_id": job_id}