feat(satellite): FritzBox komplett steuern — describe/call/wlan ueber TR-064
Statt einzelner fest programmierter Befehle nutzt der Satellit die
Selbstbeschreibung der Box (tr64desc.xml + SCPD je Dienst, ohne Anmeldung
lesbar): was DIESE Firmware kann, steht dort — keine Tabellen pro Modell.
- fritzbox.describe: alle TR-064-Aktionen der Box, je mit [liest]/
[aendert]/[GEFAEHRLICH]; filter grenzt ein (WLAN, Dect, Hosts …).
- fritzbox.call: beliebige Aktion (service kurz "WLANConfiguration:3",
args ohne "New"-Praefix moeglich). Alles ausser Get… braucht
confirmed=true, sonst needs_confirmation — ARIA muss vorher fragen.
- fritzbox.wlan: alle WLANs inkl. Gast (index/ssid/an), schalten mit
index + enable (+ confirmed).
- FritzBox per Geraetename ("Fritzbox Keller") statt IP ansprechbar.
- Allowlist kennt Platzhalter "fritzbox.*" (Default + .env.example).
- Brain: Tool-Beschreibung mit Ablauf (describe → call) und Freigabe-Regel,
fritzbox.* mit 60 s Timeout.
Getestet gegen eine nachgebaute TR-064-Box: describe/filter, lesen,
schreiben ohne/mit Freigabe (ohne kommt nichts an der Box an), WLAN
schalten, Namensaufloesung, Allowlist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+15
-2
@@ -1295,7 +1295,19 @@ META_TOOLS = [
|
||||
"— Internetverbindung/Datenrate/externe IP bzw. verbundene Geraete MIT "
|
||||
"Verbindungsart (LAN/WLAN), lan_port (an welcher LAN-Buchse der Box) und "
|
||||
"speed_mbit; 'find' filtert nach Name/IP/MAC (braucht "
|
||||
"hinterlegten FritzBox-Login). 'ssh.exec' (params={'ip':'...','cmd':'...'}) "
|
||||
"hinterlegten FritzBox-Login). FRITZ!BOX VOLLSTAENDIG STEUERN: "
|
||||
"'fritzbox.describe' (params={'ip':'<box oder Name>','filter':'WLAN'}) listet, "
|
||||
"was DIESE Box per TR-064 kann (je Aktion [liest]/[aendert]/[GEFAEHRLICH]); "
|
||||
"'fritzbox.call' (params={'ip':..,'service':'WLANConfiguration:3',"
|
||||
"'action':'GetInfo','args':{...}}) ruft jede davon auf; 'fritzbox.wlan' "
|
||||
"zeigt alle WLANs inkl. Gast (index, ssid, an) und schaltet sie "
|
||||
"(index + enable). Unbekannte Funktion (WPS, DECT, Anrufliste, Internet "
|
||||
"sperren …)? Erst describe mit passendem filter, dann call. REGEL: Alles "
|
||||
"was AENDERT (Set…, WPS, Neustart …) braucht confirmed=true — und das "
|
||||
"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':'...'}) "
|
||||
"— 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 "
|
||||
@@ -3233,7 +3245,8 @@ class Agent:
|
||||
# adb.*: Warten auf die Geraete-Autorisierung (bis 90s) + Download +
|
||||
# Installation koennen zusammen mehrere Minuten dauern.
|
||||
sat_timeout = (320.0 if action.startswith("adb.")
|
||||
else 200.0 if action == "ssh.exec" else 20.0)
|
||||
else 200.0 if action == "ssh.exec"
|
||||
else 60.0 if action.startswith("fritzbox.") else 20.0)
|
||||
result = _post("/internal/satellite", {
|
||||
"op": "command", "satellite": sat,
|
||||
"device": arguments.get("device") or "", "action": action, "params": params,
|
||||
|
||||
Reference in New Issue
Block a user