Hilfsprogramme / Tipps & Tricks

From Fritz!Box

Jump to: navigation, search

Contents


[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:

  1. in mtd4 steht noch eine valide alte Konfig und die fbox kommt sofort wieder mit einer (irgendeiner!) alten Konfig hoch
  2. 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 Parameter do_not_register = no; in yes ä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.org erreicht 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 = '&uuml;';

$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 &uuml; (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 reichen
send 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)

[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/\&nbsp\;/\ /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

Personal tools