The truth is rarely pure and never simple

FRITZ!Box: Rufumleitung auf der Kommandozeile aktivieren

Wenn ich das Haus verlasse, schalte ich meistens die Rufumleitung auf mein Handy ein. Leider ist das über das Benutzerinterface der FRITZ!Box 7270 etwas zeitraubend. Lieber ist mir da ein shell-Kommando, das zusammen mit dem shutdown-Skript oder dem init-Skript ausgeführt werden kann.

Die Quintessenz: man kann den ersten Eintrag der Rufumleitungen ändern, indem man ein HTTP-POST-Request auf “fritz.box/cgi-bin/webcm” mit den Parametern “telcfg%3Asettings%2FCallerIDActions0%2FActive=STATUS&sid=SID” verschickt, wobei STATUS zum Aktivieren 1 und zum Deaktivieren 0 sein muss. Das Problem ist das Erhalten der Session-ID, die seit Mitte 2009 von den AVM-Geräten vorausgesetzt wird. Da ich keinen Passwortschutz auf der FRITZ!Box aktiviert habe, ist das vergleichsweise leicht. Folgendes python-Skript erledigt die Aufgabe – einfach mit dem Parameter “on” oder “off” aufrufen.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import httplib
import sys
import xml.etree.ElementTree as ET

# check params
if len(sys.argv) != 2 or sys.argv[1] not in ["on", "off"]:
    print "Usage:", sys.argv[0], " [on|off]"

# get sessionid
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
con = httplib.HTTPConnection('fritz.box')
con.request("GET", "/cgi-bin/webcm?getpage=../html/login_sid.xml");
res = con.getresponse()
if res.status != 200:
    print "This box does not force the user to acquire a SID. As I do not own such a device, you should try the commands in the source code by yourself."
    quit()
data = res.read()
xml = ET.fromstring(data)
nopass = False
for e in xml.iter('iswriteaccess'):
    nopass = (e.text == "1")

if not nopass:
    print "This device requires a password."
    quit()

sid = ""
for e in xml.iter('SID'):
    sid = e.text
if sys.argv[1] == "on":
    con.request("POST", "/cgi-bin/webcm", "telcfg%3Asettings%2FCallerIDActions0%2FActive=1&sid=" + sid, headers);
else:
    con.request("POST", "/cgi-bin/webcm", "telcfg%3Asettings%2FCallerIDActions0%2FActive=0&sid=" + sid, headers);
res = con.getresponse();
if res.status != 200:
    print "error"

con.close();