[HowTo] Fritzbox-Steuerung und -Telefonbuch auf Cisco 797x

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Da ich erst kürzlich mein Cisco 7975G mittels SIP Software an meiner Fritzbox 7270v3 zum Laufen gebracht habe, interessierte mich, wie man über das Service- und Verzeichnismenü des IP Phones Zugriff auf das Fritzbox Telefonbuch und Einstellungen der Fritzbox erhalten kann.

Im Netz und besonders hier im IPPF fand ich bereits fertige Skripte und Tipps, die mir im weiteren als Grundlage dienten.

Mein besonderer Dank an disorganizer für seine Beiträge unter http://www.ip-phone-forum.de/showthread.php?t=245349 und bt43a für seine Skripte unter http://www.ip-phone-forum.de/showthread.php?t=264283&page=2

Voraussetzungen:

  • Cisco IP-Phone der Serie 7970G oder 7975G.
  • FRITZ!Box mit Telefoniefunktion und Freetz-Erweiterung (freetz.org) mit installiertem Dnsmasq
  • Ein USB-Speicher an der FRITZ!Box der über /var/media/ftp/uStor01 angesprochen werden kann
  • Eine eingerichtete Verzeichnisstruktur wwwroot/htdocs/cgi-bin auf dem USB-Speicher (als Homedirectory für den Webserver und für die Shellskripte)

Anhänge:

Anhang anzeigen cgi-bin.zip
Anhang anzeigen Anleitung 797x - v2.pdf

Alle Lösungen, so auch diese, benötigen einen Webdienst, um dem Telefon die benötigten Infos per XML zur Verfügung zu stellen.
Wie schon für den tftp-Dienst konnte ich hierfür auf das auf meiner Box installierte Freetz zurückgreifen und dort durch folgende Einträge in der rc.custom

{
HOMEDIR="/var/media/ftp/uStor01/wwwroot/htdocs"
while [ ! -d "$HOMEDIR" ]; do sleep 5; done
httpd -P /var/run/port88.pid -p 88 -h "$HOMEDIR"
} &
#Virtuelles Interface starten
ifconfig eth0:1 192.168.178.253 up
den integrierten Webserver (httpd) starten (Port 88 und Adresse des virtuellen Interfaces muss man auf die eigenen Werte anpassen).

Da der integrierte Webserver nicht (ohne weiteres) php-fähig ist, musste ich einige der verfügbaren Skriptvorlagen zunächst in Shellskripte umschreiben, die auf der Fritzbox ausgeführt werden können. Durch das einheitliche Format konnte ich dann auch bequem Telefonbuch- und Konfigurationsdienste in einem Service zusammenfassen.
Nachdem ich das Prinzip, wie man Fritzboxeinstellungen mittels ctlmgr_ctl abfragt bzw. manipulieren kann, verstanden hatte, hab ich die Skripte um weitere Funktionen ergänzt. Neu ist z.B. die Einstellung der (allgemeinen) Rufumleitung, der Klingelsperre und die Detailanzeige der neuen Nachrichten auf dem AB mit Uhrzeit und Anrufernamen (falls im Telefonbuch vorhanden, ansonsten mit Rufnummer).

Die Skripte im angehängten ZIP-Archiv werden in das Verzeichnis wwwroot/htdocs/cgi-bin/ des USB-Speichers entpackt (dazu reicht es das Archiv im Ordner wwwroot/htdocs zu entpacken; das cgi-bin Unterverzeichnis mit den Skriptdateien wird dabei automatisch erzeugt).

Was machen die Skripte?

Über den Webdienst an (hier im Beispiel) Port 88 kann die FRITZ!Box dem IP Phone per Skriptabfrage Infos bereitstellen. Ergänzend lassen sich per Telefon Einstellungen der FRITZ!Box ändern.

ciscoauth.sh - Dieses (optionale) Skript wird zur Autorisierung bestimmter Benutzeraktionen aufgerufen. Es antwortet mit einem einfachen "authorized".

