fritz-reboot.py hinzugefügt
This commit is contained in:
parent
9ae1e9242e
commit
6b1fe75da1
1 changed files with 86 additions and 0 deletions
86
fritz-reboot.py
Normal file
86
fritz-reboot.py
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#!/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 = (
|
||||
'<?xml version="1.0" encoding="utf-8"?>\n'
|
||||
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" '
|
||||
's:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\n'
|
||||
' <s:Body>\n'
|
||||
' <u:Reboot xmlns:u="urn:dslforum-org:service:DeviceConfig:1"/>\n'
|
||||
' </s:Body>\n'
|
||||
'</s:Envelope>\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)
|
||||
Loading…
Add table
Reference in a new issue