Hermes-Terminal same-origin + Passwort-Login; Engine/OS-Update-Fixes

Terminals (wie die Box-Konsole):
- hermes-terminal bindet jetzt NUR Loopback (--interface lo --base-path /hermes-terminal)
  und wird von MC2 same-origin durchgereicht (routers/console.py generalisiert auf beide
  ttyd-Instanzen). Kein eigener Firewall-Port mehr noetig.
- Beide Terminals starten die Shell/CLI ueber `su - hitonabi` → fragen beim Oeffnen das
  Box-Passwort ab (PAM gegen das echte Konto, nichts gespeichert). „Login mit sudo-PW".
- agent_status.terminal_url = /hermes-terminal/ (+ reachable via Loopback-Check).

Engine-Update (llama.cpp) — Fix „nicht moeglich":
- update-engine.sh/update-swap.sh sind per sudoers NOPASSWD freigegeben → das fruehere
  `sudo true`-Passwort-Gate hat sie faelschlich blockiert (wenn kein/falsches Box-PW). Gate
  entfernt → Engine-/Router-Update laufen jetzt passwortlos.

OS-Update (apt) — Fix „nicht moeglich":
- DEBIAN_FRONTEND wird jetzt INNERHALB `sudo bash -c '…'` gesetzt statt `sudo VAR=… cmd`
  (sonst lehnt sudos env-Policy die Variable ab und das Upgrade bricht ab).
- Frontend verschluckt password_required/incorrect_password nicht mehr still, sondern zeigt
  einen klaren Hinweis (Box-Passwort in „Box-Zugang" setzen/pruefen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-04 21:18:55 +02:00
parent 00fc7d6d81
commit eff23643e6
11 changed files with 215 additions and 185 deletions
+22 -3
View File
@@ -158,10 +158,29 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst
return false
}
// Passwort-Fehler NICHT mehr verschlucken: OS-Update braucht das Box-Passwort. Früher
// lief die Aktion bei fehlendem/falschem Passwort ins Leere („passiert nichts").
function handledSudo(res: any): boolean {
if (res?.status === "password_required" || res?.status === "incorrect_password") {
showAlert(
"Box-Passwort nötig",
res.status === "incorrect_password"
? "Das gespeicherte Box-Passwort stimmt nicht. Bitte in der Konsole unter „Box-Zugang“ korrigieren (oder hier in den Einstellungen)."
: "Für dieses Update braucht die Box dein Passwort. Bitte in der Konsole unter „Box-Zugang“ setzen (oder hier in den Einstellungen).",
)
return true
}
if (res && res.ok === false) {
showAlert("Update fehlgeschlagen", res.err || "Unbekannter Fehler.")
return true
}
return false
}
async function triggerOsUpdate() {
try {
const res = await api<any>("/api/maintenance/os-update", { method: "POST" })
if (handledBusy(res)) return
if (handledBusy(res) || handledSudo(res)) return
loadJobs()
setActiveTab("maintenance")
} catch (e: any) {
@@ -172,7 +191,7 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst
async function triggerEngineUpdate() {
try {
const res = await api<any>("/api/maintenance/engine-update", { method: "POST" })
if (handledBusy(res)) return
if (handledBusy(res) || handledSudo(res)) return
loadJobs()
setActiveTab("maintenance")
} catch (e: any) {
@@ -183,7 +202,7 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst
async function triggerSwapUpdate() {
try {
const res = await api<any>("/api/maintenance/swap-update", { method: "POST" })
if (handledBusy(res)) return
if (handledBusy(res) || handledSudo(res)) return
loadJobs()
setActiveTab("maintenance")
} catch (e: any) {