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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -7,7 +7,7 @@
<link rel="manifest" href="/manifest.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Mission Control 2.0</title>
<script type="module" crossorigin src="/assets/index-DQC1USWi.js"></script>
<script type="module" crossorigin src="/assets/index-DZk0tw7D.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DfNbRJ2k.css">
</head>
<body>
+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) {
+2 -1
View File
@@ -12,8 +12,9 @@ export default defineConfig({
proxy: {
// Dev: /api → FastAPI-Backend (Override via MC_API_TARGET, z.B. die Box)
"/api": { target: process.env.MC_API_TARGET || "http://127.0.0.1:9000", changeOrigin: true },
// Box-Konsole (ttyd) läuft same-origin über den MC2-Reverse-Proxy (/console/ + /console/ws).
// Web-Terminals (ttyd) laufen same-origin über den MC2-Reverse-Proxy (/<name>/ + /<name>/ws).
"/console": { target: process.env.MC_API_TARGET || "http://127.0.0.1:9000", changeOrigin: true, ws: true },
"/hermes-terminal": { target: process.env.MC_API_TARGET || "http://127.0.0.1:9000", changeOrigin: true, ws: true },
},
},
build: { outDir: "dist" },