Fritzbox: Statusanfragen per UPnP: Unterschied zwischen den Versionen

Aus Zebradem WIKI
Zur Navigation springenZur Suche springen
Die Seite wurde neu angelegt: „== Statusanfragen per UPnP == Über Skripte wie das folgende können verschiedene Parameter der Fritz!Box per UPnP/SOAP ausgelesen werden. Hier wird der momentan…“
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
{| width="100%"
|style="vertical-align:top"|
<div style="margin: 0; margin-top:10px; margin-right:10px; border: 1px solid #dfdfdf; padding: 0em 1em 1em 1em; background-color:#1B1C2D; align:right;">
<br> <font color="silver"></font>
<center><font color="silver">[[Image:ZD-Logo.png]]</font></center>
<font color="silver"><font color="silver"></font></font>
<center><font color="silver"><font color="silver"><big>'''''Das Board mit Freiheiten'''''</big></font></font></center>
----
<div style="margin: 10px 10px 0pt 0pt; border: 10px solid rgb(0, 0, 0); padding: 0em 1em 1em; background-color: rgb(48, 49, 64);">
<font color="silver"><font color="silver"><font color="white"></font></font></font>
== Statusanfragen per UPnP ==
== Statusanfragen per UPnP ==



Version vom 22. Mai 2010, 09:21 Uhr


Das Board mit Freiheiten

Statusanfragen per UPnP

Über Skripte wie das folgende können verschiedene Parameter der Fritz!Box per UPnP/SOAP ausgelesen werden. Hier wird der momentane Durchsatz abgefragt (Bytes in/out), bzw. mit der Option "-ip" erscheint die aktuelle externe IP-Adresse. Die Option "-a" gibt alle Informationen über die DSL-Schnittstelle aus.

#!/bin/bash

NETCAT=`which netcat`
[ -z "$NETCAT" ] && NETCAT=`which nc`
[ -z "$NETCAT" ] && exit 1

INTERFACE_NS="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"
WANIP_NS="urn:schemas-upnp-org:service:WANIPConnection:1"

if [ "$1" = "-ip" ]; then
        NS="$WANIP_NS"
        REQUEST="GetExternalIPAddress"
        SED='/^<NewExternalIP/ s,</\?NewExternalIPAddress>,,gp'
else
        NS="$INTERFACE_NS"
        REQUEST="GetAddonInfos"
        if [ "$1" = "-a" ]; then
                SED='s,<New,<, ; /^<[a-zA-Z]*[ >]/ s,^<\([^> ]*\) *>\([^<]*\)</.*,\1\t\2,p'
        else
                SED='s/Send/OUT/ ; s/Receive/IN/ ; /^<NewByte/ s,^<NewByte\([^>]*\)Rate>\([^<]*\)<.*,\1\t\2,gp'
        fi
fi

( $NETCAT 192.168.178.1 49000 | sed -ne "$SED" ) <<EOF
POST /upnp/control/WANCommonIFC1 HTTP/1.1
Content-Type: text/xml; charset="utf-8"
HOST: 192.168.178.1:49000
Content-Length: 0
SOAPACTION: "$NS#$REQUEST"

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body><u:$REQUEST xmlns:u=$NS /></s:Body>
</s:Envelope>
EOF

Das oben aufgeführte Script funktioniert nicht mehr mit neueren Firmwareversionen, da diese das "Content-Lenght" Feld auswerten. Das folgende modifizierte Skript läuft auf neueren Frimwareversionen (getestet 29.04.40), auf älteren hingegen nicht. Diese scheinen den xml content nicht richtig zu interpretieren.

#!/bin/bash

FRITZ_IP=192.168.178.1

NETCAT=`which netcat`
[ -z "$NETCAT" ] && NETCAT=`which nc`
[ -z "$NETCAT" ] && exit 1

( [ -n "$FRITZ_IP" ] && $NETCAT -z $FRITZ_IP 49000 ) || exit 1;

INTERFACE_NS="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"
WANIP_NS="urn:schemas-upnp-org:service:WANIPConnection:1"

if [ "$1" = "-ip" ]; then
        NS="$WANIP_NS"
        REQUEST="GetExternalIPAddress"
        SED='/^<NewExternalIP/ s,</\?NewExternalIPAddress>,,gp'
else
        NS="$INTERFACE_NS"
        REQUEST="GetAddonInfos"
        if [ "$1" = "-a" ]; then
                SED='s,<New,<, ; /^<[a-zA-Z]*[ >]/ s,^<\([^> ]*\) *>\([^<]*\)</.
*,\1\t\2,p'
        else
                SED='s/Send/OUT/ ; s/Receive/IN/ ; /^<NewByte/ s,^<NewByte\([^>]
*\)Rate>\([^<]*\)<.*,\1\t\2,gp'
        fi
fi

body="<?xml version=\"1.0\" encoding=\"utf-8\"?> \
<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" \
   s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\
        <s:Body><u:$REQUEST xmlns:u=$NS /></s:Body>\
</s:Envelope>"

( $NETCAT $FRITZ_IP 49000 | sed -ne "$SED"  ) <<EOF
POST /upnp/control/WANCommonIFC1 HTTP/1.1
Content-Type: text/xml; charset="utf-8"
HOST: $FRITZ_IP:49000
Content-Length: ${#body}
SOAPACTION: "$NS#$REQUEST"

$body
EOF

UPnP-Anfrage aus Python heraus

Unter Verwendung einer High-Level-Skriptsprache und Rückgriff auf eine SOAP-Bibliothek geht es auch kompakter:

#!/usr/bin/env python
from SOAPpy import SOAPProxy
print SOAPProxy(proxy='http://192.168.178.1:49000/upnp/control/WANCommonIFC1',
                namespace='urn:schemas-upnp-org:service:WANIPConnection:1',
                soapaction='urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress',
                noroot=True).GetExternalIPAddress()

Getestet gegen eine FRITZ!Box 2170.

Anzumerken ist noch, dass die FRITZ!Box recht eigenwillige Vorstellungen von XML hat: ein entsprechendes Perl-Skript mit der Bibliothek SOAP::Lite bekommt immer eine Fehlermeldung der FRITZ!Box zurück, da es im Envelope-Element der XML-Nachricht neben dem soap-Namespace "http://schemas.xmlsoap.org/soap/envelope/" weitere Namespaces definiert (xsi, xsd) und diese Attribute vor das soap-Attribut stellt. Das mag die FRITZ!Box gar nicht; bearbeitet man eine SOAP::Lite-Nachricht manuell derart, dass das soap-Namespace-Attribut vor den anderen erscheint, klappt es...

Mögliche UPnP-Anfragen

Mögliche UPnP-Anfragen sind Beschreibungsdateien definiert, die sich wie folgt abrufen lassen ([1])

for i in igddesc.xml igdconnSCPD.xml igdicfgSCPD.xml igddslSCPD.xml ; do
  wget http://fritz.box:49000/$i
done