fritzbox.sh - Dieses Skript stellt über den Service-Button (Weltkugel) ein eigenes Servicemenü bereit. Folgende Aktionen lassen sich daraus aufrufen:
  • Anrufbeantworter: Statusanzeige für den FRITZ!Box AB. Neue Nachrichten werden in einer Kurzübersicht dargestellt. Falls verfügbar wird die Rufnummer des Anrufers aus dem Telefonbuch ermittelt. Der Anrufbeantworter der FB lässt sich hierüber ein- und ausschalten und es kann vom Aufnahme- in den Ansagemodus gewechselt werden
  • Telefonie: Statusanzeige für die DECT-Funktion der FB. Die DECT lässt sich hierüber ein- und ausschalten. Auch die Klingelsperre und eine (allgemeine) Rufumleitung lassen sich hierüber aktiveren/deaktivieren.
  • Wireless LAN: WLAN Statusanzeige. Es werden die SSIDs und Keys für 2,4GHz und 5 GHz und Gast-WLAN angezeigt (falls verfügbar). WLAN und Gastzugang lassen sich separat an- und ausschalten.
  • FRITZ!Box Status: Hier werden Infos zur FRITZ!Box angezeigt: Verbindungsstatus, IP-Adresse, Firmware, und aktuelle Temperatur der Box. „CAPI over TCP“ (z.B. für PC-Faxprogramm) lässt sich hierüber aktivieren/deaktivieren
  • Telefonbuch aktualisieren: Das Telefonbuch / die Telefonbücher der FB werden ausgelesen und für den Directory Dienst (s.u.) in einem auswertbaren Format bereit gestellt.

Fritzbox.sh ruft weitere Skripte auf, die sich im selben Verzeichnis befinden, um die Informationen im telefontauglichen XML-Format darzustellen bzw. die Kommandos auf der FRITZ!Box ausführen.

directory.sh - Über dieses Skript wird das Telefonbuch der FB als zusätzliches Verzeichnis im IP-Phone bereit gestellt. Die Auswahl erlaubt eine alphabetische zusammengefasste Darstellung der Telefonbucheinträge, sowie das Suchen nach Namen und Wählen aus dem Telefonbuch heraus. Auch directory.sh ruft weitere Skripte im selben Verzeichnis auf.

Notwendige Anpassungen:

constants.sh – Dieses Script enthält alle „global“ verwendeten Variablen und deren Zuweisungen, insbesondere Textbausteine und lokale Pfade (die hier nach Belieben angepasst und übersetzt werden können).

Sofern nach den Anleitungen hier im Text vorgegangen wird, ist die einzige notwendige Anpassung, die Änderung der IP-Adresse der FRITZ!Box und ggf. des Ports für den Webserver:

# Base url for Webserver.
WEBBASEURL="http://192.168.178.253:88"
In der Konfigurationsdatei SEP<MAC>.cnf.xml des IP Phones im Root-Verzeichnis des TFTP-Severs müssen folgende Einträge angepasst werden:

<authenticationURL>http://192.168.178.253:88/cgi-bin/ciscoauth.sh</authenticationURL>
<directoryURL>http://192.168.178.253:88/cgi-bin/directory.sh</directoryURL>
<servicesURL>http://192.168.178.253:88/cgi-bin/fritzbox.sh</servicesURL>
Damit die Änderungen wirksam werden, muss das Telefon neu gestartet werden.

Wer es ausführlicher mag - auch mit Anleitung, wie man das Telefon generell als SIP Client auf der Fritzbox zum Laufen bringt, kann sich die ebenfalls angehängte PDF-Datei durchlesen.

Die Skripte hab ich auf meiner Hardware getestet und sie laufen dort bisher einwandfrei. Trotzdem kann ich natürlich keine Gewährleistung dafür übernehmen, dass diese auch bei Euch in jeder Konfiguration funktionieren. Die Installation und Einrichtung erfolgt daher auf eigene Gefahr.

