Hilfsprogramme / Tipps & Tricks
From Fritz!Box
[edit] TAPI Services for Fritzbox mit DECT Telefone nutzen
Die AVM TAPI Services for FRITZ!Box stellen ein Bindeglied zwischen der Microsoft TAPI (Telephony API) und einer beliebigen FRITZ!Box mit Telefoniefunktionalität dar. Der Treiber wurde mal für die älteren Fritz!Box Fon Modelle entwickelt und unterstützt im Set-Up noch nicht die DECT Telefone der Fritz!Box 7270 Basis als Ziel-Gerät für den Rufaufbau (z.B. aus Outlook).
Stattdessen kann man im SetUp auf dem PC nur die Analogschnittstellen und die angemeldeten ISDN Geräte:
1 - Phone1 (Analog Port 1)
2 - Phone2 (Analog Port 2)
...
50 - ISDN BUS Sammelruf
51 - ISDN Gerät 1
52 - ISDN Gerät 2
...
58 - ISDN Gerät 8
aus der Drop-Down Box auswählen.
Mit Einstellen von 50 (gesamter ISDN Bus) werden auch alle an der DECT Basis der 7270 angemeldeten Geräte signalisiert.
Man kann aber manuell den von AVM nicht dokumentierten REG_DWORD - Parameter Slot nachträglich in der Windows Registry mit Hilfe des im Betriebssystem enthaltenen Registry Editors regedit.exe unter:
HKLM/Software/AVM/TAPI Services for FRITZ!Box/Cntrl1
auf die folgenden dezimalen Werte:
60 - Entspricht Nebenstelle 610
61 - Entspricht Nebenstelle 611
62 - Entspricht Nebenstelle 612
63 - Entspricht Nebenstelle 613
64 - Entspricht Nebenstelle 614
setzen um damit den abgehenden Ruf dediziert von dem jeweiligen DECT Telefon aufzubauen.
Tipp: Ein Reboot des Systems zum Einlesen der Änderung im TAPI Treiber kann vor dem Testen hilfreich sein.
Nach eigenen Angaben bietet AVM keinen Support für den Treiber und führt die Entwicklung daran momentan auch nicht weiter.
Der Treiber wird von AVM für Windows XP und Windows VISTA zum Download auf der Website für die Fritz!Box Fon Geräte bereitgestellt.
--Cando 16:31, 27 November 2008 (CET)
EDIT: Es gibt mittlerweile eine neue Version des Treibers bei AVM, der die DECT Geräte nativ berücksichtigt.
[edit] DSL Zwangstrennung und Uhrzeit setzen
Aktuelle Firmware-Versionen haben das zumindest bei der 7050 und der einfachen FRITZ!Box bereits im Menü.
Das folgende Programm kann z.B. per Cronjob auf einem Linux-Rechner gestartet werden. Voraussetzung ist die Installation des Paketes 'expect'.
#!/usr/bin/expect spawn telnet fritz.box expect "#" send "/sbin/dsld -s\r" expect "#" send "/sbin/dsld\r" expect "#" set date_now [timestamp -format "%m%d%H%M%Y"] send "date $date_now\r" expect "#" set date_now [timestamp -format "%H:%M:%S"] send "date $date_now\r" expect "#" sleep 10 send "wget -q 'http://uuuuu:ppppp@members.dyndns.org/nic/update?hostname=hhhhh.hhh.hh&wildcard=on' -O -\r" expect "#" send "\r" expect "#" send "exit\r" expect "Connection closed by foreign host." exit
Dabei ist:
uuuuu = Dein Username bei DynDNS
ppppp = Dein Passwort bei DynDNS
hhhhh.hhh.hh = Dein Hostname bei DynDNS
Parameter:
-q = Wget gibt nichts aus
-O = Output file
- = Standard-Out
wildcard=on = optional: dann funktinieren auch Subdomains deines Hostnamens.
--Udo SW 23:33, 25 Oct 2004 (CEST)
[edit] Last-Auswertung der fbox
Problem: bei grosser Netzlast, genauer: bei hoher Paketzahl, die der dsld verarbeiten muss, steigt die Last
des Systems schnell ueber 3.
Das Problem daran ist, dass bei zu hoher Systemlast die Latenz der DSL-Anbindung so hoch ist, dass Verbindungen
abbrechen (retransmit timeout) bzw. gar nicht erst zustande kommen (connect timeout).
Um einen Ueberblick zu erhalten, wann die Lastspitzen auftreten und die Punkte hoher Netzlast zu
ermitteln ist es notwendig, die Systemlast zu tracken.
Dies geschieht mittels:
- uptime
- logger
- remote syslogging
- rrd (hierzu wird es in Zukunft ein separates HOWTO geben. Solange bitte rrd-doku nutzen.)
Wir benutzen dazu ein kleines shell-Konstrukt, das einen daemon ersetzt:
### Log system status -> remote log -> graphing uptimeInterval="55" ### seconds (while true; do echo "uptime: $(uptime)" | logger; sleep $uptimeInterval; done 1>/dev/null 2>&1) 1>/dev/null 2>&1 &
Der obige Code muss in "/var/install" im bootimage stehen und nach "/var/flash/debug.cfg" gesichert
werden. Dann wird der daemon auch beim reboot gestartet.
Auf http://think-future.de/CS-MISC/FritzBoxWLAN/ liegt ein image, das diese Modifikation beinhaltet.
Ein Graph, wie das Ergebnis dann aussehen kann:
http://think-future.de/CS-MISC/FritzBoxWLAN/loadFbox.png
FritzBoxWLAN, Last-Graph (mittlere Last, täglich)
Weitere Beispiele
--Runia 20:40, 21 Mar 2005 (CET)
Die "Last"-Zahl ist ziemlich wenig aussagekräftig. Das gibt nur an wie viele Prozesse gerade arbeiten wollen, nicht direkt wie stark die CPU belastet ist. Mit deinem Progrämmchen da erhöhst du die Last um mindestens 1.
-- Erich 19:35, 14 Sep 2005 (CEST)
Tatsächlich erhöht sich die Last durch die Modifikation. Jedoch erhöht sie sich in einem Maß, das nicht meßbar ist. Die Aussage, die Last würde sich um mindestens "1" erhöhen ist auf verschiedenen fboxen ebensowenig nachvollziehbar wie die Aussage, daß die "Last"zahl wenig aussagekräftig sei. Sie ist vielmehr das Kriterium der Kapazitätsauslastung.
Möglicherweise ist der Begriff "Last" mehrdeutig. Wie auch immer. Die Modifikation ist ausgesprochen hilfreich und bringt keinerlei nachvollziehbaren Nachteil mit sich.
Der obige screenshot ist übrigens während hoher Netzlast entstanden. Traffic im allgemeinen und besonders eine hohe Anzahl an Kontrollverbindungen belasten die fbox in einer Weise, die sie leicht an ihre Belastungsgrenze für interaktives Arbeiten führt; ab ca. einer Last von "3" wirds unangenehm ;).
Die visuelle Kontrolle, ob die fbox in diesem Lastbereich fährt ist mit der Modifikation optimal möglich und genau dafür ist sie konzipiert.
--Runia 18:05, 12 Oct 2005 (CEST)
[edit] Firmware wieder herstellen
Empfehlung: Macht ein Backup! Dieses Backup, der ADAM2 Konfiguration kann euch und eure Box vor viel Arbeit retten. - telnet auf die Box - sichert mtd3 und mtd4
cat /dev/mtdblock/3 > /var/tmp/mtd3 cat /dev/mtdblock/4 > /var/tmp/mtd4
[edit] Sicherung über tftp
kopiert das Backup per tftp oder ähnlich auf euren PC
cd /var/tmp/ tftp -p -l mtd3 -r mtd3 <ip-von-eurem-pc> tftp -p -l mtd4 -r mtd4 <ip-von-eurem-pc>
[edit] Sicherung über USB Stick
Sichern der Konfiguration (mtd{3|4}) via USB-Stick geht einfach, benötigt keinen externen tftp-Server und auch kein umständliches Webservkillen
[edit] Sichern der Konfiguration (mtd{3|4}) via built-in webserver (websrv)
- Eine zweite Instanz zum Laufen zu bringen hat bisher nicht geklappt.
- Vorteil des Downloads via Webserver: geht einfacher (imho) und geht auch durch die meisten firewalls (im Gegensatz zu tftp).
- daher die orginal Konfigurationsdatei (ar7.cfg) editieren. Achtung: Operation am offenen Herzen. Aenderungen werden beim Speichern direkt ins flash uebertragen. Falls was schiefgeht: Recovery faellig. (*sigh*)
# nvi /var/flash/ar7.cfg
nach "websrv" suchen (im [n]vi mit /websrv; ist ziemlich am Ende der Datei, ca. 80%).
webdir = "/usr/www";
aendern in
webdir = "/var/tmp";
Speichern (:x)! Anschliessend den Webserver neu starten
# websrv -s # websrv
- im log steht dann ungefaehr folgendes:
Jan 16 19:09:03 fbox websrv[360]: Signal: termination (1 times) Jan 16 19:10:41 fbox websrv[1589]: process priority is 19 Jan 16 19:10:41 fbox websrv[1589]: FactoryDefaultWebDir=/var/tmp Jan 16 19:10:41 fbox websrv[1589]: startup (Jan 5 2005 11:03:26)
- Nun könnt ihr die Datei einfach per HTTP herunterladen
# wget http://fritz.box/mtd3 # wget http://fritz.box/mtd4
- Am besten am Schluss alle Aenderungen wieder rueckgaengig machen, sonst ist nix mehr mit web-interface! ;-)
- Alternative:
# mount -o bind /var /usr/www/html
Damit kann man alle Dateien aus /var kopieren - directory listings gehen nicht, aber braucht man ja auch nicht. Wollte kein TFTP benutzen und hab auf meiner FB SL nur websrv kein thttpd und auch kein nvi/vi auf der Box, so dass die Änderung des FactoryDefaultWebDir auch nicht so einfach ist. Zurück gehts mit
# umount /usr/www/html
Nach einem Neustart der Box ist auch wieder alles vergessen
- Tipp: zieht Euch mal ein paar binaries und lasst "strings" drueberlaufen, offenbart die eine oder andere Kleinigkeit.
--Runia 19:54, 16 Jan 2005 (CET)
Damit geht ein Recovery einfacher. Ansonsten, falls das Kind schon im Brunnen ist: siehe unten...
add Empfehlung backup 2.12.2004 haveaniceday
Falls mal ein Firmware-Update nicht klappt, bietet AVM ein kleines Programm namens recover.exe an, mit dem
man die Firmware wieder auf die Box bekommt, so lange der Bootloader wenigstens noch im Flash ist und
funktioniert. Ich habe ein Perlskript begonnen, das das auch kann. Man ist nicht einmal auf die IP-Nummer
192.168.178.1 festgelegt. Hier gibt es das Programm.
$ ./recover -h
usage: recover -h
recover [-i IPADDR] [-f firmeware.image] [-r]
-i IPADDR: set boot time IP to IPADDR within environment
-f image: extract fs and kernel from tarfile and flash
-r: reboot fbox
Das Programm muss wie üblich ca. 2-3 Sekunden nach dem Reboot der Box gestartet werden und diese muss sich im gleichen lokalen Netzwerk befinden, da
- ein Broadcast benutzt wird, um die Box zu finden und ggf. die IP zu setzen
- die Box im Bootloader nur eine Route in ihr lokales Netz hat
Ausserdem sollte darauf geachtet werden, dass sich jeweils nur eine Box gleichzeitig pro Netzwerk im Bootmodus befindet, sonst gibt es Chaos!
Testlauf:
$ ./recover -r Looking for Fritz!Box...found ADAM2 version 0.18.1 at 192.168.178.1 (192.168.178.1) Product ID: Fritz_Box_WLAN Hardware Revision: 61 Firmware Revision: 08.01.18 Rebooting...
letzte Änderung Enrik 15:05, 27 Oct 2004 (CEST)
[edit] TFFS image basteln mit mktffs.pl
Falls die Box nicht mehr richtig bootet, und man die Werkseinstellungen über ADAM2 wieder herstellen möchte, kann man mittels mktffs.pl Image-Dateien für mtd3/mtd4 bauen, die sich dann über ADAM2's FTP-Interface flashen lassen. Das Skript erwartet auf stdin einfache "key-value" Paare, wie sie sich über ftp mit `get env' lesen lassen oder auch bei noch funktionierender Box mit `cat /proc/avalanche/env'. Die Image-Dateien landen im aktuellen Verzeichnis als `mtd3' und `mtd4'. Beispiel (im Gegensatz zum Beispiel sollten natürlich sinnvolle Werte geladen werden!):
$ echo "my_ipaddress 127.0.0.1" | perl mktffs.pl $ perl dumptffs.pl mtd3 TFFS 1.4 (4294967294) nametable version: @4 DMC = <undef> HWRevision = <undef> ProductID = <undef> SerialNumber = <undef> annex = <undef> autoload = <undef> bluetooth = <undef> bluetooth_key = <undef> bootloaderVersion = <undef> bootserport = <undef> country = <undef> cpufrequency = <undef> crash = <undef> ethaddr = <undef> firmware_info = <undef> firmware_version = <undef> firstfreeaddress = <undef> flashsize = <undef> http_key = <undef> kernel_args = <undef> kernel_args1 = <undef> language = <undef> linux_fs_start = <undef> linuxip = <undef> maca = <undef> macb = <undef> macc = <undef> macdsl = <undef> macwlan = <undef> memsize = <undef> modetty0 = <undef> modetty1 = <undef> modulation = <undef> mtd0 = <undef> mtd1 = <undef> mtd2 = <undef> mtd3 = <undef> mtd4 = <undef> mtd5 = <undef> mtd6 = <undef> mtd7 = <undef> my_ipaddress = 127.0.0.1 nfs = <undef> nfsroot = <undef> oam_lb_timeout = <undef> prompt = <undef> ptest = <undef> req_fullrate_freq = <undef> reserved = <undef> sysfrequency = <undef> systype = <undef> urlader-version = <undef> usb_board_mac = <undef> usb_device_id = <undef> usb_device_name = <undef> usb_manufacturer_name = <undef> usb_revision_id = <undef> usb_rndis_mac = <undef> wlan_key = <undef>
letzte Änderung Enrik 17:24, 1 Dec 2004 (CET)
NB! It is possible to run a second copy of the thttpd with /var as root:
# /usr/sbin/thttpd -g -d /var -u root -p 1080
Then, open a following URL in any browser: "http://192.168.1.1:1080/" to get a files from this folder.
Alec_v 22:05, 8 Jan 2005
[edit] Wenn nichts mehr geht: Factory Defaults über ADAM2 wieder herstellen
Wenn man sich die Box mal so verkonfiguriert haben sollte, dass ein Zugriff über Netz nicht mehr möglich ist, man keine serielle Konsole hat, man nicht in der Lage ist, sich ein eigenes Image zu bauen, das den Fehler behebt und auch nicht in der Lage ist, sich ein TFFS-Image zu basteln, dann hilft noch folgende radikale Methode, um die Box wieder auf Grundeinstellungen zu setzten: Die Fritz Box muss über LAN1 mit PC verbunden sein und die IP des PC sollte im gleichen Subnetz wie 192.168.178.1 sein.
$ cd MeinFritzVerzeichnis $ touch empty $ ftp 192.168.178.1 # wie üblich kurz nach dem Anschalten Connected to 192.168.178.1. 220 ADAM2 FTP Server ready. Name (192.168.178.1:enrik): adam2 331 Password required for adam2. Password: 230 User adam2 successfully logged in. Remote system type is UNIX. ftp> bin 200 Type set to I. ftp> get env local: env remote: env 200 Port command successful. 150 Opening BINARY mode data connection for file transfer. 226 Transfer complete. 1374 bytes received in 0.02 secs (83.2 kB/s) ftp> ! cat env HWRevision 61 ProductID Fritz_Box_WLAN ... ftp> quote MEDIA FLSH 200 Media set to FLSH. ftp> put empty "0x0 mtd3" local: empty remote: 0x0 mtd3 200 Port command successful. 150 Opening BINARY mode data connection for file transfer. 226 Transfer complete. ftp> put empty "0x0 mtd4" local: empty remote: 0x0 mtd4 200 Port command successful. 550 invalid <blockname>. ftp> quote REBOOT 221-Thank you for using the FTP service on ADAM2. 221 Goodbye.
Auf keinen Fall das 'get env' und die Prüfung des Dateiinhalts vergessen, sonst sind eure MAC-Adressen hinüber!
Im obigen Beispiel war mtd3 der aktive environment Sektor (TFFS double buffering). Daher war nach dem Upload von mtd3 das environment kaputt und der Upload von mtd4 nicht mehr möglich. Jetzt gibt es zwei Möglichkeiten:
- in mtd4 steht noch eine valide alte Konfig und die fbox kommt sofort wieder mit einer (irgendeiner!) alten Konfig hoch
- die gesamte Konfig ist bereits weg: die fbox braucht einige Sekunden länger zum Booten und kommt mit "factory defaults" wieder hoch. Die längere Bootdauer kommt von der Flash-Neuintialisierung. Also erstmal keine Panik. Nach einer Minute dann vielleicht ;-)
Im ersten Fall ist man entweder mit der alten Konfig bereits glücklich oder man wiederholt den Vorgang, wenn mtd4 auch noch platt gemacht werden soll.
Im zweiten Fall ist jegliche Individualität der fbox verloren gegangen. Jetzt kommt das Backup der environment-Variablen ins Spiel: wieder rebooten und mit ftp auf den Bootloader verbinden. Dann alle abweichenden Variablen wieder setzen.
$ ftp 192.168.178.1 Connected to 192.168.178.1. 220 ADAM2 FTP Server ready. Name (192.168.178.1:enrik): adam2 331 Password required for adam2. Password: 230 User adam2 successfully logged in. Remote system type is UNIX. ftp> quote SETENV firmware_info,08.03.14 200 SETENV command successful ftp> quote SETENV maca,00:04:0E:xx:xx:xx 200 SETENV command successful ftp> quote SETENV macwlan,00:04:0E:xx:xx:xx 200 SETENV command successful ftp> quote SETENV macdsl,00:04:0E:xx:xx:xx 200 SETENV command successful ftp> quote SETENV usb_board_mac,00:04:0E:xx:xx:xx 200 SETENV command successful ftp> quote SETENV usb_rndis_mac,00:04:0E:xx:xx:xx 200 SETENV command successful ftp> quote SETENV wlan_key,xxxxxxx 200 SETENV command successful ftp> quote REBOOT 221-Thank you for using the FTP service on ADAM2. 221 Goodbye.
Je nach box können noch andere Variablen abweichen. Einfach vergleichen und alles anpassen.
bei mir hat dass nicht ohne weiteres geklappt. der ftp scheint zu langsam zu sein zu
verbinden. auf jedem fall habe ich zu erst ein telnet gemacht (zum port 21) und damit
den bootloader gebremst, danach erstmal den telnet abgebrochen und dann hat der
ftp funktioniert (beim zweitem mal). alles andere hat wunderbar geklappt, allerdings
hat ncftp (version >3) probleme gemacht und ich musste "einfachen" ftp nutzen.
der tip mit dem telnet kam eigentlich vom http://www.akk.org/~enrik/fbox/recover.txt
-- holydayin
Ich rate zur Vorsicht, meine 7050 habe ich damit jetzt geschrottet! nach dem "quote REBOOT" bekomme ich überhaupt keine Verbindung mehr zur Fritzbox. Beim Anschalten blinken einmal kurz alle Lampen, dann ist die Power-Lampe stabil an (das ganze innerhalb einer halben Sekunde). Von Factory defaults keine Spur. Verbindung von Linux-Rechner weder mit tnftp, ncftp oder altem ftp möglich, auch telnet bekommt auf port 21 keine Verbindung. Ich bin nicht sicher, ob das löschen von mtd3 und mtd4 so eine gute Idee ist! Anderen passiert das übrigens auch, hier ein interessanter Rettungsversuch nach der mtd3/mtd4-Katastrophe: [1]
--Dideldum 13:13, 26 Jan 2007 (CET)
[edit] Anonyme (registrarlose) SIP-Adresse
Für die Internettelefonie mag es manchmal von Interesse sein, ohne einen dazwischengeschalteten Registrar direkt einen Gesprächspartner anrufen zu können. Das ist mit der Fritz!box wie folgt möglich:
- Als erstes richtet man sich bei DynDNS eine Domain ein und aktualisiert diese entweder mit der Fritz!box oder entsprechendem Client. (z.B. anonym.dyndns.org)
- In der Fritz!box richtet man ein Telefoniekonto mit dem gewünschten SIP-Namen ein (z.B.
ich). Beim Passwort irgendetwas eintragen und beim Registrar die eigene DynDNS Addresse (diese wird als Absender werwendet). - Die Fritz!box meldet sich nun (vergeblich) beim (nichtvorhandenen) Registrar an und meldet "nicht registriert".
- Danach im Telnet mit
nvi /var/flash/voip.cfgöffnen und für diesen Eintrag den Parameterdo_not_register = no;inyesändern damit die Box nicht mehr versucht diesen Eintrag zu registrieren und das Log zumüllt. - Nun kann die Fritz!box unter
sip:ich@anonym.dyndns.orgerreicht werden. - Um von der Fritzbox eine alphanummerische Nummer anzurufen (wie z.B.
sip:ich@anonym.dyndns.org), muss diese über das Webinterface als Kurzwahl definiert werden
Im SIP Programm (z.B. kPhone, X-Lite, etc.) ist dann bei der Wahl der Port anzugeben (ich@anonym.dyndns.org:5060), denn andernfalls findet keine Namensauflösung via gethostbyname statt, sondern es wird versucht, einen DNS SRV Record abzufragen, aus dem sich dann Service, Host und Port ergeben - jene sind aber kaum je konfiguriert und bei Dynamic-DNS-Diensten wie DynDNS.org auch nicht einstellbar.
Viel sinnvoller wäre es meiner Meinung nach hier enum zu verwenden, denn dafür ist es gedacht. Die enum.arpa Domains kosten ja jetzt was, aber es gibt ja noch den Dienst [[2]], der einen gleichwertigen Service anbietet und bei vielen Produkten (wie Asterisk z.b.) auch voreingestellt ist.
Man bekommt eine kostenlose e164.arpa Adresse in der Einführungsphase bei http://www.portunity.net per Telefonauthentifizierung
[edit] "Fritzboxdingens" -- Ein PHP-Tool zur Eingabe von Portranges für die FRITZ!Box WLAN 7050
Seit Firmware-Version 14.03.85 (für FRITZ!Box Fon WLAN 7050) ist die Eingabe von Portranges möglich und das Fritzboxdingens somit nicht mehr nötig! Wer dennoch daran interessiert ist, findet den alten Text hier.
-- Barpfotenbaer 13:25, 2 Oct 2005 (CEST)
[edit] Portfreigabe über die Kommandozeile
Mit Hilfe des Skripts fritzbox-change-port.py lassen sich, mit ein paar Anpassungen, beliebige Portweiterleitung festlegen. Je nach verwendeter Version der FritzBox muss das Skript evtl. angepasst werden, aber ich versuche, (zumindest für die FritzBox 7170) das Skript immer aktuell zu halten und hier reinzustellen.
[edit] 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 Skript ist übrigens im Wesentlichen eine Zusammenfassung der Arbeit anderer Wiki-Teilnehmer. Vielen Dank!
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
[edit] 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...
[edit] Mögliche UPnP-Anfragen
Mögliche UPnP-Anfragen sind Beschreibungsdateien definiert, die sich wie folgt abrufen lassen ([3])
for i in igddesc.xml igdconnSCPD.xml igdicfgSCPD.xml igddslSCPD.xml ; do wget http://fritz.box:49000/$i done
[edit] MRTG Monitoring des WAN Interfaces
upnp2mrtg macht eine grafische Auswertung der Auslastung des externen Interfaces möglich. upnp2mrtg läuft auf einem Unix Rechner von dem aus die UPNP-Anfragen an die FritzBox gemacht werden. Klein aber fein!
[edit] eMail mit Anrufliste und Online-Zähler
In der Konfigurationsdatei /var/flash/ar7.conf gibt es die Section emailnotify. Die Konfigurationsdatei kann mit dem Editor nvi bearbeitet werden. <p> Wenn ihr nun die Konfigurationseinträge mit den Einstellungen für euren SMTP-Server vervollständigt, erfolgt automatisch bei jedem (kontrollierten) Neustart der FRITZ!Box der Versand einer eMail an den hinterlegten Empfänger. Ausserdem wird jeweils zum Tageswechsel ebenfalls eine eMail mit den nachstehenden Informationen an die hinterlegte Adresse gesendet.
Diese eMail beinhaltet die folgenden Informationen:
- Online-Zeit und Datenvolumen
- Anrufjournal
- Ereignisse
Ein Beispiel für den geänderten Teilbereich der /var/flash/ar7.conf habe ich euch beigefügt:
emailnotify {
enabled = yes;
interval = daily;
From = "raeuber@hotzenplotz.de";
To = "johnny@controlletti.it";
SMTPServer = "smtp.1und1.de";
accountname = "it1049421-003";
passwd = "?????";
}
Die vorgenannten Einstellungen habe ich getestet auf einer FRITZ!Box Fon WLAN 7050 (UI), Firmware-Version 14.03.71
--Heiko 00:23, 27 Jul 2005 (CEST)
Bei meiner 1&1 FRITZ!Box Fon WLAN 7050 FW 14.03.71 heist die Datei /var/flash/ar7.cfg ! Steffen Strobel 23:23, 1 Sep 2005 (CEST)
Meine FRITZ!Box Fon WLAN 7050, Firmware-Version 14.03.89, kann von Haus aus periodisch E-Mails mit Zustands- und Nutzungsdaten versenden. Das ganze heisst "Push Service" und ist im System-Menü zu aktivieren. --Wolfgang Syma 12:28, 9 Dec 2005 (CEST)
Die Firtz Box Fon ebenfalls --MissParker 12:33, 10 August 2008 (CEST)
[edit] Webinterface aus dem WAN zugänglich machen
<Achtung>
Die hier empfohlenen Methoden ermöglichen jeglichem Internet-Nutzer, Eure FBOX zurückzusetzen (factory reset). Sie benötigen dafür keine Paßwort-Abfrage. Nach dem Rücksetzen kann die FBOX beliebig konfiguriert werden, d.h. auch, daß für Euch (ebenso für unbekannte Fremde) Kosten entstehen können. Abgesehen davon, daß Ihr sie vielleicht gar nicht mehr nutzen könnt.
AVM prüft in den neueren FW-Versionen berechtigt, ob der Zugang sinnvoll ist. Zum Schutz der Kunden. Wer sich allerdings bewußt und mit Vorsatz daran macht, sollte mit unbekannten Konsequenzen rechnen.
</Achtung>
--Runia 11:35, 17 Jan 2006 (CET)
Die FritzBox gestattet keine Portforwardings auf ihre eigenen IP's.
Abhilfe (bei älterer Firmware): Unter Internet - Portfreigabe eine Freigabe von Port 8888 TCP (beliebige Nummer < 65535) an die 192.168.179.1 Port 80 einrichten (Geht natürlich äquvalent für telnet...). Schon ist das Webinterface über http://MeineDomain.dyndns.org:8888 aus dem Internet erreichbar. Nicht vergessen den Passwortschutz zu aktivieren, der einen gewissen Schutz gegen unerlaubte Änderungen bietet (Missbrauch der IP-Adresse, Telefonieren auf Kosten des Besitzers, ...).
Zusatz: Man kann auch direkt Port 80 freigeben indem man ihn auf 192.168.179.1 weiterleitet. Allerdings ist es etwas sicherer, wenn eine ungewöhnliche Port-Nummer gewählt wird, da so zumindest blinde Port-Scans auf die Nase fallen.
Neue Firmware: Bei neueren Firmware-Versionen hat AVM eine entsprechende Prüfroutine eingebaut. Eine Portfreigabe auf eine von der FritzBox benutzte IP-Adresse ist per Webinterface nicht mehr möglich. Daher müssen hier die Einträge direkt im telnet erfolgen.
- per telnet auf der Box einloggen
- # nvi /var/flash/ar7.cfg
- Suche nach forwardrules (unter dsl-interfaces)
- hinter der Zeile "udp 0.0.0.0:7085 0.0.0.0:7085", neue Zeile einfügen tcp 0.0.0.0:8888 0.0.0.0:80",
- Datei speichern und fertig!
--René Link 16:35, 10 Sep 2006 (CET)
PS: Wenn man einen SSH-Server aufsetzt, kann man einen SSH-Tunnel herstellen und so sicher auf das Web-Interface zugreifen. ;) Ein interessanter Artikel hierzu ist auch Computer über das Internet starten und fernsteuern Der SSH-Befehl kann dann etwa so aussehen:
$ ssh -l root -N -L 8888:localhost:80 FRITZBOX_ADRESSE
In diesem Fall wird ein SSH-Tunnel vom lokalen Port 8888 auf den FritzBox-Port 80 aufgemacht. Im Browser einfach http://localhost:8888 eingeben.
Andere Möglichkeit, Forwards auf die Box übers Webinterface zu erstellen, geht bei mir einwandfrei mit der 7141 Fw:40.04.30:
Per telnet folgende zeile ausführen oder in die debug.cfg übernehmen:
ifconfig lan:1 192.168.x.x netmask 255.255.255.0 wobei die IP im lokalen Netz sein muss, nicht vom DHCP vergeben werden darf und frei sein muss
nun könnt ihr Forwards auf diese IP-Adresse einstellen. (Nutze ich für ssh forward)
(FraggeR)
[edit] Stabile SSH-Verbindungen durch die Fritz!Box
Leider verwendet die Fritz!Box nicht die Linux-Firewall (netfilter). Vermutlich weil netfilter so oft die Herausgabe von Quellcodes verlangt hat... vielleicht wollten sie aber auch nur ihren Code aus den Windows-Versionen wiederverwenden.
Jedenfalls sind die Verbindungen nicht stabil, wenn keine Daten übertragen werden. Eine "untätige" SSH-Verbindung wird so nach einigen Minuten (geschätzt: 10) getrennt. Das ist sehr lästig; eine echte Lösung hab ich bisher nicht gefunden.
Aber man kann bei SSH in der ~/.ssh/config die Option ServerAliveInterval 300 einfügen. Dann sendet der SSH-Client von sich aus alle fünf Minuten ein keepalive-Signal, und die Verbindung bleibt auch bei der Fritz!Box bestehen.
-- Erich 19:35, 14 Sep 2005 (CEST)
Leider steht die Option ServerAliveInterval nicht in man ssh und funktioniert bei mir auch nicht (sowohl OS X als auch Linux). Auf welche SSH-Versionen bezieht ihr euch? Wo habt ihr das gesehen?
--JokeyEye 13:37, 10 Mar 2006 (CET)
man ssh_config. Debian unstable, SSH 4.2
--Erich 17:07, 14 Mar 2006 (CET)
Ergänzend dazu können wir noch den SSH-Server konfigurieren. Siehe Talk:Hilfsprogramme_/_Tipps_&_Tricks
--Runia 11:22, 17 Jan 2006 (CET)
Unter SSH Keepalive ist eine andere Methode auf Kernelebene beschrieben:
echo "600" > /proc/sys/net/ipv4/tcp_keepalive_time
Soweit ich das bisher sehe, funktioniert das auch und ist nicht mehr von der konkreten Anwendung (ssh) abhängig.
--Sven 10:49, 16 April 2008 (CEST)
[edit] CAPI over TCP mit der FritzBox
(getestet mit einer 7050 und DisplayCall, Fritz!Fax)
Schritt 1: capi tcp server auf der Box aktivieren. Ich habe dazu den Telnetd mithilfe des starttelnet images gestartet, wie auf Starten_von_telnetd beschrieben. Dann das Kommando /usr/bin/capiotcp_server -p5031 -m3 & in die Datei /var/tmp/debug.cfg gepackt und diese mittels cat /var/tmp/debug.cfg > /var/flash/debug.cfg installiert. Jetzt noch einen reboot und der capi-over-tcp-server sollte beim start geladen werden.
Eine Alternative wäre wohl, die Datei /var/flash/ar7.cfg einfach die entsprechende Option anzuschalten (nicht getestet).
Schritt 2: von AVM das dtrace-archiv herunterladen und die .dll daraus installieren (vorher alle laufenden CAPI-Anwendungen schließen...)
Schritt 3: DisplayCall starten und auf den ersten ISDN-Anruf warten, oder ein Fax verschicken!
-- Erich 21:00, 14 Sep 2005 (CEST)
Es funktioniert mit dem Dos Traceprogramm aus dem dtrace-archiv ganz gut, nur das DisplayCall Programm läuft nicht unter XP. Der Capi Trace unter Dos funktioniert auch bei eingehenden analog anrufen.
CAPI over TCP kann auch über /var/flash/ar7.cfg gesetz werden, via nvi.
enabled = yes; maxctrl =3; port = 5031;
Speichern und dann reboot
-- wolli112 23:00, 14 Sep 2005 (CEST)
Der CAPI-Server ist noch einfacher zu aktivieren, ab Firmware 14.03.85 (FBF 7050) per Telefoncode: Ein #96*3*, Aus #96*2*.
Siehe auch Nutzung des Capi-over-TCP Server der Fritzbox in der Testzone.
--Michael 19:12, 12 Oct 2005 (CEST)
[edit] Fritz!Box sendet E-Mail bei Änderung der IP-Adresse
Zumindest bei der Fritz!Box fon 5050 und Fritz!Box fon WLAN 7050 funktioniert folgendes Skript:
#! /bin/sh
# ipwaechter fuer die Fritz!Box fon 5050
# und Fritz!Box fon WLAN 7050
#
# Version 1.0 Bernhard Huettemann, Duesseldorf
# 15. September 2005
#
/usr/sbin/telnetd -l /sbin/ar7login
/sbin/syslogd
echo "StatusMail" > /var/tmp/statusmail.txt
echo "Fritz!Box" >> /var/tmp/statusmail.txt
echo "#*hier kann Dein Name stehen*#" >> /var/tmp/statusmail.txt
echo "#! /bin/sh" > /var/tmp/ipwaechter.sh
echo "while [ 0 -eq 0 ] ; do" >> /var/tmp/ipwaechter.sh
echo "grep 'EVENT(22)' /var/log/messages" \
" | sed -e '\$!d' > /var/tmp/event22.txt" >> /var/tmp/ipwaechter.sh
echo "if [ -s /var/tmp/event22.txt ] ; then" >> /var/tmp/ipwaechter.sh
echo "cat /var/log/messages > /var/tmp/messages.txt" >> /var/tmp/ipwaechter.sh
echo "echo 'Fritz!Box SYSLOG'" \
" > /var/log/messages" >> /var/tmp/ipwaechter.sh
echo "echo '^M^L' >> /var/tmp/event22.txt" >> /var/tmp/ipwaechter.sh
echo "cat /var/tmp/event22.txt" \
" >> /var/tmp/statusmail.txt" >> /var/tmp/ipwaechter.sh
echo "mailer -s 'Neue IP-Adresse fuer Fritz!Box'" \
" -f '#*absender@domain.xx*#'" \
" -t '#*empfaenger@domain.xx*#'" \
" -m '#*mailausgangsserver.domain.xx*#'" \
" -a '#*mailaccount*#'" \
" -w '#*mailpasswort*#'" \
" -d '/var/tmp/statusmail.txt" \
" /var/tmp/messages.txt'" >> /var/tmp/ipwaechter.sh
echo "> /var/tmp/messages.txt" >> /var/tmp/ipwaechter.sh
echo "> /var/tmp/event22.txt" >> /var/tmp/ipwaechter.sh
echo "fi" >> /var/tmp/ipwaechter.sh
echo "sleep 300" >> /var/tmp/ipwaechter.sh
echo "done" >> /var/tmp/ipwaechter.sh
echo "exit 0" >> /var/tmp/ipwaechter.sh
chmod +x /var/tmp/ipwaechter.sh
sleep 90
/var/tmp/ipwaechter.sh &
exit 0
Das Skript in /var/flash/debug.cfg schreiben. Hierbei die #*Parameter*# entsprechend ersetzen. Speichern und reboot. Das Skript started den syslogd und schaut dann alle 5 Minuten nach, ob im Syslog EVENT(22) auftaucht, welches eine Änderung der DSL-seitigen IP-Adresse bedeutet. Nach einer Änderung verschickt die Box eine Mail mit der neuen IP-Adresse und dem syslog (/var/log/messages) als Anhang.
duesselbernd - 17. Sep 2005
Danke! Damit ist das zudem mailer Programm gut dokumentiert. - Wie gross wird denn die messages Datei? (liegt schliesslich im RAM) Wer das Skript laufen hat und nicht alle 24h DSL-Zwangstrennung hat (d.h. messages wird gemailt und gelöscht), bei dem könnte es eng werden.
Man könnte etwas wie
[ `ls -l /var/log/messages |sed 's/^.*root *root *\([0-9]*\).*/\1/'` -ge 10000 ] && date >/var/log/messages
einfügen, das die Grösse auf 10k begrenzt (nun mit korrigiertem Tippfehlerchen: [ statt echo am Anfang)
spblinux
Wenn man die beiden Ansätze zusammenfügt, dann kommt ungefähr folgendes heraus:
#! /bin/sh
# ipwaechter fuer die Fritz!Box fon 5050
# und Fritz!Box fon WLAN 7050
#
# Version 1.0 Bernhard Huettemann, Duesseldorf
# 15. September 2005
#
# Version 1.1 (partly untested) Stefan Behnel
# 21. September 2005
#
SUBJECT_PREFIX="Fritz!Box"
USER_NAME="YOUR NAME"
SENDER="me@mydomain.tu"
RECEIVER="someoneelse@otherdomain.org"
SMTP_SERVER="smtp.server.org"
MAIL_ACCOUNT="me"
MAIL_PASSWORD="secret"
# start daemons
ps | fgrep -v grep | fgrep -q telnetd || /usr/sbin/telnetd -l /sbin/ar7login
ps | fgrep -v grep | fgrep -q syslogd || /sbin/syslogd
# build script
cat > /var/tmp/ipwaechter.sh <<EOF
#! /bin/sh
while [ 0 -eq 0 ] ; do
(
[ -f /var/log/messages ] || exit 1
cd /var/tmp || exit 1
fgrep 'EVENT(22)' /var/log/messages | sed -e "\$!d" > event22.txt
SUBJECT=
if [ -s event22.txt ] ; then
SUBJECT="NEW IP ADDRESS"
elif [ "\$(ls -l /var/log/messages | sed 's/^.*root *root *\([0-9]*\).*/\1/')" -ge 102400 ] ; then
SUBJECT="SYSLOG TOO LONG"
fi
[ -z "\$SUBJECT" ] && { rm event22.txt ; exit 0 ; }
DATE="\$(date)"
cat /var/log/messages > messages.txt
echo "Fritz!Box SYSLOG - \$DATE" > /var/log/messages
echo -e "StatusMail\nFritz!Box\n${USER_NAME}^M^L" > statusmail.txt
cat event22.txt >> statusmail.txt
mailer -s "${SUBJECT_PREFIX:+$SUBJECT_PREFIX: }\$SUBJECT" \
-f "$SENDER&;quot; \
-t "$RECEIVER" \
-m "$SMTP_SERVER" \
-a "$MAIL_ACCOUNT" \
-w "$MAIL_PASSWORD" \
-d "statusmail.txt messages.txt"
rm statusmail.txt messages.txt event22.txt
)
sleep 300
done
exit 0
EOF
# start script
chmod +x /var/tmp/ipwaechter.sh
( sleep 90 ; /var/tmp/ipwaechter.sh & ) &
exit 0
Das Skript überprüft alle 5 Minuten ob sich die IP geändert hat oder das Syslog größer als 100kB geworden ist. Wenn ja, wird das Syslog gelöscht und der alte Inhalt per Mail an die angegebene Adresse gesendet.
Viel Spaß damit, sub
[edit] Skript zum Neustarten zu bestimmter Stunde
Vielen Dank an den Autor des obigen Skriptes "Fritz!Box sendet E-Mail bei Änderung der IP-Adresse".. Die Installation des folgenden Skripts erfolgt wie dort beschrieben. Die 3620 Sekunden bewirken, daß die Box nach dem Boot eine Stunde verstreichen läßt, bevor mit dem Skript jede Stunde (je Std. 50 Sek. früher) geprüft wird, ob die Zeit reif ist ;-) Falls mir jemand sagen kann, warum auf der Box kein at oder cron läuft, wäre ich unendlich.. dankbar - wie scheduled AVM eigentlich und kann deren Scheduler für eigene Zwecke mißbraucht werden?
#! /bin/sh
cat > /var/tmp/rebootaroundmidnight.sh <<EOF
#! /bin/sh
while true ; do
if [ \$(date +%H) -eq 0 ] ; then
reboot
fi
sleep 3550
done
EOF
# start script
chmod +x /var/tmp/rebootaroundmidnight.sh
( sleep 3620 ; /var/tmp/rebootaroundmidnight.sh & ) &
exit 0
Viel Spaß damit, cmuelle8
(Zwei kleinere Korrekturen, damit es überhaupt läuft, chmartin)
Testbar mit viel Geduld und einer Win XP cmd Konsole via
cmd /v for /L %i in (0,0,1) do @ping 192.168.178.1 -n 1 -s 3 | find "Zeitüberschreitung" && echo !TIME! || choice /cxy /tx,1 > nul
[edit] Internet: Trennen und sofortige Neueinwahl
[edit] shell (per telnet)
Wenn der telnetd aktiviert ist, kann man sich auf der Fritz!Box einloggen und erhält so einen Shell-Zugang. Über die Shell kann man den dlsd stoppen und neu starten. Man erhält dabei eine neue IP-Adresse.
dsld -s dsld -n
[edit] cURL
Am einfachsten geht das wahrscheinlich mit cURL (gibt's für nahezu alle Plattformen):
curl "http://fritz.box:49000/upnp/control/WANIPConn1" -H 'Content-Type: text/xml; charset="utf-8"' -H 'SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination' -d '<?xml version="1.0" encoding="utf-8"?> <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" /> </s:Body> </s:Envelope>'
Funktioniert mit 7050 v14.03.33 einwandfrei -- 2Bios 13:57, 27 September 2007 (CEST)
[edit] Perl
Nachfolgend die Lösung mit Perl.
# geschrieben für/auf M$ Windows XP SP2 mit Perl v5.8.2,
# aber ich bin ganz sicher dass es sich in nullkommanix auf
# andere betriebssysteme portieren lässt :)
#
# getestet mit FritzBox SL WLAN 3020 mit 1&1 Branding und Firmware 09.03.87 & 09.04.07
# keine ahnung ob es auch mit anderen boxen funktioniert...
use Net::FTP;
use LWP 5.64;
my $browser = LWP::UserAgent->new;
use POSIX;
($action)=@ARGV;
$boxpasswort
my $locale = POSIX::setlocale(&POSIX::LC_ALL, "deu");
my @tm = localtime(time());
my $urlcgi = 'http://fritz.box/cgi-bin/webcm';
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
"login:command/password" => "$boxpasswort"
],
);
# my $response = $browser->get( $urllog );
# disconnect
#if ($action eq "0") {
my $response = $browser->post( $urlcgi,
[
"connection0:pppoe:settings/idle" => "5",
"connection0:pppoe:settings/mode" => "on_demand"
],
);
# reconnect
#} elsif ($action eq "1") {
my $response = $browser->post( $urlcgi,
[
"connection0:pppoe:settings/idle" => "0",
"connection0:pppoe:settings/mode" => "lcp"
],
);
# }
print "reconnected";
Hier habe ich noch ein paar Modifikationen durchgeführt, u.a. eine Überprüfung, ob das Passwort akzeptiert wurde:
# geschrieben für/auf M$ Windows XP SP2 mit Perl v5.8.2,
# aber ich bin ganz sicher dass es sich in nullkommanix auf
# andere betriebssysteme portieren lässt :)
# getestet mit FritzBox SL WLAN 3020 mit 1&1 Branding und Firmware 09.03.87 & 09.04.07
# keine ahnung ob es auch mit anderen boxen funktioniert...
#
# Umgeschrieben auf/für Unix, Unix klappt, Windows sollte auch klappen :)
use Net::FTP;
use Net::Ping;
use LWP 5.64;
my $browser = LWP::UserAgent->new;
$p = Net::Ping->new("tcp");
use POSIX;
($action)=@ARGV;
my $locale = POSIX::setlocale(&POSIX::LC_ALL, "deu");
my @tm = localtime(time());
$i = 0;
$c = 0;
if ($#ARGV != 0) {
print "Fritz!Reconnect\n###############\n\n";
print "Anwendung: perl ";
print $0;
print " \"Passwort\"\n";
print "Zum Modifizieren einfach den Editor (Windows) bzw vi (Unix) benutzen.\n";
exit;
}
# Hier ggf ein bisschen modifizieren
$boxpasswort = @ARGV[0]; #Oder anstelle von @ARGV[0] einfach "Passwort" eingeben um nicht jedesmal das Passwort mitliefern zu müssen
$sleeptime = 2; #Zeit die die Fritzbox benötigt um sich zu trennen/den Trennen-Befehl zu verarbeiten, einfach höhere Werte verwenden, sollte es zu Problemen kommen
$host = "www.jabber.org"; # Host zum überprüfen ob die Verbindung bereits wiederhergestellt wurde, kann auch google.com oder sonstwas sein, Hauptsache hohe Uptime
$maxtimetowait = 1; # Zeit zwischen Pings
$maxpings = 1000; # Maximale Anzahl an Pings
$keyword = "ungültig"; #Falsch-Schlüsselwort, wird verwendet um das angegebene Passwort zu überprüfen, z.b ungültig, vergessen, falsch usw
my $urlcgi = 'http://fritz.box/cgi-bin/webcm'; #die URL zur Fritzbox, sollte so stimmen
# Hier nichts mehr ändern
print "Fritz!Reconnect\n###############\n\n";
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
"login:command/password" => "$boxpasswort"
],
);
if (index($response->content,$keyword) != -1)
{
print "Falsches Passwort angegeben, bitte überprüfen und korrigieren. :(\n";
exit;
}
my $response = $browser->post( $urlcgi,
[
"connection0:pppoe:settings/idle" => "5",
"connection0:pppoe:settings/mode" => "on_demand"
],
);
my $response = $browser->post( $urlcgi,
[
"connection0:pppoe:settings/idle" => "0",
"connection0:pppoe:settings/mode" => "lcp"
],
);
sleep($sleeptime);
while($i < $maxpings)
{
($ret, $duration, $ip) = $p->ping($host);
if($ret==1)
{
print "Ihre Fritz!Box wurde erfolgreich neu verbunden! :)\n";
exit;
}
else
{
$timetowait = rand($maxtimetowait) + 1;
sleep($timetowait);
$i++;
}
}
$p->close();
--Elron 18:19, 27 Aug 2006 (CEST) --Coe 14:52, 1 Jun 2006 (CEST) Funktioniert mit 7050 v14.04.06 --Kornkator2 14:06, 10 Jul 2006 (CEST)
Für das obige Perl-Script unter Mac OS X gibt es hier eine Anleitung: [4]
-- Aze 13:58, 20 August 2007 (CEST)
[edit] PHP
Hier noch eine PHP-Variante, die unter OSX Tiger ohne Perl/libwww funktioniert: (Sollte eigentlich auf jedem System mit PHP 4.x funktionieren, ggf Pfad zu PHP anpassen...)
#!/usr/bin/php -q
<?php
// Config
$conf = array(
"ip" => "fritz.box", // or 192.168.178.1
"password" => "", // use --password=SECRET
"sleeptime" => 30, // time to wait in seconds
"verbose" => false // verbose mode
);
/*
***
*
* FritzBox-IP-Reset.php
*
* Version 0.1 - Aug 28, 2007
*
* Copyrigth (c) 2007 Matthias Mueller <matthias@ixplosive.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
***
*/
/*
this script is based on a perl script which is available here:
http://www.wehavemorefun.de/fritzbox/index.php/Hilfsprogramme_/_Tip \
ps_%26_Tricks#Internet:_Trennen_und_sofortige_Neueinwahl_.28wg._IP_o..C \
3.A4._-_Curl_oder_Perl.29
(sorry, url is very long...)
tested on
- Mac OS X 10.4.10 (Intel) with built-in
PHP 4.4.7 (cli) (built: Jul 10 2007 10:54:32) and
FRITZ!Box Fon WLAN 7170 (UI), Firmware-Version 29.04.37
(Aug 28, 2007)
how to install:
open Terminal.app
$ cd ~
$ ls Fritz*
FritzBox-IP-Reset.php
$ sudo cp FritzBox-IP-Reset.php /usr/bin/ipreset
$ sudo chmod +x /usr/bin/ipreset
usage:
open Terminal.app
$ ipreset --help
*/
/* Do not edit if you don't know what you are doing! */
$version = "Fritz!Box IP Reset 0.1\n";
$help = $version.
"Usage: $argv[0] [options]\n".
" --password=PASSWORD Fritz!Box password\n".
" --verbose verbose mode on\n".
" -h, --help display this help and exit\n".
" -v, --version output version information and exit\n";
function println($str) {
echo $str."\n";
}
function getpw() {
echo "Fritz!Box Password: ";
if (function_exists("ncurses_noecho"))
ncurses_noecho();
$password = trim(fgets(STDIN));
if (function_exists("ncurses_echo"))
ncurses_echo();
return $password;
}
function getip() {
$content = file_get_contents("http://ip-adress.com/");
$pattern = '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/';
preg_match($pattern, $content, $matches);
return array_pop($matches);
}
function request($host, $path, $referer, $vars, $port = 80, $timeout = 10) {
global $conf;
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$fp) {
println("error");
println("$errstr ($errno)");
} else {
foreach ($vars as $key => $value)
$data .= $key."=".$value."&";
$data = substr($data, 0, -1);
if ($conf['verbose']) println("> connection status: connection open");
fwrite($fp, "POST $path HTTP/1.1\n");
fwrite($fp, "Referer: $referer\n");
fwrite($fp, "Content-type: application/x-www-form-urlencoded\n");
fwrite($fp, "Content-length: ".strlen($data)."\n");
fwrite($fp, "Connection: close\n\n");
fwrite($fp, $data);
if ($conf['verbose']) println("> connection status: data sent");
while (!feof($fp))
$result .= fgets($fp, 128);
if ($conf['verbose']) println("> connection status: response read");
fclose($fp);
return $result;
}
}
function wait() {
global $conf;
if ($conf['verbose']) println("> sleep ".$conf['sleeptime']." sec");
print("> please wait ");
for ($i=0; $i<$conf['sleeptime']; $i++) {
sleep(1);
print(".");
}
print(" done!\n");
}
function ipreset($password) {
global $conf;
// needed vars for http request
$referer = "fritz.box/cgi-bin/webcm?getpage=../html/index_inhalt.html";
$host = "fritz.box";
$path = "/cgi-bin/webcm";
// connect to Fritz!Box
$vars = array(
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
"login:command/password" => $password
);
if ($conf['verbose']) println("> connecting to box");
$result = request($host, $path, $referer, $vars);
if (preg_match('/Kennwort ist ung/iU', $result)) {
if ($conf['verbose']) println("> box response: password false");
fwrite(STDERR, "> ERROR: Wrong Password!\n");
$password = getpw();
ipreset($password);
} else {
if ($conf['verbose']) println("> box response: password true");
}
// Set PPPoE mode to on demand
$vars = array(
"connection0:pppoe:settings/idle" => "5",
"connection0:pppoe:settings/mode" => "on_demand"
);
if ($conf['verbose']) println("> setting pppoe mode to on demand");
$result = request($host, $path, $referer, $vars);
// Set PPPoE mode to lcp
$vars = array(
"connection0:pppoe:settings/idle" => "0",
"connection0:pppoe:settings/mode" => "lcp"
);
if ($conf['verbose']) println("> setting pppoe mode to lcp");
$result = request($host, $path, $referer, $vars);
// Status
println("> reconnect in progress");
// Wait for reconnect
wait();
}
if ($argv[1] == "-h" || $argv[1] == "--help")
die($help);
if ($argv[1] == "-v" || $argv[1] == "--version")
die($version);
if (!$conf['password'] && preg_match('/\-\-password=/iU', $argv[1]))
$conf['password'] = substr($argv[1], strlen("--password="));
if (!$conf['password'] && preg_match('/\-\-password=/iU', $argv[2]))
$conf['password'] = substr($argv[2], strlen("--password="));
if ($argv[1] == "--verbose" || $argv[2] == "--verbose")
$conf['verbose'] = true;
if (!$conf['password'])
$conf['password'] = getpw();
// ip reset
println("> current IP: ".getip());
ipreset($conf['password']);
println("> new IP: ".getip());
?>
-- Aze 20:19, 28 August 2007 (CEST)
[edit] expect
Wenn telnet aktiv ist, geht das auch mit expect:
#!/usr/bin/expect -f
proc getpass {prompt} {
set sttyOld [stty -echo raw]
send_user $prompt
set timeout -1
set passwd ""
expect {
-re "\r" {
send_user \r\n
} -re "\010|\177" {
if {[string length $passwd] > 0} {
# not all ttys support destructive spaces
send "\010 \010"
regexp (.*). $passwd x passwd
}
exp_continue
} -re . {
send_user *
append passwd $expect_out(0,string)
exp_continue
}
}
eval stty $sttyOld
return $passwd
}
set pass [ getpass "Fritz!Box Password: " ]
spawn telnet fritz.box
expect "Fritz!Box web password: "
send "$pass\r"
expect "#"
send "/sbin/dsld -s\r"
expect "#"
send "/sbin/dsld\r"
expect "#"
send "\r"
expect "#"
send "exit\r"
expect "Connection closed by foreign host."
exit
[edit] Netcat
Mit dem Tool Netcat kann man ebenso die Verbindung trennen. Hinweis: Viele Antiviren-Programme sehen das Tool als Gefährdung an und warnen davor.
#!/bin/bash
cat <<END | nc -w 1 fritz.box 49000 > /dev/null
POST /upnp/control/WANIPConn1 HTTP/1.1
HOST: fritz.box:49000
SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination"
CONTENT-TYPE: text/xml ; charset="utf-8"
Content-Length: 293
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
</s:Body>
</s:Envelope>
END
[edit] Fox!Box (Firefox Add-on)
Nachfolgend eine Lösung als Add-on für Mozilla Firefox. Das Add-on verfügt zur Zeit über folgende Funktionen:
- Schneller Reconnect per Mausklick
- Anzeige der aktuellen externen/öffentlichen IP-Adresse in der Firefox Statusleiste
Weitere Informationen & Download: https://addons.mozilla.org/de/firefox/addon/5681
-- Leland Grunt 09:48, 3. Oktober 2008 (CEST)
[edit] Logfile von der Box holen und auf der Festplatte und auf Webserver oder lokal sichern (Perl)
# geschrieben für/auf M$ Windows XP SP2 mit Perl v5.8.2,
# aber ich bin ganz sicher dass es sich in nullkommanix auf
# andere betriebssysteme portieren lässt :)
#
# getestet mit FritzBox SL WLAN 3020 mit 1&1 Branding und Firmware 09.03.87 & 09.04.07
# keine ahnung ob es auch mit anderen boxen funktioniert...
# das alles brauchen wir
use Net::FTP;
use LWP 5.64;
use POSIX;
# das auch
my $browser = LWP::UserAgent->new;
my $locale = POSIX::setlocale(&POSIX::LC_ALL, "deu");
my @tm = localtime(time());
# ein paar einstellungen vornehmen...
# dateiname und -pfad
$logdateiname = 'router.log';
$logdateipfad = 'C:/hier/solls/hin/';
# passwort zur fritzbox
$boxpasswort = "fritz-box-passwort";
# urls zur box
my $urlcgi = 'http://fritz.box/cgi-bin/webcm';
my $urllog = 'http://fritz.box/cgi-bin/webcm?getpage=../html/de/system/ppSyslog.html&var:lang=de';
# anmeldung
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
"login:command/password" => "$boxpasswort"
],
);
my $response = $browser->get( $urllog );
$logcontentraw = $response->content;
@logcontent = split(/\n/,$logcontentraw);
@logcontent = sort {lc($a) cmp lc($b)} @logcontent;
$condition1 = '<p class="log">';
$condition2 = '</p>';
$condition3 = 'ü';
$timeprintlog = POSIX::strftime("%y.%m.%d", @tm);
# jetzt wird das logfile geschrieben
open (ROUTERLOGWRITE, ">>$logfile");
# das Format wird sein: Datum (YY.MM.TT) Uhrzeit (HH:MM:SS) Fehlermeldung
foreach $logcontentline (@logcontent) {
if ($logcontentline =~ /$condition1/) {
# ggf WLAN-anmeldungen ausblenden (ich brauche sie zumindest nicht)
if ($logcontentline =~ /WLAN/) {
# nix ;O
} else {
$logcontentline =~ s/$condition1//;
$logcontentline =~ s/$condition2//;
# hier wird das ü (aus "Zeitüberschreitung") in menschenlesbares ü geändert
$logcontentline =~ s/$condition3/ü/;
# und hier wird der letzte digit der ip (bla.bla.bla.*) maskiert
$logcontentline =~ s/^.*? //;
$logcontentline =~ s/\d*, DNS-Server/\*, DNS-Server/;
print ROUTERLOGWRITE $timeprintlog . " " . $logcontentline . "\n";
}
}
}
open (ROUTERLOGWRITE);
# jetzt den log noch aus der box löschen
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
"logger:command/clear" => "1",
"login:command/password" => "$boxpasswort"
],
);
# und ggf per ftp auf einen webserver hochladen
$cntip = "irgendeinserver.de";
$cntport = "21";
$cntlogin = "ftpbenutzername";
$cntpass = "ftppasswort";
$cntpath = "/pfad/ohne/slash/am/ende";
$cntipnport = $cntip . "\:" . $cntport;
print "\n\=\> connecting";
$ftp = Net::FTP->new($cntipnport) or die '=> no connection';
$ftp->login($cntlogin,$cntpass);
print "\n\=\> logged in\n";
$ftp->cwd($cntpath);
# vorher die datei vom server löschen
$ftp->delete("$logdateiname");
print "\=\> uploading\n";
# und den aktualisierten log hochladen
$ftp->put("$logdateipfad/$logdateiname");
print "\=\> done\n";
$ftp->quit;
# jetzt noch in notepad öffnen und das ergebnis bestaunen
chdir "$logdateipfad";
exec "notepad.exe $logdateiname";
# fertig
ich hoffe das ist halbwegs verständlich und hilfreich... --Coe 20:39, 10 May 2006 (CEST)
[edit] Nachtschaltung per Doppelklick (für Schichtarbeiter - soll es ja geben! - Perl)
# geschrieben für/auf M$ Windows XP SP2 mit Perl v5.8.2,
# aber ich bin ganz sicher dass es sich in nullkommanix auf
# andere betriebssysteme portieren lässt :)
#
# getestet mit FritzBox SL WLAN 3020 mit 1&1 Branding und Firmware 09.03.87 & 09.04.07
# keine ahnung ob es auch mit anderen boxen funktioniert...
use Net::FTP;
use LWP 5.64;
my $browser = LWP::UserAgent->new;
use POSIX;
# erstes argument nach dem dateinamen ist eine zahl 0 bis 3
#
# 0 = "nachtschaltung" aus
# 1 = "nachtschaltung" für nachtschicht
# 2 = "nachtschaltung" für frühschicht
# 3 = "nachtschaltung" für spätschicht
#
# zb C:\nachtschaltung.pl 0
# schaltet dieselbe komplett aus
($action)=@ARGV;
my $locale = POSIX::setlocale(&POSIX::LC_ALL, "deu");
my @tm = localtime(time());
my $urlcgi = 'http://fritz.box/cgi-bin/webcm';
my $urllog = 'http://fritz.box/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&errorpage=../html/de/menus/menu2.html&var:lang=de&var:pagename=nacht&var:errorpagename=nacht&var:menu=system&var:pagemaster=&time:settings/time=1147209353,-120';
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/index.html",
"var:lang" => "de",
"var:pagename" => "home",
"var:menu" => "home",
# klar! wird zwar im klartext übertragen aber was solls... wer snifft schon ;)
"login:command/password" => "fritzboxpassworthier"
],
);
my $response = $browser->get( $urllog );
# "nachtschaltung" kondition 0 = aus
if ($action eq "0") {
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/de/menus/menu2.html",
"var:lang" => "de",
"var:pagename" => "nacht",
"var:errorpagename" => "nacht",
"var:menu" => "system",
"box:settings/night_time_control_enabled" => "0"
],
);
# "nachtschaltung" kondition 1 = nachtschicht
} elsif ($action eq "1") {
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/de/menus/menu2.html",
"var:lang" => "de",
"var:pagename" => "nacht",
"var:errorpagename" => "nacht",
"var:menu" => "system",
"box:settings/night_time_control_enabled" => "1",
# startzeit
"box:settings/night_time_control_off_time" => "21:35",
# endzeit
"box:settings/night_time_control_on_time" => "6:15",
"box:settings/night_time_control_ring_blocked" => "0",
"wlan:settings/night_time_control_enabled" => "1"
],
);
# "nachtschaltung" kondition 2 = frühschicht
} elsif ($action eq "2") {
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/de/menus/menu2.html",
"var:lang" => "de",
"var:pagename" => "nacht",
"var:errorpagename" => "nacht",
"var:menu" => "system",
"box:settings/night_time_control_enabled" => "1",
# startzeit
"box:settings/night_time_control_off_time" => "22:30",
# endzeit
"box:settings/night_time_control_on_time" => "13:15",
"box:settings/night_time_control_ring_blocked" => "0",
"wlan:settings/night_time_control_enabled" => "1"
],
);
# "nachtschaltung" kondition 3 = spätschicht
} elsif ($action eq "3") {
my $response = $browser->post( $urlcgi,
[
"getpage" => "../html/de/menus/menu2.html",
"errorpage" => "../html/de/menus/menu2.html",
"var:lang" => "de",
"var:pagename" => "nacht",
"var:errorpagename" => "nacht",
"var:menu" => "system",
"box:settings/night_time_control_enabled" => "1",
# startzeit
"box:settings/night_time_control_off_time" => "13:45",
# endzeit
"box:settings/night_time_control_on_time" => "21:45",
"box:settings/night_time_control_ring_blocked" => "0",
"wlan:settings/night_time_control_enabled" => "1"
],
);
}
print "ok!";
# wer mag kann ja noch eine schöne ausgabe basteln... für mich reichts
ich hoffe das ist halbwegs verständlich und hilfreich... --Coe 20:39, 10 May 2006 (CEST)
[edit] Anrufliste von der Box holen (Beispiel für neues Loginverfahren mit SID)
Ab der Firmware .76 verwendet die Fritzbox ein neues Loginverfahren. Login mit Passwort geht per Script nicht mehr so einfach. Nach dem Login muss man immer eine SID im Request übergeben. Das Password wird auch nicht mehr im Klartext übermittelt. (http://www.avm.de/de/Extern/Technical_Note_Session_ID.pdf) Das Passwort (+Challenge) wird als MD5 Hash eines UTF16LE (!) Strings übergeben.
#!/bin/sh
# Challenge abholen
ChallengeXML=`wget -O - "http://fritz.box/cgi-bin/webcm?getpage=../html/login_sid.xml" 2>/dev/null| grep Challenge`
Challenge=`echo $ChallengeXML | awk '{match($0,/>[^<>]+</); print substr($0,RSTART+1,RLENGTH-2)}'`
Passwd="xxxxx"
# login aufbauen und hashen
CPSTR="$Challenge-$Passwd"
MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
RESPONSE="$Challenge-$MD5"
POSTDATA="login:command/response=$RESPONSE&getpage=../html/de/menus/menu2.html"
# login senden und SID herausfischen
SID=`wget -O - --post-data="$POSTDATA" "http://fritz.box/cgi-bin/webcm" 2>/dev/null| grep "name=\"sid\"" | head -1 | awk '{match($0,/value="[^"]+"/); print substr($0,RSTART+7,RLENGTH-8)}'`
# refresh der daten auslösen
wget -O /dev/null "http://fritz.box//cgi-bin/webcm?sid=$SID&getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Apagename=foncalls&var%3Aerrorpagename=foncalls&var%3Amenu=home&var%3Apagemaster=&var%3Aactivtype=pppoe&var%3AtabInetstat=0&var%3Aweckernr=&logger%3Asettings%2Ffilter=2"
# CSV runterladen
wget -O ../fb_anrufliste.csv "http://fritz.box/cgi-bin/webcm?sid=$SID&getpage=..%2Fhtml%2Fde%2FFRITZ%21Box_Anrufliste.csv" 2>/dev/null
[edit] lokale DNS-Einträge für Linux-clients
Endlich funktioniert es... das verhalten vom MultiD ist ziemlich unlogisch hier: Der "host-name" wird nämlich ignoriert, solange es nicht auch einen "client identifier" (das ist übrigens das letzte Feld in der multid.leases) gibt. IMHO ist das ein bug... Windows sendet halt einfach immer "hex 01 + MAC" als client identifier, deswegen geht das da.
Jedenfalls: wenn ihr dhclient3 verwendet, sollte es reichensend dhcp-client-identifier "beispiel";in die dhclient.conf einzufügen.
Es scheint jedoch nicht mit dhcpcdzu funktionieren. Sobald man
DHCLIENT_CLIENT_ID = "host"in
/etc/sysconfig/network/dhcp setzt, bekommt das System (SuSE 10.0) keine IP Addresse mehr.
Wenn man dem dhcpcd-Kommando den flag "-h <hostname>' mitgibt, landet dieser Name in der Datei /var/flash/multid.leases auf der Fritz-Box. Nach einem Neustart der Box sieht man diesen Namen dann auch im Webinterface unter System->Netzwerkgeräte. Es sieht so aus, als ob der multid-Prozess Änderungen an der Datei wohl nur nach einem Neustart übernimmt. Neue Einträge werden aber wohl gleich hinzugefügt. Ich hole mit die IP beispielsweise so (wlan0, weil ich ndiswrapper benutze):
dhcpcd -h pc-name wlan0
Anschließend funktioniert bei mir auch das Pingen anderer Linux-PCs mittels des Hostnamens.
Ergänzung: mit dem Eintrag
DHCLIENT_HOSTNAME_OPTION="AUTO"
/etc/sysconfig/network/dhcp funzt es auf meiner
niegelnagelneuen 7170 mit OpenSuse 10.1 einwandfrei. (Dadurch wird im Endeffekt dhcpcd -h **name aus /etc/HOSTNAME** aufgerufen)
[edit] Skript zum Wählen von Telefonnummern vom PC
Seit der Version xx.xx.90 kann bei den FON-Boxen eine Telefonnummer im Webinterface durch Klick in die Anruferliste angewählt werden. Diese Funktion kann man auch nutzen, um beliebige Nummern vom PC aus anzuwählen. Ich nutze dieses, um aus KAddressbook heraus Nummern direkt anzu wählen. Funktioniert einwandfrei und vor allen Dingen ohne irgendwelche Veränderungen auf der Box. Das Skript erhält als ersten Parameter die Nummer und als zweiten die Nebenstelle, mit der das Telefonat geführt werden soll.
#!/bin/sh
password="Box-Password"
opt="getpage=../html/de/menus/menu2.html\
&var:lang=de\
&login:command/password=${password}\
&telcfg:settings/UseClickToDial=1\
&telcfg:command/Dial=${1}\
&telcfg:settings/DialPort=${2}"
if [ "${2}" = "" ]; then
echo ${0}": <Nummer> <Anschluss-Id>"
exit 0
fi
echo -e "$opt" \
| lwp-request -m POST -s http://fritz.box/cgi-bin/webcm·
lwp-request ist bei Debian im paket libwww-perl
Leider noch ein Bug. Man muss den aufruf zweimal machen, einmal um sich zu authentifizieren, einmal um den anruf auszulösen. Kümmere mich da die Tage drum. --Creature 15:05, 5 Mar 2006 (CET)
Das habe ich mal in eine Firefox-Extension Fritz!BoxDial Wählhilfe für Mozilla-Firefox getan. Für Mac, Linux, M$, ... Danke für die Anregung --charles17
Frage: Bekommt das jemand umgemodelt, damit es unter Outlook funktionert? --tabu 11:38, 17 Nov 2005 (CET)
Antwort: Outlook Wählhilfe oder besser noch FBF Callto (weil programmunabhängig)
Von FRITZ! selbst wird es im Mai06 ein TAPI Interface geben: AVM Tapi f. MS
[edit] Erweitertes Wählskript
Ich habe eine erweiterte Form des oben beschriebenen Skripts erstellt, die nun (2009-09-29) auch auf das 2009 von AVM eingeführte Anmeldeverfahren mit Session-ID eingestellt ist. Es funktioniert prima auch als Wählkommando für Kontact. Es müssen nur die Variablen "password" und "dialport" individuell angepasst werden. Eine Xdialog-Box und ein Klang informieren darüber, wann mensch den Hörer abnehmen kann.
Bitte ladet das Skript herunter von download.schniewindnetz.de/LINUX/fritzdial.sh[5] . Dort steht immer die aktuelle Version zur Verfügung - möglicherweise werden noch Fehlfunktionen auftreten. Das ursprünglich von mir hier im Quelltext angegebene Skript in der alten (nun nicht mehr voll funktionsfähigen Version) habe ich aus diesem Beitrag entfernt. --mas 19:16, 29 September 2009 (CEST)
#PHP Script um mal kurz anklingeln zu lassen.
#(z.B. cool zusammen mit nem pop3-Robot. Kurz anklingeln wenn ne wichtige Mail da ist.)
shortring('01791234567');
function shortring($nr,$sth=15){
dialrequest($nr);
sleep($sth);
hanguprequest();
}
function dialrequest($nr,$pass='',$port='1'){
$data='login%3Acommand%2Fpassword='.$pass.'&telcfg%3Asettings%2FUseClickToDial=1&telcfg%3Acommand%2FDial='.$nr.'&telcfg%3Asettings%2FDialPort='.$port.'&getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.htm';
$fp=fsockopen('fritz.box',80);
fputs($fp,"POST /cgi-bin/webcm HTTP/1.1\n");
fputs($fp,"Host: fritz.box\n");
fputs($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs($fp,"Content-length: ".strlen($data)."\n");
fputs($fp,"Connection: close\n\n");
fputs($fp,"$data\n");
while(!feof($fp))$res.=fgets($fp,128);
fclose($fp);
return $res;
}
function hanguprequest($pass='',$port='1'){
$data='login%3Acommand%2Fpassword='.$pass.'&telcfg%3Asettings%2FUseClickToDial=1&telcfg%3Acommand%2FHangup=&telcfg%3Asettings%2FDialPort='.$port.'&getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.htm';
$fp=fsockopen('fritz.box',80);
fputs($fp,"POST /cgi-bin/webcm HTTP/1.1\n");
fputs($fp,"Host: fritz.box\n");
fputs($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs($fp,"Content-length: ".strlen($data)."\n");
fputs($fp,"Connection: close\n\n");
fputs($fp,"$data\n");
while(!feof($fp))$res.=fgets($fp,128);
fclose($fp);
return $res;
}
Hier habe ich mal besagte POP3-Robot Idee umgesetzt. (Könnte man vielleicht oben im Inhaltsverzeichnis verlinken)
<?php
# This script checks your pop3 mailboxes if there are new mails.
# If at least one new mail arrived it will call your phone (once) for a few seconds.
# You can store all passwords scrambled with the rot function so they aren't
# completely plaintext in the sourcecode. Use the next line to generate the rot'ed password:
# echo rot('password',3);exit;
#-------------------------------------------------------------------------------
$interval=15; #time in minutes between mailchecks
$phonenr='01791234567'; #number to dial on new mail
$hangupdelay=16; #seconds to wait till hangup
$fritzpassword=rot('sdvvzrug',-3); #fritzboxpassword if you have one
$accounts=array(
array('server'=>'pop.someserver.com','port'=>110,'user'=>'username123','password'=>rot('sdvvzrug',-3)),
array('server'=>'pop3.otherhost.net','port'=>110,'user'=>'username213','password'=>rot('sdvvzrug',-3)),
array('server'=>'mail.anotherone.org','port'=>110,'user'=>'username321','password'=>rot('sdvvzrug',-3))
# you can add as many accounts as you like here.
);
################################################################################
$uidls=array_fill(0,count($accounts)-1,array());
$std=fopen("php://stdout","w");
set_time_limit(0);
while(true){
$newmail=false;
foreach($accounts as $k=>$v){
##### Get uidls and check if we got new mail #####
$auidls=getuidls($v['server'],$v['port'],$v['user'],$v['password']);
foreach($auidls as $u){
if(!in_array($u,$uidls[$k])){
$uidls[$k][]=$u;
$newmail=true;
}
}
##### Kill local id-copies of already received mails #####
foreach($uidls[$k] as $kk=>$vv){
fwrite($std,"Message $vv is no longer in mailbox of ".$v['user'].". Killing local id stamp.\n");
if(!in_array($vv,$auidls))unset($uidls[$kk]);
}
}
##### If we got new mail let the phone ring #####
if($newmail){
fwrite($std,"New mail arrived!\n");
shortring($phonenr,$hangupdelay,$fritzboxpassword);
}else fwrite($std,"No new mail.\n");
##### Sleep until next job #####
sleep($interval*60);
}
################################################################################
function getuidls($serv,$port,$user,$pass){
global $std;
$sock=fsockopen($serv,$port);
if(!$sock)return false;
$x=getdata($sock);
if(!isok($x))return false;
##### Connection ok, send username #####
fwrite($sock,"user $user\r\n");
$x=getdata($sock);
if(!isok($x))return false;
##### Username ok, send password #####
fwrite($sock,"pass $pass\r\n");
$x=getdata($sock);
if(!isok($x))return false;
##### We are logged in, send uidl command #####
fwrite($sock,"uidl\r\n");
$x=getdata($sock,'.');
if(!isok($x))return false;
fclose($sock);
##### Format and return uidls now #####
$x=explode("\r\n",$x);
$uidls=array();
foreach($x as $y){
$uidl=explode(' ',$y);
if(is_numeric($uidl[0]))$uidls[$uidl[0]]=$uidl[1];
}
fwrite($std,"Mailbox $user has ".count($uidls)." uidls in box. ".date("r")."\r\n");
return $uidls;
}
#-------------------------------------------------------------------------------
function isok($x){
return substr(strtolower($x),0,3)=='+ok';
}
#-------------------------------------------------------------------------------
function rot($x,$n){
for($i=0;$i<strlen($x);$i++)$r.=chr((ord($x{$i})+$n)%255);
return $r;
}
#-------------------------------------------------------------------------------
function startswith($x,$s,$cs=false){
if(!$cs){$xx=strtolower($x);$s=strtolower($s);}else $xx=$x;
return(substr($xx,0,strlen($s))==$s)?substr($x,strlen($s)):false;
}
#-------------------------------------------------------------------------------
function getdata($sock,$ml=false,$timeout=10){
$t=time();
if(!$ml){
while(!$x&&(time()-$t<$timeout))$x=fgets($sock);
return $x;
}else{
while(rtrim($y,"\r\n")!=$ml&&(time()-$t<$timeout)){$y=fgets($sock);$x.=$y;}
return $x;
}
}
################################################################################
function shortring($nr,$sth=20,$pass=''){
$std=fopen("php://stdout","w");
fwrite($std,"\n\n\nCalling $nr...\n");
dialrequest($nr,$pass);
for(;$sth>0;$sth--){
sleep(1);
fwrite($std,".");
}
fwrite($std,"\n\nHanging up...\n\n");
hanguprequest($pass);
}
#-------------------------------------------------------------------------------
function dialrequest($nr,$pass='',$port='1') {
$data='login%3Acommand%2Fpassword='.$pass.'&telcfg%3Asettings%2FUseClickToDial=1&telcfg%3Acommand%2FDial='.$nr.'&telcfg%3Asettings%2FDialPort='.$port.'&getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.htm';
$fp=fsockopen('fritz.box',80);
fputs($fp,"POST /cgi-bin/webcm HTTP/1.1\n");
fputs($fp,"Host: fritz.box\n");
fputs($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs($fp,"Content-length: ".strlen($data)."\n");
fputs($fp,"Connection: close\n\n");
fputs($fp,"$data\n");
while(!feof($fp))$res.=fgets($fp,128);
fclose($fp);
return $res;
}
#-------------------------------------------------------------------------------
function hanguprequest($pass='',$port='1') {
$data='login%3Acommand%2Fpassword='.$pass.'&telcfg%3Asettings%2FUseClickToDial=1&telcfg%3Acommand%2FHangup=&telcfg%3Asettings%2FDialPort='.$port.'&getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.htm';
$fp=fsockopen('fritz.box',80);
fputs($fp,"POST /cgi-bin/webcm HTTP/1.1\n");
fputs($fp,"Host: fritz.box\n");
fputs($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs($fp,"Content-length: ".strlen($data)."\n");
fputs($fp,"Connection: close\n\n");
fputs($fp,"$data\n");
while(!feof($fp))$res.=fgets($fp,128);
fclose($fp);
return $res;
}
?>
[edit] Midnight Commander auf der 7050 (ohne Firmware-Mod)
Um sich auf der FON 7050 umzuschauen, kann vorübergehend der Midnight Commander (mc) auf die Box geladen werden (sollte auf allen WLAN 32 MB Boxen gehen, braucht etwa 2 MB freies RAM; bei Boxen mit 16 MB wie der 5050 wird es knapp; ist im laufenden Betrieb entfernbar); z.B. um die Dateien in /proc komfortabel mit F3 anzuschauen (1, 2).
Voraussetzung: telnet (#96*7* einschalten, aus mit 8 statt 7, jede FBF ab Firmware xx.03.96) oder ssh Zugriff auf die Box (Firmware_Modifikationen_/_Recompiling#Firmware_Files; nicht mehr empfohlen: starttelnet.image oder starttelnet_ne3c.image mit e3c/ne3c Editor statt vi/nvi, starttelnet_ne3c.txt)
cd /var wget http://www.spblinux.de/fbox/cfg_mc chmod 755 cfg_mc ./cfg_mc install
Ab sofort können alle firmware Versionen wget http://www.spblinux.de/fbox/cfg_mc verwenden und mit cfg_mc usb_install kann auf USB installiert werden; ausserdem kann mit INST_DIR=/beliebigerPfad /var/cfg_mc install in ein benutzerdefiniertes Verzeichnis installiert werden. - Ob zlib oder lzma Kompression und ob kernel 2.6 oder kernel 2.4 firmware wird automatisch erkannt.
(Die alten Versionen sind unter spblinux.de/fbox.old archiviert; mit cfg_mc -z bzw. -Z kann zlib 64 kB bzw. zlib 16 kB Kompression der sqf-Dateien erzwungen werden).
Dann kann der mc mit ./cfg_mc start (bzw. mit /var/mc/bin/mc) gestartet werden; evt. braucht es zusätzlich
export TERM=xterm stty igncr ./cfg_mc start
(mit esc 0 kommt man wieder raus, wenn F10 nicht geht; export TERM=xterm ist empfohlen; windows xp telnet hat bei mir noch stty igncr gebraucht; stty -igncr schaltet die Option, ignoriere Wagenrücklauf, wieder ab).
./cfg_mc remove
entfernt den mc wieder (als ramdisk gemountetes squash filesystem mc.sqf, 398kB, nun mit Befehl /var/mc/bin/changesqf um sqf Dateien direkt auf der Box verändern zu können)
Anmerkung: ist ein proof of concept Beispiel für aus dem Netz nachgeladene Anwendungen auf der Fritzbox, nutzbar als Werkzeug, um weitere sqf addons für die Fritzbox erstellen zu können. - spblinux 16:32, 13 Dez 2005 (CET)
4.4.06: Das scheint mit der neuesten Betaversion der 7050 (FW Version: 14.04.03-3452) nicht mehr zu funktionieren (mount failed). - Doch! Siehe oben (ist jetzt fett gesetzt, damit man es sieht - spblinux); seit dem 1.6.07 auch mit den *.3x FW Versionen für die 7050.
[edit] Anrufbeantworter (Festnetz) mit Emailversand (capircvd) auf der 7050 (ohne Firmware-Mod)
Installation wie beim oben beschriebenen Midnight Commander: statt cfg_mc cfg_capircvd verwenden. Funktioniert nur mit Festnetznummern (gleiche Einschränkungen wie bei netcapi); nur Voice-, kein Faxbetrieb (da von capi auf der Box nicht unterstützt); capircvd.sqf 160 kB, Aufnahmen auf 3 Minuten begrenzt (bis zu 1.5 MB, gzip komprimiert), Nachrichten werden nach dem Versand gelöscht (/var/spool/capircvd), mit 14.03.89 firmware getestet.
Have fun - spblinux 13:13, 14 Dez 2005 (CET)
Wo gibt es mehr Info zum AB und dem config? --oh-mark 22:02, 14 Dec 2005 (CET)
z.B. hier und in der Original capircvd.conf von capircvd-0.2.42
Wie kann das auch ein nicht-Linux User auf seiner Box Installieren?
So wie oben beschrieben! Mit der neuen Firmware (ab xx.yy.101) kann telnetd über das Telefon gestartet werden (#96*7*). Dann 'telnet 192.168.178.1' auf Kommandozeilen-Ebene (z.B. command.com) eingeben und wie oben beschrieben weiter.
[edit] Asterisk (capi intern+extern/iax2/sip) auf der 7050 (ohne Firmware-Mod)
Installation wie beim oben beschriebenen Midnight Commander: statt cfg_mc cfg_asterisk verwenden. - Hier kann man die verwendeten Konfigurationsdateien anschauen.
Update: 12.10.06 asterisk ist jetzt mit software floating point Unterstützung kompiliert. Damit sollten neu auch Module, die die FPU ansprechen, ohne Absturz laufen (allerdings langsam wegen der FPU Emulation). (In den Unterverzeichnissen old/0.7/ findet sich die vorhergehende Version)
Update: 3.6.06: SIP, IAX2 und ISDN scheinen stabil zu laufen; wenn man Module per wget nachlädt (siehe thread über asterisk und fritzbox im ip-phone-forum) dann kann es zu Instabilitäten kommen (segfaults); neu: zebedee zum verschlüsselte Tunnel erstellen in asterisk.sqf enthalten.
Asterisk braucht recht viel RAM, deshalb sollte (muss?!) wlan in der fritzbox ausgeschaltet sein (und auf der 5050 mit halb so viel RAM wie die 7050 wird es wohl nicht gehen). Mehr für die Installation unbedingt nötige Informationen stehen am Anfang der extensions.conf. In der sip.conf steht, wie man xlite konfigurieren muss (port 5061, da 5060 von der fritzbox belegt ist).
Wozu? ISDN-Telefone an Asterisk betreiben als Ersatz für die zaphfc-Lösung aus bristuff, nokia e60 direkt am asterisk auf der fritzbox anmelden, verschlüsselter Tunnel von fritzbox asterisk per iax2 zu fritzbox asterisk oder ...
Tipp: wenn sich der fritzbox-eigene sip-client direkt beim asterisk auf der fritzbox anmeldet (localhost:5061), dann wird zum Umkodieren auf den in der (asterisk) sip.conf festgelegten codec die DSP-Hardware-Unterstützung der fritzbox eingesetzt (iLBC, GSM, G726, G711a/u); asterisk selbst kann darauf nicht zugreifen; credits gehen an voipmichael aus dem ip-phone-forum).
Auf spblinux.de sind zusätzliche Sound-Dateien und Module (in fbox/sounds, fbox/modules) die man direkt per wget in die asterisk Installation auf der Box laden kann (Sound: cd /var/asterisk/var/sounds dann wget, Module: cd /var/asterisk/var/modules dann wget)
Speichern der config-Dateien (ähnlich wie bei capircvd) per ./cfg_asterisk config2flash, aus dem flash holen mit ./cfg_asterisk flash2config, flash device wieder freigeben per ./cfg_asterisk clearflash; (die Dateien liegen in /var/tmp/asterisk/ und können per /var/asterisk/bin/e3 /var/tmp/asterisk/extensions.conf etc editiert werden; ctrl+k s speichert, ctrl+k q beendet); Entfernen von asterisk per ./cfg_asterisk remove löscht die Konfigurationsdateien in /var/tmp/asterisk/ nicht und wenn in /var/tmp/asterisk/ bereits Konfigurationsdateien vorhanden sind, dann bindet ./cfg_asterisk install diese Dateien (anstelle der Standardkonfiguration) ein.
Have fun - spblinux 10:00, 14 Apr 2006 (CEST)
[edit] Dropbear und wget mit SSL auf der 7050 (ohne Firmware-Modifikationen)
Installation wie beim oben beschriebenen Midnight Commander: statt cfg_mc cfg_dropbear bzw. cfg_wgetssl verwenden. - Dropbear (116 kB) erlaubt ssh/putty Zugriff zur/von der Box (auch scp zum Dateien kopieren); alle Befehle sind mit Pfad aufzurufen (z.B. /var/dropbear/bin/scp); auch winscp funktioniert, wenn man es passend konfiguriert: Expertenmodus und nur scp im login-Fenster anhaken und dann unter scp bei Gruppen und Zeitstempel Haken entfernen (1, 2)
Wget mit SSL (640 kB) ist geeignet, wenn man private per Passwort und https geschützte Dateien vom eigenen Webserver auf die Box laden will; da wgetssl.sqf recht gross ist, unbedingt nach Verwendung wieder mit ./cfg_wgetssl remove von der Box entfernen. spblinux 15:03, 16 Dez 2005 (CET)
[edit] Entwicklertools: Swapspace vom PC (XP/Linux) und NFS-Client auf der 5050/7050 (ohne Firmware-Mod)
Installation wie beim oben beschriebenen Midnight Commander: statt cfg_mc cfg_nbdswap bzw. cfg_nfsclient verwenden. - nbdswap braucht einen nbd-server mit einer Imagedatei, die dann per Netzwerk als swapspace für die Box verwendete wird; hier sind fertig konfigurierte Beispiele mit 64 MB swap-Datei für Windows (zip-Datei, startet nach dem Entpacken automatisch) und Linux (entpacken und mit cfg_nbdserver starten). Ist nützlich zum Experimentieren. - nfsclient kann auf die Freigabe von einem nfs-server zugreifen; enthalten ist auch /var/nfsclient/bin/chroot: so lassen sich Programme, bei denen ./configure nicht auf dem cross-compiler läuft, direkt auf der Box kompilieren (wenn man zuvor swapspace eingerichtet hat).
spblinux 18:25, 17 Dez 2005 (CET)
[edit] Automatischer Check auf neuere Firmware
Kleines Tool, das auf der FritzBox täglich einmal nach neuerer Firmware auf der AVM-Seite sucht und falls gefunden eine entsprechende Mail an den Besitzer verschickt. Somit verpasst man kein wichtiges Firmware Update mehr. Zur Installation wird ein kleines tar Paket (10KB) mit den passenden Skripten von einem Webserver per wget geladen, nach /var/tmp ausgepackt, per install Skript die passenden Parameter für den Mailversand reingepatcht und der Daemon gestartet, der einmal taeglich (kann man leicht aendern) nach neuerer Firmware Ausschau hält. Die Info-Mail wird pro neuer Version nur einmal verschickt, soll ja nicht nerven. Nur nach einem Neustart der FritzBox erhält man auf jeden Fall wieder eine, wenn die Firmware nicht aktuell ist. Das ist zum einen technisch begründet aber auch Absicht. Auf Wunsch könnte man auch noch die LED blinken lassen oder ähnliches (siehe Kommentar in der Datei check_version), habe ich aber mal rausgelassen, obwohl's zu Weihnachten evtl. ganz nett gewesen wäre :)
Das ganze läuft bei mir gegen die Firmware der ersten FritzBox Fon WLAN, wenn man die URL in der Datei get_online_version ändert müsste es aber auch mit anderen FritzBoxen gehen.
Zur permanenten Installation schreibt man dann in etwa folgendes in die debug.cfg dazu:
cd /var/tmp wget http://www.meinserver.de/Downloads/version_checker-1.0.tar tar xf version_checker-1.0.tar cd version_checker-1.0 ./install 'ich@meinemail.de' 'ich@meinemail.de' 'smtp.meinemail.de' 'meinmailaccount' 'meinmailpasswort' rm -f /var/tmp/version_checker-1.0.tar
Voraussetzung: telnet Zugriff auf FritzBox
Kann hier heruntergeladen werden.
dschingiskaan 15:40, 28 Dec 2005 (CET)
[edit] Telefonbuch anzeige auf eigenem Webserver (lokal)
Es ist im Grunde eine ganze Website, die eine Anruferliste ausgibt und die Nummern gleich zu Namen sortiert, die im Telefonbuch eingetragen sind. Das Telefonbuch kann auch separat angezeigt werden. Das Script läuft bei mir momentan auf dem Abyss Webserver, kann aber auch unter Xampp oder einem anderen Server laufen, sollte nur Zugriff auf FritzBox haben (über http). Das komplette Script besteht aus 3 Dateien:
telefon.pl
#!/usr/bin/perl
use CGI qw/:standard/;
# Create a user agent object
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent("Telefonbuch");
sub get_content{
# Create a request
my $req = HTTP::Request->new(GET => "http://fritz.box/cgi-bin/webcm?getpage=../html/menus/menu2.html&var:menu=fon&var:pagename=foncalls&var:pagetitle=Anrufliste");
# Pass request to the user agent and get a response back
my $res = $ua->request($req);
# Check the outcome of the response
if ($res->is_success) {
return $res->content;
}
}
sub get_phonebook{
my %telbook = ();
return () unless(open(IN, "<", "telefonbuch.dat"));
while(<IN>){
chomp;
@elements = split("=",$_,2);
$telbook{$elements[0]} = $elements[1];
}
close(IN);
return %telbook;
}
sub uiDauerDisplay{
my $h = int($_[0]/3600);
my $rest = $_[0] % 3600;
my $m = int($rest/60);
$h = "0".$h if($h < 10);
$m = "0".$m if($m < 10);
my $str = $h.":".$m;
return $str;
}
sub interpret{
my ($page, $filter) = @_;
my %pictures = (1 => "images/callin.png",
2 => "images/callfailed.png",
3 => "images/callout.png");
my %telbook = &get_phonebook;
my $i = 0;
while ($page =~ m/class="Dialoglist".*?uiCallSymbol\("(\d)"\).*?"c3">(.*?)<.*?nummerDisplay\("(\d*)"\).*?DauerDisplay\("(\d+)"\)/gs) {
next if ($filter and $filter != $1);
my $time = &uiDauerDisplay($4);
my $witharea = (substr ($3, 0, 1) ne "0" ? "0951".$3 : $3);
print Tr(td({-class=>"line$i"}, [
"<img src='$pictures{$1}' />",
$2,
a({-href=>"buch.pl?act=edit&nr=$witharea"},$3),
$telbook{$witharea},
$time
])),"\n";
$i = 1 - $i;
}
}
print header,
start_html(-title=>'Anruferliste',
-style=>{'src'=>'style.css'}),
h1({-align=>'center'},"Anruferliste");
print "<center>\n",
a({-href=>'buch.pl'},"Zum Telefonbuch"),p,
"Anrufe anzeigen: ",
a({-href=>"?"},"alle")," ",
a({-href=>"?filter=1"},"eingehende")," ",
a({-href=>"?filter=2"},"eingehende in Abwesenheit")," ",
a({-href=>"?filter=3"},"ausgehende"),
"</center>";
print "<table align='center' cellspacing='0' cellpadding='0' style='font-size: small; font-family: verdana'>";
&interpret(&get_content, param("filter"));
print "</table>";
print end_html();
buch.pl
use CGI qw/:standard *table/;
sub get_telbook {
# mit get_telbook(1) werden die namen als hashkeys benutzt
my %telbook = ();
return () unless(open(IN, "<", "telefonbuch.dat"));
while(<IN>){
chomp;
@elements = split("=",$_,2);
$telbook{$elements[$_[0]]} = $elements[1-$_[0]];
}
close(IN);
return %telbook;
}
sub write_telbook {
my %telbook = %{$_[0]};
unless (open(OUT, ">", "telefonbuch.dat")) {
print b("Konnte die Datei telefonbuch.dat nicht zum Schreiben öffnen\n");
return;
}
foreach $nr (keys %telbook) {
next unless ($nr and exists($telbook{$nr}));
print OUT $nr."=".$telbook{$nr}."\n";
}
close (OUT);
}
sub add_to_telbook {
unless (open(OUT, ">>", "telefonbuch.dat")) {
print b("Konnte die Datei telefonbuch.dat nicht zum Schreiben öffnen\n");
return;
}
print OUT $_[0]."=".$_[1]."\n";
close (OUT);
}
print header;
print start_html(-title=>'Telefonbuch',
-style=>{'src'=>'style.css'});
print h1({-align=>center},"Telefonbuch");
print "<center>".a({-href=>'telefon.pl'}, "Zur Anruferliste")."</center>".br;
$act = param("act");
if (param("change") and param("old_nr") and param("name") and param("nr")) {
%telbook = &get_telbook;
delete $telbook{param("old_nr")};
$telbook{param("nr")} = param("name");
&write_telbook (\%telbook);
}
elsif (param("add") and param("name") and param("nr")) {
&add_to_telbook (param("nr"), param("name"));
}
print "<table align='center' cellspacing='0' cellpadding='0' style='font-size: small; font-family: verdana'>";
if ($act eq "edit") {
if (($nr = param("nr"))) {
%telbook = &get_telbook;
$name = $telbook{$nr};
}
print start_form(-action=>'?'), hidden('old_nr', $nr);
print Tr([td({-class=>'line0'},['Name:', textfield('name', $name)]),
td({-class=>'line1'},['Nummer:', textfield('nr', $nr)]),
td({-class=>'line0'},[submit(($name ? 'change' : 'add'),'Speichern'),''])]);
print end_form;
} else {
$i = 0;
%telbook = &get_telbook(1);
foreach $name (sort keys %telbook) {
print Tr(td({-class=>"line$i"},[a({-href=>'?act=edit&nr='.$telbook{$name}},$name), $telbook{$name}]));
$i = 1 - $i;
}
}
print "</table>";
print end_html();
und einer telefonbuch.dat die so aussieht:
9605748392=Max Mustermann 34546456=Susanne Schmitt
eine style.css um das ganze seinen look zu geben:
.line0{ padding-left:10px; padding-right:10px; background-color:#dddddd; }
.line1{ padding-left:10px; padding-right:10px; background-color:#eeeeee; }
a { color: #000000; }
Natürlich fehlen jetzt noch die schönen Bilder um anzuzeigen, ob derjenige angerufen hat oder du rausgerufen hast. Dazu müssen 3 Bilder erstellt werden: "callin.png","callfailed.png","callout.png", die in einem Unterordner mit dem Namen images gespeichert werden. Wenn ihr nun euer neues Telefonbuch aufruft, wird es eine Weile dauern, aber er wird ein schön sortiertes angezeigt, das ihr nun auch nach Status des Anrufes sortieren könnt. Viel Spass!
Achja noch was, ihr braucht das PERL-Modul: "LWP::UserAgent", sonst wird aus dem Spass nichts. Als ich es damals geschrieben hatte, war es nicht standardmäßig dabei, aber probiert's einfach mal aus.
Es kann auch relativ leicht dazu umgebaut werden, dass es immer in eine MySql-DB im Internet einträgt. Dann kann es relativ leicht von überall aus dem Internet abgerufen werden. moonsword 14:14, 5 Jan 2006 (CET)
-- Funktioniert das ganze auch wenn ein Passwort fürs Webinterface gesetzt ist? Wenn ich nämlich die URL im Script einfach so aufrufe komme ich immer nur zur Passwortabfrage. Falls das tatsächlich nur ohne Pw geht, gibts dann ne Möglichkeit es umzubauen, damit es auch mit Pw geht? faky 13:54, 27 Feb 2006 (CET)
-- Sollte möglich sein, wenn "login:command/password=<dein password>" in den Query-String aufgenommen wird. GGf. ist das ganze auch auf POST umzustellen, damit es läuft ?! Siehe dazu auch andere Beiträge hier am Brett. Holger 14:21, 28 Mar 2006 (CET)
"Anfängerfehler":
- "Debug" über _ irgendEineFunktion || die "Did not work: $!\n" _ möglich. $! schreibt entsprechende Fehlermeldung auf den Screen
- _ use strict; _ im Dateikopf hilft hier zwar nicht direkt, wird beim Weiterbasteln aber sicher nicht schaden
- Pfadangaben erfolgen nach dem Muster "htdocs\\xampp\\_fritz\\telefonbuch.dat", da der \ als Sonderzeichen belegt ist (vgl. Patternmatching). [klappt zumindest in Windows]
- Zudem arbeite Ich, anders als der Autor mit Xampp, was scheinbar andere Pfadangaben zu Folge hat. Der Rootorder ist hier nicht der Ordner in dem das Skript liegt (sondern vgl. pearlinfo(): SERVER["DOCUMENT_ROOT"] C:/xampp/htdocs ); es ergibt sich also ein Pfad wie oben.
- Um den korrekten Dateipfad zu finden, hilf zB. eine zeile wie: _ open(OUT, ">", "file123.txt") _. (Anschließende suche nach file123.txt offenbart den Pfad)
- Zum Quelltext der Box: Für das Telefonbuch fintet sicht sowohl tfonbuch, tfonbook, telfonbuch, fonbook, phonbook, tphonbuch etc. Strg+F bei der Pfadsuche also mit bedacht verwenden.
Anpassungen am Skript:
- telefon.pl: Was als "HTTP::Request->new(GET =>xy)" zu finden ist, wurde in der Box geändert. Diese Daten liegen bei meiner Box als xml-Datei unter 'http://fritz.box/cgi-bin/webcm?getpage=../html/de/home/foncallsdaten.xml' vor. Aber auch unter: 'http://fritz.box/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:lang=de&var:menu=home&var:pagename=foncalls'
- buch.pl: Um das Telefonbuch der Fritzbox auszulesen muss auf 'http://fritz.box/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:lang=de&var:menu=home&var:pagename=fonbuch' zugegriffen werden. Falls dieser Link nicht funktioniert genügt es wohl den Link direkt auszulesen (Beispielsweise bei installiertem Adblock, rechtsklick->Frame blockieren) copy paste..
--Lukas87 18:26, 13 March 2010 (CET)
[edit] Über neue Emails im Posteingang informieren
Die Leuchtdioden der Fritzbox laden gerade dazu ein, sie für Infos zu nutzen, die man auch brauchen kann. Indem man die Auswertung der Mailbox einem php-Skript auf irgendeinem Server überlässt, kann man sich auf der Fritzbox auf ein einfaches Shellskript beschränken. Die Sache funktioniert fein und die Skripte kann man sich hier herunterladen: Pop3 Check für die Fritzbox
[edit] FritzBox unter OS X komfortabel nutzen
Weiterer Artikel: Mac_OS_X
- Das Kieler Softwareunternehmen turingart hat eine kommerzielle Mac OS X Anwendung entwickelt, mit der die FritzBox beobachtet und Anrufe getätigt werden können. F!Watch liest sämtliche Gesprächsdaten aus und speichert sie in einer lokalen Datenbank, so dass sie auch nach Kaltstarts der Box nicht verloren gehen. Über einen Filter-Mechanismus können eingehende Anrufe z.B. per GROWL automatisch gemeldet werden. Zudem integriert sich F!Watch in das OS X Adressbuch, so dass nicht nur Nummern angezeigt werden, sondern Namen der Gesprächspartner zu sehen sind.
F!Watch Homepage F!Watch Screenshot
- Mit fritz.anrufliste bietet net.bite ein kostenloses Widget zum Anzeigen der Anrufe auf der FRITZ!Box Fon im Dashboard von Mac OS X 10.4 zum Download an.
fritz.anrufliste Download fritz.anrufliste Screenshot
- Als kostenlose Alternative könnt ihr euch auch mal JFritz anschauen. Dies kann im Grunde eigentlich das selbe, nur dass die Integration in OS X nicht ganz so schön ist. JFritz gibt es auch für Windows, Linux und Solaris.
- Eine weitere Alternative ist Dial!Fritz, das die direkte Wahl einer Nummer aus dem Adreßbuch des Mac oder MS Entourage erlaubt, ankommende Anrufe anzeigt und iTunes bei Anrufen auf Pause setzt. Außerdem können Call-by-Call Regeln aufgestellt werden.
- Auch eine kostenlose Alternative, aber mit guter OS X Integration ist Frizzix. Frizzix ist mittlerweile auch ein umfangreicher Anrufmonitor für OS X.
[edit] Anrufmonitor nutzen - Einkommende Anrufe an externes Programm melden
Die Datei read_calls.pl wird als Service gestarted.
#!/usr/bin/perl -w
#
# read_calls.pl
#
# Synopsis:
# Script is run as a service daemon. It connects to the Fritz!Box Fon Ata
# (port 1012) and receives the calling string (number of the party calling
# in). This number is passed on to another program. I.e. this could be an
# Jabber client or a "look who called list".
#
# Requirements:
# - must be able to reach tcp port 1012 on your FB
# - activate call monitor on FB by dialing #96*5*
# - required perl package
#
# Licence: GPL2
#
# History:
# ver. 0.1 - 20060401 - Lars G. Sander, Zuerich
# First public release.
# ver. 0.2 - 20060510 - Ulrich Dangel <fritzbox@spamt.net>
# Added telefon book support
# To Do:
# - beefed up security?
# - proxy functionality
# - additionally monitor calls OUT
use IO::Socket;
use strict;
# your fritz box (ip or hostname)
my $FRITZBOX="fritz.box";
my $TELEFONBUCH="$ENV{HOME}/doc/addressbook";
my $EXTPRO="/usr/bin/X11/xmessage";
#-------- NO USER SERVICABLE PARTS BELOW -------#
sub read_book {
my %book = ();
open(IN, "<", $TELEFONBUCH) || return ();
while(<IN>){
chomp;
my @elements = split(":",$_);
$book{$elements[0]}=$elements[1];
}
close(IN);
return %book;
}
my %book = &read_book;
my $sock = new IO::Socket::INET (
PeerAddr => $FRITZBOX,
PeerPort => '1012',
Proto => 'tcp'
);
die "Could not create socket: $!\n" unless $sock;
while(<$sock>) {
if ($_ =~ /RING/){
my @C = split(/;/);
my $nr="";
if (exists($book{$C[3]})) {
$nr=$book{$C[3]};
} else {
$nr=$C[3];
}
my @args = ($EXTPRO, "Anruf: ", $nr);
system(@args);
}
}
[edit] Weiterentwicklung, mit Rückwärtssuche via das-oertliche.de
#!/usr/bin/perl -w
#
# read_calls.pl
#
# Synopsis:
# Script is run as a service daemon. It connects to the Fritz!Box Fon Ata
# (port 1012) and receives the calling string (number of the party calling
# in). This number is passed on to another program. I.e. this could be an
# Jabber client or a "look who called list".
#
# Requirements:
# - must be able to reach tcp port 1012 on your FB
# - activate call monitor on FB by dialing #96*5*
# - required perl package
#
# Licence: GPL2
#
# History:
# ver. 0.1 - 20060401 - Lars G. Sander, Zuerich
# First public release.
# ver. 0.2 - 20060510 - Ulrich Dangel <fritzbox@spamt.net>
# Added telefon book support
# ver. 0.3 - 20060624 - Udo Rathje udo@familie-rathje.de
# Switched to kdialog passive Popups
# Added outgoing calls
# Added Reverse lookup
# ver. 0.4 - 20061010 - Udo Rathje udo@familie-rathje.de
# changed lookup
# ver. 0.5 - 20080808 - Robert Regn wehavemorefun.20.sgn@spamgourmet.com
# adapted to new dasoertliche.de
# ver. 0.6 - 20090708 - Robert Regn wehavemorefun.20.sgn@spamgourmet.com
# adapted again to new dasoertliche.de
# To Do:
# - beefed up security?
# - proxy functionality
#
use IO::Socket;
use strict;
# your fritz box (ip or hostname)
my $FRITZBOX="fritz.box"; # address of box
my $TELEFONBUCH="$ENV{HOME}/doc/addressbook"; # path to local adressbook
my $EXTPRO="/usr/bin/kdialog"; # path to kdialog
my $DISPLAYTIME="30"; # Display time of Popups
my $DOLOOKUPS="true"; # Reverse lookups of incoming calls (only germany, lookuptel required)
#-------- NO USER SERVICABLE PARTS BELOW -------#
sub reverse_lookup {
my $nameadr = `grep -e 'class=\"preview \".*' -e 'nbsp;.*<\/div>' /tmp/reverse_lookup`;
if (index($nameadr, "preview") != -1) {
#Name
# geht z.T bei Firmeneintraegen nicht, unklar
$nameadr =~ s/^.*onMouseOut=\"\"..>//g;
$nameadr =~ s/<span.*/, /g;
#Adresse
$nameadr =~ s/\n//g;
$nameadr =~ s/<\/div.*//g;
$nameadr =~ s/\ \;/\ /g;
$nameadr =~ s/\t//g;
$nameadr =~ s/ */ /g;
#$nameadr =~ s/\<br.*//g;
return("$nameadr");
}
return("");
}
sub read_book {
my %book = ();
open(IN, "<", $TELEFONBUCH) || return ();
while(<IN>){
chomp;
my @elements = split(":",$_);
$book{$elements[0]}=$elements[1];
}
close(IN);
return %book;
}
my %book = &read_book;
my @status;
my $frombook="false";
my $sock = new IO::Socket::INET (
PeerAddr => $FRITZBOX,
PeerPort => '1012',
Proto => 'tcp'
);
die "Could not create socket: $!\n" unless $sock;
while(<$sock>)
{
if ($_ =~ /RING/){
my @C = split(/;/);
my $nr="";
if (exists($book{$C[3]}))
{
$nr=$book{$C[3]};
$frombook="true";
}
else
{
$nr=$C[3];
$frombook="false";
}
my @args=("$EXTPRO --title \"Eingehender Anruf:\" --passivepopup \"von $nr\n(MSN: $C[4], Leitung: $C[5])\" $DISPLAYTIME &");
$status[$C[2]]="Anruf von $nr\n(MSN: $C[4], Leitung: $C[5])";
system(@args);
if (($frombook eq "false") and ($nr ne "") and ($DOLOOKUPS eq "true"))
{
my $name=reverse_lookup($nr);
chomp($name);
if (length($name)>10)
{
$status[$C[2]]="Anruf von $nr\n(MSN: $C[4], Leitung: $C[5])\n Identifiziert als:\n$name";
@args=("$EXTPRO --title \"Eingehender Anruf:\" --passivepopup \"von $nr\n(MSN: $C[4], Leitung: $C[5])\nIdentifiziert als:\n$name \" $DISPLAYTIME &");
system(@args);
print "$name \n";
}
}
}
if ($_ =~ /CALL/)
{
my @C = split(/;/);
chomp(@C);
my $nr="";
if (exists($book{$C[5]}))
{
$nr=$book{$C[5]};
}
else
{
$nr=$C[5];
}
my @args=("$EXTPRO --title \"Ausgehendes Gespäch:\" --passivepopup \"an $nr von Nebenstelle $C[3]\n(MSN: $C[4], Leitung: $C[6])\" $DISPLAYTIME &");
$status[$C[2]]="Gespräch zu $nr\n(MSN: $C[4], Leitung: $C[6])";
system(@args);
}
if ($_ =~ /DISCONNECT/)
{
my @C = split(/;/);
if ($status[$C[2]] ne "")
{
my @args=("$EXTPRO --title \"Verbindung beendet ($C[3] Sekunden):\" --passivepopup \"$status[$C[2]]\" $DISPLAYTIME &");
system(@args);
}
$status[$C[2]]="";
}
}
[edit] Bei Anruf Echtzeit-Benachrichtung an Jabber-Account senden
1. Bisheriges Skript: Statt Senden an kdialog erfolgt Aufruf von 'perl -w sendMessageToJabber'. Skript für Rückwärtssuche 'lookuptel' unverändert zu oben. Achtung: Das Örtliche hat Seiten umgebaut, deshalb funktioniert das alte Script lookuptel nicht mehr.
#!/usr/bin/perl -w
#
# read_calls.pl
#
# Synopsis:
# Script is run as a service daemon. It connects to the Fritz!Box Fon Ata
# (port 1012) and receives the calling string (number of the party calling
# in). This number is passed on to another program. I.e. this could be an
# Jabber client or a "look who called list".
#
# Requirements:
# - must be able to reach tcp port 1012 on your FB
# - activate call monitor on FB by dialing #96*5*
# - required perl package
#
# Licence: GPL2
#
# History:
# ver. 0.1 - 20060401 - Lars G. Sander, Zuerich
# First public release.
#
# ver. 0.2 - 20060510 - Ulrich Dangel <fritzbox@spamt.net>
# Added telefon book support
#
# ver. 0.3 - 20060624 - Udo Rathje udo@familie-rathje.de
# Switched to kdialog passive Popups
# Added outgoing calls
# Added Reverse lookup
# To Do:
# - beefed up security?
# - proxy functionality
#
# ver 0.3b - 20060822 - Sebastian Möller Petrus@jabber.ccc.de
# - Modified for sending messages to Jabber
# - Customized for own requirements (e.g. message content, console-output)
# - Additional requirements (package-names in Debian):
# -- libnet-jabber-perl
# -- libauthen-sasl-perl (for ssl)
# -- libxml-stream-perl
# - Revert lookup not tested (but also not changed)
# To Do:
# - Merge with ver 0.3 and use more generic message-format
#
use IO::Socket;
use strict;
# your fritz box (ip or hostname)
my $FRITZBOX="fritz.box"; # address of box
my $TELEFONBUCH="$ENV{HOME}/doc/addressbook"; # path to local adressbook
my $EXTPRO="perl -w sendMessage.pl"; # path to message-script
my $DOLOOKUPS="true"; # Reverse lookups of incoming calls (only germany, lookuptel required)
#-------- NO USER SERVICABLE PARTS BELOW -------#
sub read_book {
my %book = ();
open(IN, "<", $TELEFONBUCH) || return ();
while(<IN>){
chomp;
my @elements = split(":",$_);
$book{$elements[0]}=$elements[1];
}
close(IN);
return %book;
}
my %book = &read_book;
my @status;
my $frombook="false";
my $sock = new IO::Socket::INET (
PeerAddr => $FRITZBOX,
PeerPort => '1012',
Proto => 'tcp'
);
die "Could not create socket: $!\n" unless $sock;
while(<$sock>)
{
if ($_ =~ /RING/){
my @C = split(/;/);
my $nr="";
if (exists($book{$C[3]}))
{
$nr=$book{$C[3]};
$frombook="true";
}
else
{
$nr=$C[3];
$frombook="false";
}
my @args=("$EXTPRO 'Eingehender Anruf: von $nr\n(MSN: $C[4], Leitung: $C[5])'");
$status[$C[2]]="Anruf von $nr\n(MSN: $C[4], Leitung: $C[5])";
print(@args);
system(@args);
if (($frombook eq "false") and ($nr ne "") and ($DOLOOKUPS eq "true"))
{
my $name=`./lookuptel $nr`;
chomp($name);
if (length($name)>10)
{
$status[$C[2]]="Anruf von $nr\n(MSN: $C[4], Leitung: $C[5])\n Identifiziert als:\n$name";
@args=("$EXTPRO 'von $nr\n(MSN: $C[4], Leitung:$C[5])\nIdentifiziert als:\n$ name'");
print(@args);
system(@args);
}
}
}
if ($_ =~ /CALL/)
{
my @C = split(/;/);
chomp(@C);
my $nr="";
if (exists($book{$C[5]}))
{
$nr=$book{$C[5]};
}
else
{
$nr=$C[5];
}
my @args=("$EXTPRO 'Ausgehendes Gespäch: an $nr von Nebenstelle$C[3]\n(MSN: $C[4], Leitung: $C[6])'");
$status[$C[2]]="Gespräch zu $nr\n(MSN: $C[4], Leitung: $C[6])";
print(@args);
system(@args);
}
if ($_ =~ /DISCONNECT/)
{
my @C = split(/;/);
if ($status[$C[2]] ne "")
{
my @args=("$EXTPRO 'Verbindung beendet ($C[3] Sekunden): $status[$C[2]] '");
print(@args);
system(@args);
}
$status[$C[2]]="";
}
}
2. Neues Skript: sendMessageToJabber
#!/usr/bin/perl -w
#
# sendMessage.pl
#
# Licence: GPL2
#
use strict;
use Mail::Internet;
use Net::Jabber;
# Jabber ID that should get the message
use constant TO_RECIPIENT => 'target@jabber.org'; # JID
use constant TO_SUBJECT => 'fritzbox message'; # subject of message
# Jabber server settings
use constant FROM_SERVER => 'jabber.org'; # domain
use constant FROM_SERVER_PORT => 5223; # 5223
use constant FROM_USE_SSL => 1; # 1=use SSL, 0=no SSL
use constant FROM_USER => 'YourUserId'; # userId (JID without '@domain' part)
use constant FROM_PASSWORD => 'YourUserPw'; # password for userId
use constant FROM_RESOURCE => 'telCall'; # resource name
# Message to send
my $msg = $ARGV[0];
# Create new connection
my $connection = Net::Jabber::Client->new();
$connection->Connect("hostname" => FROM_SERVER,
"port" => FROM_SERVER_PORT,
"ssl" => FROM_USE_SSL)
or die "Connection problem ($!)\n";
my @connResult = $connection->AuthSend("username" => FROM_USER,
"password" => FROM_PASSWORD,
"resource" => FROM_RESOURCE);
if ($connResult[0] ne "ok") {
die "Error while authenticating: $connResult[0] $connResult[1]\n";
}
# Prepare message
my $msgToSend = Net::Jabber::Message->new();
$msgToSend->SetMessage("to" => TO_RECIPIENT,
"subject" => TO_SUBJECT,
"body" => join("\n", "$msg"));
# Send message
$connection->Send($msgToSend);
# Close connection after message is sent
$connection->Disconnect();
exit;
[edit] Test-Programm (nicht schön, aber es funktioniert)
Das Skript imitiert die FritzBox und schickt eine entsprechende Test-Nachricht los. Zum Verwenden muss der Client sich zu diesem Programm verbinden. Im einfachsten Fall also in 'read_calls.pl' die Zeile
my $FRITZBOX="fritz.box"; # address of box
mit
my $FRITZBOX="localhost"; # address of box
ersetzen und zuerst dieses Skript und danach den Client starten. So lässt sich das Versenden der Nachrichten und der Lookup der Telefonnummern testen. For an elaborated program example of the usage of this (and OSD phonecall monitoring, automated phone book update, and/or reverse phone number to name/address lookup do a Google search for fbfcall.pl and have a detailed look at the fbfcall FBF phone call monitor Perl script.
#!/usr/bin/perl -w
#
# fritzBoxServer.pl
#
# Licence: GPL2
#
use IO::Socket;
use strict;
warn "\nStarting fritzBoxServer..\n\n";
#ignore child processes to prevent zombies
$SIG{CHLD} = 'IGNORE';
my $sock = new IO::Socket::INET (
LocalHost => 'localhost',
LocalPort => '1012',
Proto => 'tcp',
Listen => 1,
Reuse => 1,
);
die "Could not create socket: $!\n" unless $sock;
warn "Socket created, waiting for clients\n";
my $new_sock = $sock->accept();
warn "\nClient connected, please enter test-number\n";
my $number = <stdin>;
chomp $number;
print("Sending test-call to client with entered number\n");
print $new_sock "24.08.06 21:45:14;RING;0;$number;01386000;POTS;";
close($sock);
print("\nSocket closed\n");
print("\nfritzBoxServer stopped. bye\n");
[edit] ISDN abschalten
Ist es möglich die ISDN-Funktionen abzuschalten um so Speicher zu sparen? lsmod (hier auf einer Fritz!Box FON) zeigt mehrere Module, die wohl mit ISDN zusammenhängen:
# lsmod Module Size Used by Tainted: P kdsldmod 453324 4 * isdn_fbox 523660 3 * capi 23760 10 * kernelcapi 33788 5 [isdn_fbox capi] * capiutil 15792 0 [kernelcapi] * capifs 4560 0 [capi] tiatm 89116 1 avalanche_usb 40012 1 avalanche_cpmac 82780 1 avm 42496 30 [kdsldmod tiatm avalanche_usb avalanche_cpmac]
Manuell über rmmod, evtl. über debug.cfg, käme auf einen Versuch an, die Frage ist halt, was der multid dazu sagt, wenn gewisse Schnittstellen nicht mehr verfügbar sind
[edit] Applescript: Nummer aus Max OS X Adressbuch mit Fritzbox wählen lassen
Im folgenden Script muss das Passwort (hier: pass1234) der Fritz!Box und die internen Nummer (hier: *52#) des zu wählenden Telefons eingesetzt werden. ist die Fritzbox vom Mac aus nicht mit fritz.box zu erreichen, so ist auch dieser Eintrag entsprechend abzuändern. Das Script muss im im "Address Book Plug-Ins" Verzeichnis, in der Library des aktuellen Benutzers (~/Library/Address Book Plug-Ins) gespeichert werden. z.B. als DialFritz.scpt
Wird die Telefonnummer mit der rechten Maustaste (oder mit der linken und der Apple-Taste) angeklickt, erscheint ein Menu "Dial Fritz". Wird das ausgewählt, erscheint ein Hinweis, sobald die Verbindung durch die Fritzbox ausgeführt wird.
-- NO WARRANTY -- -- THE PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT WITHOUT ANY WARRANTY. IT IS -- PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE -- ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM -- PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW THE AUTHOR WILL BE LIABLE TO YOU FOR DAMAGES, -- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR -- INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED -- INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE -- WITH ANY OTHER PROGRAMS), EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. using terms from application "Address Book" on action property return "phone" end action property on action title for p with e return "Dial Fritz" end action title on should enable action for p with e if value of e is missing value then return false else return true end if end should enable action on perform action for p with e set telephone to value of e set resultList to callFritz(telephone, "*52#") return true end perform action end using terms from -- Replace all occurences of one string for another in a text -- The trick here is to change the internal delimiter, -- spliting and joining the text -- on replaceString(theText, oldString, newString) set AppleScript's text item delimiters to oldString set tempList to every text item of theText set AppleScript's text item delimiters to newString set theText to the tempList as string set AppleScript's text item delimiters to "" return theText end replaceString on callFritz(telephone, dialport) set Cmd to "/usr/bin/curl " set cgiurl to " http://fritz.box/cgi-bin/webcm" set telephone to replaceString(telephone, " ", "") set CmdLogin to "-d getpage=../html/de/menus/menu2.html -d var:lang=de -d login:command/password=pass1234 -d telcfg:settings/UseClickToDial=1" set RetMessage to do shell script Cmd & CmdLogin & cgiurl if RetMessage is not equal to "" then display dialog "ERROR: " & RetMessage buttons "OK" default button "OK" return end if set CmdDial to "-d getpage=../html/de/menus/menu2.html -d var:lang=de -d telcfg:settings/UseClickToDial=1 -d telcfg:command/Dial=" & telephone & " -d telcfg:settings/DialPort=" & dialport set RetMessage to do shell script Cmd & CmdDial & cgiurl if RetMessage is not equal to "" then display dialog "ERROR: " & RetMessage buttons "OK" default button "OK" return end if display dialog "Die Nummer " & telephone & " wird angerufen!" & return & "Bitte Telefon mit der Nummer " & dialport & " abnehmen!" buttons "OK" default button "OK" end callFritz end
Alternativ zu der Zeile ganz unten
display dialog "Die Nummer "...
kann man folgendes einsetzen, um eine Benachrichtigung über Growl zu bekommen:
set Growl to "/usr/local/bin/growlnotify -a \"Dial Fritz\" -t \"Bitte Telefon " & dialport & " abnehmen\" -m \"Die Rufnummer " & telephone & " wird angerufen\""
set RetMessage to do shell script Growl
Vorraussetzung ist, dass man growlnotify installiert hat.
[edit] SNMP über Fritz!Box hinweg
Falls man SNMP über die WAN Seite braucht weil z.Bsp entfernte Router überwacht werden müssen, muss man über Telnet und nvi /var/flash/ar7.cfg die Zeile(n) "reject udp any any range 161 162" überall löschen.
[edit] Prüfen, ob über VoIP telefoniert wird (bash)
Dieses Script ermöglicht eine Prüfung, ob in diesem Moment ein Telefonat über sip0 oder sip1 geführt wird.
#!/bin/bash
interval=15
password=
host=fritz.box
wait=false
verbose=false
#----------------------------------------------------------------------------
print_help(){
echo "usage: $0 [-w [-i INTERVAL]] [-h HOST] [-p PASSWORD]
Checks the FRITZ!Box for running phone calls through VoIP or waits for running
phone call(s) to terminate. Returns 0 if there are no phone calls.
Available options:
-w Wait until VoIP isn't used anymore
-i INTERVAL Check every INTERVAL if sip0 or sip1 is used (sets -w)
See sleep(1) for format of INTERVAL. Default: $interval
-h HOST Use HOST instead if the hostname $host
cannot be resolved correctly
-p PASSWORD Use PASSWORD to authenticate with the FRITZ!Box (should work)
-v Be verbose. Will only work with -w"
exit 1
}
voipinuse() {
GET "http://$host/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=home&var%3Aerrorpagename=home&var%3Amenu=home&var%3Apagemaster=&time%3Asettings%2Ftime=1190891366%2C-120&var%3Aactivtype=pppoe&var%3AtabInetstat=1&var%3Ashowsetup=1&login%3Acommand%2Fpassword=$password" | grep -o 'case "sip.": state = "3"' > /dev/null
return $?
}
waitforvoiptoend(){
if voipinuse; then
if $verbose; then
echo -n "Waiting for the phonecall to terminate...";
fi
while voipinuse; do
sleep $interval;
if $verbose; then
echo -n ".";
fi
done
fi
if $verbose; then
echo "Here we go!"
fi
return 0;
}
while getopts "i:p:h:vw" option; do
case $option in
i) interval=$OPTARG
wait=true
;;
p) password=$OPTARG
;;
r) host=$OPTARG
;;
w) wait=true
;;
v) verbose=true
;;
\?) print_help
;;
esac
done
if $verbose; then
echo "Verbose activated";
fi
if $wait; then
waitforvoiptoend
exit 0
fi
if voipinuse; then
exit 1
else
exit 0
fi
Categories: FRITZ!Box | Software | TAPI

