#!/usr/bin/env python3 """ Fritz!Box Neustart via TR-064 (UPnP/SOAP auf Port 49000). Konfiguration: /etc/fritz-reboot.conf FRITZ_IP=192.168.178.1 FRITZ_USER=ein_dafuer_angelegter_nutzer FRITZ_PASS=das_geheime_passwort Voraussetzung in der Fritz!Box: Heimnetz -> Netzwerkeinstellungen -> Erweiterte Netzwerkeinstellungen [x] Zugriff fuer Anwendungen zulassen [x] Statusinformationen ueber UPnP uebertragen Der angegebene Benutzer muss das Recht "Fritz!Box-Einstellungen" haben. """ import sys import datetime import urllib.request import urllib.error CONFIG_FILE = "/etc/fritz-reboot.conf" LOG_FILE = "/var/log/fritz-reboot.log" def read_config(): cfg = {} with open(CONFIG_FILE) as f: for line in f: line = line.strip() if "=" in line and not line.startswith("#"): k, v = line.split("=", 1) cfg[k.strip()] = v.strip() return cfg def log(msg): line = datetime.datetime.now().strftime("%c") + ": " + msg print(line) with open(LOG_FILE, "a") as f: f.write(line + "\n") def tr064_reboot(ip, user, pw): url = f"http://{ip}:49000/upnp/control/deviceconfig" soap = ( '\n' '\n' ' \n' ' \n' ' \n' '\n' ) pwmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() pwmgr.add_password(None, url, user, pw) auth = urllib.request.HTTPDigestAuthHandler(pwmgr) opener = urllib.request.build_opener(auth) req = urllib.request.Request( url, data=soap.encode("utf-8"), headers={ "Content-Type": 'text/xml; charset="utf-8"', "SOAPAction": '"urn:dslforum-org:service:DeviceConfig:1#Reboot"', }, ) return opener.open(req, timeout=10) if __name__ == "__main__": cfg = read_config() try: resp = tr064_reboot(cfg["FRITZ_IP"], cfg["FRITZ_USER"], cfg["FRITZ_PASS"]) log(f"TR-064 Reboot ausgeloest (HTTP {resp.status}).") except urllib.error.HTTPError as e: body = e.read().decode("utf-8", errors="replace")[:300] log(f"FEHLER HTTP {e.code} {e.reason}: {body}") sys.exit(1) except urllib.error.URLError as e: log(f"FEHLER Verbindung: {e} -- TR-064 aktiviert? " "Heimnetz > Mesh > Netzwerkeinstellungen > 'Zugriff fuer Anwendungen zulassen'") sys.exit(1) except Exception as e: log(f"FEHLER: {e}") sys.exit(1)