Sollten dennoch Probleme mit der Installation oder mit den Skripten selbst auftreten, werde ich gerne versuchen, Euch bei der Lösung über dieses Forum zu unterstützen.

Viel Spaß damit

FantasticPauly

Bilder:

IMG_0219.JPGIMG_0227.JPGIMG_0239.JPGIMG_0235.JPGIMG_0230.JPGIMG_0231.JPGIMG_0236.JPGIMG_0234.JPG
 
Zuletzt bearbeitet:

bt43a

Mitglied
Mitglied seit
5 Feb 2011
Beiträge
210
Punkte für Reaktionen
2
Punkte
18

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Danke für's Lob.
Das mit den Screenshots über das Webinterface ist mir auf Anhieb nicht gelungen. Da muss ich wohl noch mal dran... :)
 

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
So, noch ein bisschen getestet :) Damit das mit den Screenshots funktioniert, muss der Inhalt der Datei ciscoauth.sh wie folgt geändert werden:
#!/bin/sh

# Start Output
echo "HTTP/1.1 200 OK"
echo "Content-type: text/plain"
echo "Connection: close"
echo ""
echo -n "AUTHORIZED"
 

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Zwei Fehler hatten sich noch eingeschlichen. Damit alles korrekt funktioniert, bitte die Skripte fb_tam.sh und fb_wlan.sh mit denen aus dem Anhgang ersetzen.
Anhang anzeigen Update.zip
Wer auch noch wissen möchte, wie man die MWI zur Signalisierung von AB-Nachrichten ans Laufen kriegt kann hier im Forum weiterlesen.
 
Zuletzt bearbeitet:

Ramalama

Neuer User
Mitglied seit
21 Sep 2011
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Hi das Script / die Scripts funktionieren Super!

Hat das vielleicht jemand in der vergangenen Zeit upgedatet?
Da aktuell mit 7390 FW 6.36, das ganze ein paar Bugs hat...

fbpb2cisco.sh = funktioniert nicht mehr (da pbd --export anscheinend leichte Veränderungen hat)
fb_wlan.sh = Status (immer deaktiviert), SSID (falsch), Passwort (richtig)...

usw...

aber wenn ich von wlan die ctlmgr_ctl commands im telnet durchgehe, sehe ich genau das was das Script anzeigt...
also das Script an sich funktioniert, die Firmware ist anscheinen noch nicht ausgereift / oder freetz...

naja, hat jemand irgendwas aktualisiert eventuell ?
Da an sich die Scripts hier die schönste Lösung bietet, die ich bis jetzt gefunden habe...

LG :)
 

Ramalama

Neuer User
Mitglied seit
21 Sep 2011
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Falls jemand helfen kann, ich bekomme es einfach nicht hin...

Das "neue" pbx.export (Telefonbuch) sieht jetzt so aus:
Code:
<?xml version="1.0" encoding="utf-8"?>
<phonebooks><phonebook><contact><category /><person><realName>Alina</realName></person><telephonynid="1"><number type="home" id="0" vanity="" prio="1">01514444444</number></telephony><services /><setup><ringTone /></setup><mod_time>1448359973</mod_time><uniqueid>67</uniqueid></contact><contact><category /><person><realName>AVM Ansage (HD)</realName></person><telephony
nid="1"><number prio="1" type="work" quickdial="99" id="0">[email protected]</number></telephony><services /><setup /><uniqueid>0</uniqueid></contact></phonebook>
</phonebooks>
Code:
cat ./pbd.export \	| tr "\n" " " \
	| sed -r \
		-e 's,[ \t]+, ,g' \
		-e 's, />,/>,g' \
		-e 's,(</?phonebook>|</?phonebooks>|<contact[^<]*>|<featureflags>|<phonebook[^<]*>),\n\1,g' \
		-e 's,‰,ae,g;s,ˆ,oe,g;s,¸,ue,g;s,fl,ss,g;s,ƒ,Ae,g;s,÷,Oe,g;s,‹,Ue,g;s,È,e,g;s,…,e,g;s,&amp;,+,g' \
	| sed -r \
		-n "/name=.$1./,/<\/phonebook>/p" \
	| sed -r \
		-e "s,.*${REALNAME_PATTERN}.*${NUMBER_PATTERN}.*${NUMBER_PATTERN}.*${NUMBER_PATTERN}.*,${OUTPUTLINE23}\n${OUTPUTLINE45}\n${OUTPUTLINE67},g" \
		-e "s,.*${REALNAME_PATTERN}.*${NUMBER_PATTERN}.*${NUMBER_PATTERN}.*,${OUTPUTLINE23}\n${OUTPUTLINE45},g" \
		-e "s,.*${REALNAME_PATTERN}.*${NUMBER_PATTERN}.*,${OUTPUTLINE23},g"
