Files
ARIA-AGENT/satellite/.env.example
T
duffyduckandClaude Opus 5.5 2bfa064ef6 feat: FritzBox-Sicherungen verwalten — Liste, Ansicht, Wiederherstellen, Loeschen
Satellit:
- sat_command laeuft als eigener Task (eine Aktion, die 2 min auf die
  Taste wartet, blockiert den Satelliten nicht mehr).
- Sicherung bekommt eine Begleitdatei (Box, Modell, Firmware, Seriennr.,
  Datum, QUELLE des Kennworts — nie der Wert).
- fritzbox.backups: Sicherungen je Box, neueste zuerst.
- fritzbox.backup_view: lesbar — Kopfdaten, wichtigste Einstellungen
  (Name, LAN/DHCP, WLAN, Kanal, DNS, SIP …), mit full alle Bereiche;
  verschluesselte Werte als «verschluesselt»; nur Dateien aus dem
  Sicherungsordner (kein Pfad von aussen).
- fritzbox.restore: X_AVM-DE_SetConfigFile — der Satellit stellt die Datei
  kurz per HTTP bereit (Zufallspfad, endet nach Abruf/10 min), die Box holt
  sie ab und startet neu. Nur mit confirmed, Taste per button_wait, mit dem
  Kennwort aus der Quelle der Sicherung; fremde Box nur mit other_box.
- fritzbox.backup_delete (mit confirmed). no_file fuer das Diagnostic.

Diagnostic: 💾 bei FritzBox-Geraeten → Sicherungen: Jetzt sichern,
ℹ (lesbar + Suche), Wiederherstellen, Loeschen; Sichern/Wiederherstellen
mit 2-Minuten-Countdown fuer die Taste, Ergebnis im Fenster (✓ / Taste
nicht gedrueckt / Grund), Erfolg blendet sich aus.

Brain: Beschreibung fuer Liste/Ansicht/Wiederherstellen/Loeschen.

Getestet: Satellit gegen nachgebaute Box (Sichern, Liste, Ansicht ohne
Geheimnisse, Pfadschutz, Wiederherstellen inkl. Abholen der Datei,
Loeschen), Diagnostic-Fenster in headless Chromium mit simuliertem
Satelliten. Gegen eine echte Box noch nicht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:52:04 +01:00

131 lines
8.1 KiB
Bash

