feat(satellite): FritzBox-Bestaetigung per Taste (2 min) + Sicherung in den Chat
Der Export der Einstellungen scheiterte mit "HTTP 500" — dahinter steckt UPnP-Fehler 866: die Box will die Aktion zusaetzlich am Geraet bestaetigt. - _tr064 meldet jetzt den UPnP-Fehlercode statt nur "HTTP 500". - 866 → ohne button_wait sofort zurueck mit needs_button (ARIA fragt Stefan, ob er an der Box steht). Mit button_wait=true: X_AVM-DE_Auth SetConfig (start), GetState alle 2 s bis FB_BUTTON_WAIT_SEC (120 s); "authenticated" → Aktion erneut, sonst Timeout "Taste nicht gedrueckt, nichts ausgefuehrt" (Bestaetigung wird gestoppt). - fritzbox.backup: X_AVM-DE_GetConfigFile mit Kennwort (Standard: Login- Kennwort), Download mit Digest-Auth, Kopie auf dem Satelliten (die letzten 10 je Box) und Datei zurueck an ARIA. - Brain: Datei aus dem Ergebnis landet in /shared/uploads/, ARIA legt sie mit [FILE: …] in den Chat; Timeout 200 s bei button_wait; Beschreibung erklaert den Tasten-Ablauf. Getestet gegen nachgebaute Box: ohne Bestaetigung → needs_button, Taste nach 3 s → Sicherung geladen, keine Taste → Timeout. Gegen eine echte Box (X_AVM-DE_Auth-Ablauf) noch nicht. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+22
-1
@@ -1307,7 +1307,15 @@ META_TOOLS = [
|
||||
"setzt Du NUR, nachdem Du Stefan gesagt hast, was genau passiert, und er "
|
||||
"ausdruecklich ja gesagt hat. Ohne confirmed kommt needs_confirmation "
|
||||
"zurueck: dann fragen, nicht raten. [GEFAEHRLICH] (Neustart, "
|
||||
"Werkseinstellung, Portfreigabe, Passwort) besonders deutlich ankuendigen. 'ssh.exec' (params={'ip':'...','cmd':'...'}) "
|
||||
"Werkseinstellung, Portfreigabe, Passwort) besonders deutlich ankuendigen. "
|
||||
"TASTE AN DER BOX: Manche Aktionen (z.B. Sicherung) muss man an der Box "
|
||||
"bestaetigen — dann kommt 'muss an der FritzBox bestaetigt werden'. Frag "
|
||||
"Stefan, ob er an der Box steht; nach seinem Ja erneut mit button_wait=true "
|
||||
"aufrufen, dann hat er 2 Minuten fuer einen Tastendruck (sonst Timeout, "
|
||||
"nichts passiert — einfach nachfragen und neu versuchen). 'fritzbox.backup' "
|
||||
"(params={'ip':..,'password':'<Kennwort der Sicherung>','button_wait':true}) "
|
||||
"sichert die Einstellungen; die Datei liegt danach unter /shared/uploads/ "
|
||||
"und kommt mit [FILE: <pfad>] in den Chat. 'ssh.exec' (params={'ip':'...','cmd':'...'}) "
|
||||
"— fuehrt EIN Shell-Kommando per SSH auf einem Geraet aus (Server, Pi, NAS) "
|
||||
"und gibt exit_code + stdout (gefenstert: contains/offset/max_chars) + "
|
||||
"stderr zurueck; braucht hinterlegte SSH-Credentials (Benutzer + Passwort "
|
||||
@@ -3246,6 +3254,8 @@ class Agent:
|
||||
# Installation koennen zusammen mehrere Minuten dauern.
|
||||
sat_timeout = (320.0 if action.startswith("adb.")
|
||||
else 200.0 if action == "ssh.exec"
|
||||
# button_wait: bis 2 min auf die Taste an der FritzBox
|
||||
else 200.0 if action.startswith("fritzbox.") and params.get("button_wait")
|
||||
else 60.0 if action.startswith("fritzbox.") else 20.0)
|
||||
result = _post("/internal/satellite", {
|
||||
"op": "command", "satellite": sat,
|
||||
@@ -3254,7 +3264,18 @@ class Agent:
|
||||
}, sat_timeout + 20)
|
||||
if result.get("ok"):
|
||||
r = result.get("result")
|
||||
if isinstance(r, dict) and r.get("file_b64"):
|
||||
# Datei vom Satelliten (z.B. FritzBox-Sicherung) → /shared/uploads/
|
||||
import base64
|
||||
fname = re.sub(r"[^A-Za-z0-9._-]", "_", str(r.get("filename") or "satellit_datei"))
|
||||
path = f"/shared/uploads/sat_{int(time.time())}_{fname}"
|
||||
with open(path, "wb") as fh:
|
||||
fh.write(base64.b64decode(r.pop("file_b64")))
|
||||
r["im_chat_ablegbar"] = path
|
||||
r["hinweis_chat"] = f"In den Chat legen mit [FILE: {path}]"
|
||||
return f"OK — {r}" if r else "OK — Aktion ausgefuehrt."
|
||||
if result.get("needs_button") or result.get("needs_confirmation") or result.get("timeout"):
|
||||
return f"FEHLER: {result.get('error')}"
|
||||
return f"FEHLER: {result.get('error') or 'Aktion fehlgeschlagen'}"
|
||||
except Exception as exc:
|
||||
return f"FEHLER: Satellit/Bridge nicht erreichbar: {exc}"
|
||||
|
||||
Reference in New Issue
Block a user