sieht für mich so aus als ob der obere part nicht funktioniert...

Kann vielleicht jemand helfen der mehr Ahnung von "sed" hat?

LG :)
 

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Da ich vor kurzem noch mal auf diesen alten Thread angesprochen wurde, hier noch ein Update, um MWI (Message Wait Indicator), d.h. die rote Lampe am Telefon wenn neue Nachrichten vorliegen, ans Laufen zu bringen.

Dafür muss man folgende Zeilen noch am Ende der rc.custom (freetz) bzw. debug.cfg einfügen:
Code:
#Hintergrund-Überwachung, ob neue Voicemails vorhanden sind.
{
VMDIR="/var/media/ftp/FRITZ/voicebox"
while [ ! -d "$VMDIR" ]; do sleep 5; done
sh /var/media/ftp/wwwroot/htdocs/cgi-bin/vm_monitor.sh
} &
echo "VM Monitor started"
Die Pfade "/var/media/ftp/FRITZ/voicebox" und "/var/media/ftp/wwwroot/htdocs/cgi-bin" musst man ggfs. auf seine Umgebung anpassen.

Im cgi-bin das Skript vm_monitor.sh mit diesem Inhalt erzeugen:
Code:
#!/bin/sh
trap '' SIGHUP

scriptbase="${0%/*}"
if [ "$scriptbase" = "$0" ] ; then scriptbase="."; fi

source "$scriptbase"/constants.sh

sipsakdir="$scriptbase"

if [ -x "/usr/bin/sipsak" ] ; then
       sipsakdir="/usr/bin"
elif [ ! -x "$scriptbase/sipsak" ]; then
       echo "Error: File 'sipsak' not found!"
       exit 1
fi

sip_phones=$(echo $PHONEIP | tr "," "\n")
i=0; for x in $sip_phones; do eval "sip_phone$i=$x"; let i=$i+1; done
phones=$i

sip_users=$(echo $SIPUSER | tr "," "\n")
i=0; for x in $sip_users; do eval "sip_user$i=$x"; let i=$i+1; done
users=$i

if [ ! $phones -eq $users ] ; then
       echo "Config error: Number of sip users does not match number of sip phones!"
       exit 1
fi
let max=$phones-1

sip_from="FRITZ!Box"
last_newmsgs=$( ctlmgr_ctl r tam settings/TAM0/NumNewMessages )

init=1

while [ 1 ]; do

       newmsgs=$( ctlmgr_ctl r tam settings/TAM0/NumNewMessages )

       if [ "$last_newmsgs" != "$newmsgs" ] || [ "$init" = "1" ] ; then
               oldmsgs=$( ctlmgr_ctl r tam settings/TAM0/NumOldMessages )