# ─── ARIA Satellit — Konfiguration ──────────────────────────────────
# Kopiere diese Datei nach .env und passe sie an.
# RVS-Zugang (identisch zum Haupt-Stack — gleicher Raum/Token, damit ARIA
# diesen Satelliten erreicht). Werte aus der Haupt-.env / vom generate-token.sh.
RVS_HOST=rvs.example.de
RVS_PORT=443
RVS_TLS=true
RVS_TLS_FALLBACK=true # bei TLS-Fehlschlag einmal auf ws:// zurueckfallen
RVS_TOKEN=
# RVS_SNI: nur noetig, wenn RVS_HOST eine IP ist (Satellit im selben Netz wie der
# RVS, direkt auf die interne IP). Dann hier den Zertifikats-/Hostnamen angeben,
# damit der TLS-Handshake (SNI) passt. Sonst leer lassen.
# RVS_HOST=10.0.0.2
# RVS_SNI=example.com
RVS_SNI=
# ─── Identitaet / Adresse dieses Satelliten ────────────────────────
# SATELLITE_ID = technisch eindeutig (a-z0-9-_), Default = Hostname-Slug.
# SATELLITE_LOCATION = menschlicher Name, so spricht ARIA das Netz an ("Buero").
# Mehrere Satelliten koennen im selben RVS-Raum haengen — die Location
# unterscheidet sie ("Buero", "Zuhause", "Werkstatt").
SATELLITE_ID=buero
SATELLITE_LOCATION=Büro
# ─── Steuerung (Sicherheit!) ───────────────────────────────────────
# CONTROL_ENABLED=false → reiner Info-/Beobachtungs-Satellit (entdeckt & meldet
# nur, steuert nichts). Sicherste Basis.
# CONTROL_ENABLED=true → darf Geraete steuern (nur Aktionen aus der Allowlist).
CONTROL_ENABLED=true
# Erlaubte Steuer-Aktionen (kommagetrennt). Alles andere wird abgelehnt.
# dial.launch App-Launch via DIAL (z.B. YouTube-Video auf Fire TV / Smart-TV)
# wol Wake-on-LAN (Geraet per MAC aufwecken)
# http.get generischer HTTP-GET (z.B. lokale IoT-Webhooks, Statusseiten)
# http.post generischer HTTP-POST
# snmp.get einzelner SNMP-Wert (params: ip, oid)
# snmp.walk SNMP-Teilbaum (params: ip, oid)
# snmp.printer Drucker-Fuellstaende (Tinte/Toner) aus der Printer-MIB (params: ip)
# snmp.ports Switch/Router-Interfaces: aktive/freie Ports (params: ip)
# snmp.info Modell/Seriennummer/Firmware-Version (params: ip)
# fritzbox.info FritzBox: Verbindung/Datenrate/externe IP (TR-064, braucht Login)
# fritzbox.hosts FritzBox: verbundene Geraete (TR-064, braucht Login)
# fritzbox.describe FritzBox: was DIESE Box kann (alle TR-064-Aktionen, ohne Login)
# fritzbox.call FritzBox: beliebige TR-064-Aktion; aendernde nur mit confirmed=true
# fritzbox.wlan FritzBox: alle WLANs (inkl. Gast) anzeigen / schalten
# fritzbox.backup / backups / backup_view / restore / backup_delete
# FritzBox: Einstellungen sichern (Taste an der Box, 2 min),
# auflisten, lesbar ansehen, wieder einspielen, loeschen.
# Sicherungen liegen unter FB_BACKUP_DIR (/data/fritzbox-backups).
# (fritzbox.* in der Liste erlaubt alle fritzbox-Aktionen)
# ssh.exec Kommando per SSH ausfuehren (params: ip, cmd; Auth aus Creds 'ssh')
# adb.install APK auf ein Android-Geraet/Fire TV ausrollen (params: ip, url)
# adb.connect ADB-Verbindung aufbauen (params: ip)
# adb.devices verbundene ADB-Geraete auflisten
# adb.shell Shell-Kommando auf dem Android-Geraet (params: ip, cmd)
# adb.provision Agent FERN einrichten: RVS-Zugang uebergeben, statt ihn mit der
# Fernbedienung abzutippen (params: ip, rvs_host, rvs_token, ...)
# adb.status laeuft/installiert der Agent auf dem Geraet? (params: ip)
# adb.permissions Sonderrechte per ADB erteilen (Bildschirmaufnahme/Overlay/
# Mikro) — spart das Zusammenklicken mit der Fernbedienung
# ACHTUNG: Diese Liste ueberschreibt den Code-Default. Wird eine neue Aktion
# ergaenzt, MUSS sie hier nachgetragen werden — sonst lehnt der Satellit sie ab.
CONTROL_ALLOWLIST=dial.launch,wol,http.get,snmp.get,snmp.walk,snmp.printer,snmp.ports,snmp.info,fritzbox.*,ssh.exec,adb.devices,adb.connect,adb.install,adb.shell,adb.provision,adb.status,adb.permissions
# ─── ADB / Android-Rollout (optional) ──────────────────────────────
# Fire TV Sticks & Android-Geraete im LAN: APK ausrollen ohne Datei-Kopieren.
# Voraussetzung am Geraet: ADB-Debugging AN (Fire TV: Einstellungen > Mein Fire TV
# > Entwickleroptionen > ADB-Debugging) und den Dialog "USB-Debugging zulassen?"
# einmalig bestaetigen (Haken "Immer erlauben").
ADB_PORT=5555
ADB_TIMEOUT_SEC=180 # install dauert 30-60s, grosszuegig lassen
APK_CACHE_DIR=/data/apk # heruntergeladene APKs (1x laden, N Geraete)
# ─── Credential-Store (optional) ───────────────────────────────────
# Pro Geraet koennen im Diagnostic Zugangsdaten hinterlegt werden (SNMP-Community/
# v3, HTTP-Basic, FritzBox-Login). Der Satellit speichert sie VERSCHLUESSELT im
# Bind-Volume ./data. Der Schluessel wird beim ersten Start automatisch erzeugt
# (./data/creds.key) — oder hier fest vorgeben (Fernet-Key, base64):
# CREDS_KEY=
# ─── SNMP (optional) ───────────────────────────────────────────────
# Defaults fuer die snmp.*-Aktionen; pro Request per params ueberschreibbar.
SNMP_COMMUNITY=public # Drucker/Switches antworten meist auf 'public'
SNMP_VERSION=2c # 1 | 2c
SNMP_TIMEOUT_SEC=5
# Discovery-Anreicherung: jedes entdeckte Geraet wird beim Scan kurz per SNMP
# nach Name/Beschreibung/Standort/Uptime gefragt (Switches, Router, APs, NAS ...).
SNMP_DISCOVERY=true
SNMP_DISCOVERY_CONCURRENCY=16 # parallele SNMP-Abfragen pro Scan
SNMP_DISCOVERY_TIMEOUT=2 # Timeout je Geraet (s) — Nicht-SNMP-Hosts fallen schnell raus
# ─── HTTP (optional) ───────────────────────────────────────────────
HTTP_TIMEOUT_SEC=10 # Timeout fuer http.get/http.post
HTTP_MAX_CHARS=20000 # Default-Body-Ausschnitt (offset/max_chars pro Request)
# ─── Discovery-Tuning (optional) ───────────────────────────────────
SCAN_INTERVAL_SEC=300 # Hintergrund-Rescan-Intervall
DISCOVER_TIMEOUT_SEC=6 # Dauer eines Sweeps (mDNS + SSDP)
DEVICE_CACHE_TTL_SEC=120 # wie lange ein Inventar als "frisch" gilt
# ── Port-Tunnel ──────────────────────────────────────────────────────
# ARIA erreicht ueber den Satelliten einen beliebigen Port im LAN — z.B. ein
# FreeCAD-MCP auf einem Rechner oder eine Web-App, die nur hier lauscht. Die
# Bridge macht daraus einen lokalen Port (aria-bridge:19000...).
#
# DEFAULT AUS: das ist ein Weg in dein Netz, den schaltet man bewusst ein.
# Soll der Rechner, auf dem der Satellit laeuft, SELBST in der Geraeteliste
# auftauchen? Er wird per mDNS/ARP nicht gefunden (man findet sich nicht
# selbst), ist aber oft der interessanteste Host — dort laufen typischerweise
# weitere Dienste (FreeCAD-MCP, Web-App, Dateiserver). Er erscheint dann als
# normales Geraet, zusaetzlich mit 🛰️ gekennzeichnet, und laesst sich genauso
# ansprechen. Nebeneffekt: er gilt damit als "gefunden" und ist ohne Eintrag in
# TUNNEL_ALLOW tunnelbar.
LIST_SELF=true
TUNNEL_ENABLED=false
# Welche Ziele sind erlaubt? LEER = nur Geraete, die der Satellit bei der Suche
# auch wirklich gefunden hat (dann aber jeder Port). Damit kann der Tunnel
# nichts ansteuern, was nicht ohnehin im LAN sichtbar ist — insbesondere nichts
# im Internet. Sonst Liste aus host oder host:port, * als Platzhalter:
# TUNNEL_ALLOW=192.168.1.50:8080,192.168.1.60,*:5000
TUNNEL_ALLOW=
TUNNEL_MAX=8 # gleichzeitig offene Verbindungen
TUNNEL_IDLE_SEC=900 # ungenutzte Tunnel nach 15 min schliessen
# Geraete-Namen ("duffy-desktop" statt 192.168.1.47). Schluessel ist die MAC,
# damit ein IP-Wechsel per DHCP den Namen nicht verliert.
DEVICE_NAMES_PATH=/data/device_names.json