#               totalmsgs=$(($new + $old))

               if [ "$newmsgs" != "0" ] ; then
                       has_newmsgs="yes"
               else
                       has_newmsgs="no"
               fi

               content_length=$(( 34 + ${#has_newmsgs} + ${#newmsgs} + ${#oldmsgs} ))
               #random_number=$( awk 'BEGIN { srand(); print(int(rand()*1000000)) }' )
               random_number=$RANDOM
               if [ -n "$random_number" ] ; then
                       sequence=$( printf "%06d" $random_number )
               else
                       sequence=$( date '+%H%M%S' )
               fi
               gmt_date=$( date -u '+%a, %d %b %Y %H:%M:%S GMT' )

               for i in $(seq 0 $max); do
                       eval "sip_phone=\$sip_phone$i"
                       eval "sip_user=\$sip_user$i"
                       (
                       cat <<-EOM
                       NOTIFY sip:${sip_user}@${sip_phone} SIP/2.0
                       From: <sip:${sip_from}@${FBOXIP}>
                       To: <sip:${sip_user}@${sip_phone}>
                       Date: $gmt_date
                       Contact: <sip:${sip_user}@${FBOXIP}>
                       Call-ID: ${sequence}@${FBOXIP}
                       CSeq: ${sequence} NOTIFY
                       Event: message-summary
                       Content-Type: application/simple-message-summary
                       Content-Length: ${content_length}

                       Messages-Waiting: ${has_newmsgs}
                       Voicemail: ${newmsgs}/${oldmsgs}

EOM
                       ) | "$sipsakdir"/sipsak -s sip:${sip_user}@${sip_phone} -f -
                       # Last 2 lines could also be:
                       #Message-Account: sip:**[email protected]
                       #Voice-Message: ${newmsgs}/${oldmsgs}
               done
               last_newmsgs=$newmsgs
       fi
       [ "$init" = 1 ] && init=0
       sleep 5
done
exit 0
Die Berechtigungen werden per
Code:
chmod 777 vm_monitor.sh
gesetzt.

In der constants.sh müssen die Variablen PHONEIP und SIPUSER angelegt sein (sonst entsprechende Zeile/Eintrag hinzufügen), die jede Telefon-IP-Adresse und den zugehörigen SIP-User auf der Fritzbox für dieses Telefon enthalten. Mehrere IP-Adressen bzw. Usernamen werden durch Komma getrennt. Also z.B.:
Code:
PHONEIP="192.168.178.50, 192.168.178.51"
SIPUSER="Cisco7975-1, Cisco7975-2"
Last but not least braucht man noch ein Program "sipsak", das in das cgi-bin Verzeichnis, wo die Skripte liegen, kopiert wird.
Die angefügte sipsak ist für die mips Plattformen (Fritzbox 73xx, 74xx) geeignet.
 

Anhänge

Zuletzt bearbeitet:

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Übrigens, das Problem aus Post #7 wird dadurch verursacht, dass in der pbd.export der Name des exportierten Telefonbuchs nicht explizit angegeben ist. Dies sollte sich lösen lassen, in dem man in fbpb2cisco.sh die Codezeilen
Code:
   | sed -r \
       -n "/name=.$1./,/<\/phonebook>/p" \
durch folgende ersetzt:
Code:
   | sed -r \
       -n "/<phonebook.*>/,/<\/phonebook>/p" \
 
Zuletzt bearbeitet:

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Sofern nicht bereits vorhanden, muss in constants.sh auch ein Eintrag für die Variable FBOXIP mit der IP-Adresse der Fritzbox angelegt werden:
Code:
FBOXIP="192.168.178.1"
 

Anhänge

FantasticPauly

Neuer User
Mitglied seit
3 Jul 2013
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Ich habe Rückmeldung, dass die oben angehängte sipsak für MIPS nicht auf einer 7490 mit aktuellem OS läuft. Es gibt hier sipsak Binaries, mit denen es funktioniert. Also am besten gleich die Binaries von dort nutzen.
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
232,642
Beiträge
2,025,132
Mitglieder
350,529
Neuestes Mitglied
Matthias1983