#!/bin/sh # Change to fullscreen under Freetz cat << EOF EOF if [ "$HELPPAGE" = "" ]; then HELPPAGE="vorwort"; fi MAIN_CGI="dtmfbox.cgi?pkg=dtmfbox" # # Basiseinstellungen # if [ "$HELPPAGE" = "basiseinstellungen" ]; then echo '' show_title "Basiseinstellungen" cat << EOF Unter Basiseinstellungen wird die Datei dtmfbox.cfg bearbeitet.

Diese stellt die Grundkonfiguration des Programms dar. Standardmäßig ist die Datei so eingerichtet,
dass nur wenige Änderungen vorgenommen werden müssen, wie z.B. die Einrichtung von Accounts.

Der Aufbau ist in [Bereiche] unterteilt.

Im Text-Editor werden Kommentare mit Doppel-Slashes gekennzeichnet (// Kommentar). Siehe auch hier.

EOF fi # # Vorwort # if [ "$HELPPAGE" = "vorwort" ]; then echo '' show_title "Vorwort" cat << EOF Die dtmfbox ist eine Softswitch Applikation, welche folgende Features unterstützt:
Ohne Skripte und Plugins lässt sich die dtmfbox rein als CAPI-/SIP-Phone nutzen. Dabei wird der Rufaufbau entweder über den angebundenen SIP-Client ausgelöst (Registrar-Mode), bzw. manuell von der Konsole ausgeführt (dtmfbox 0 -call ...).

Mithife von Shell-Skripten und Plugins lässt sich jedoch der Funktionsumfang erweitern.
Es bietet sich die Möglichkeit, automatisierte Steuerungen durchzuführen, wie z.B.:
Die Telefonie-Ereignisse werden als Parameter an die Skripte und Plugins übergeben.
Die Telefonie-Befehle lassen sich über die Kommandozeile oder über eine Funktion aufrufen.

Das Webinterface der dtmfbox besteht aus einem Plugin und mehreren Skripten:

libmenu.plugin.so dient dazu, eine komfortable Menüschnittstelle zu bieten, welche sich über die Datei menu.cfg anpassen lässt. In dieser Konfiguration wird das Menü festgelegt. Zudem lassen sich Aktionen (Ereignisse) hinterlegen.

Im Standard gibt es folgende Funktionen: Das Menü ist hierarchisch aufgebaut (siehe hier). Menü und Skripte lassen sich nach belieben erweitern und bearbeiten.

Einstellungen werden bei der Standalone-Version in der /var/flash/debug.cfg gespeichert (komprimiert).
Bei der USB-Version wird nur ein Start-Skript in die /var/flash/debug.cfg geschrieben.
Bei der Apache-Installation werden die Daten unkomprimiert, unter /usr/bin/dtmfbox-apache abgelegt.

License: EOF fi # # Getting started... # if [ "$HELPPAGE" = "getting_started" ]; then echo '' show_title "Getting started..." cat << EOF EOF fi # # Status # if [ "$HELPPAGE" = "status" ]; then echo '' show_title "Status" cat << EOF Auf der Statusseite befindet sich der aktuelle Dienste-Status der dtmfbox.

Hier kann die dtmfbox manuell gestartet und gestoppt werden.
Zusätzlich kann die Programmausgabe mitgeloggt werden.

Die Befehle für die Konsole sehen folgendermaßen aus:
rc.dtmfbox start|stop|restart	# starten, stoppen, neu starten.
rc.dtmfbox foreground		# im Vordergrund starten, mit Skriptausgaben, für Tests.
rc.dtmfbox log			# geloggt starten, ohne Skriptausgaben.
Ist die dtmfbox gestartet, werden alle Accounts (mit Registrierungsstatus), alle aktuellen Verbindungen und alle angemeldeten Clients angezeigt. Falls Nachrichten auf den Anrufbeantworter vorhanden sein sollten, werden diese ebenfalls auf der Seite "Status" angezeigt.

Hinweis:
echo-Ausgaben in Skripten erscheinen nicht im Log!
Skriptausgaben werden angezeigt, wenn die dtmfbox im Vordergrund gestartet wird: ./rc.dtmfbox foreground EOF fi # # Accounts einrichten # if [ "$HELPPAGE" = "accounts" ]; then echo '' show_title "Accounts einrichten" cat << EOF Grundvorraussetzung ist das Einrichten von Accounts.

Unter Basiseinstellungen können bis zu 10 Accounts eingerichtet werden. Die Bereiche fangen bei [acc1] an und hören bei [acc10] auf.
Einzelne Accounts können mittels 'active=' aktiviert (1), bzw. deaktiviert (0) werden.

Es gibt vier Arten, Accounts einzurichten:

EOF fi # # Kurzwahlen einrichten # if [ "$HELPPAGE" = "internes_menu" ]; then echo '' show_title "Kurzwahlen einrichten" cat << EOF Das Menü kann über Kurzwahlen erreicht werden.
Dies gilt für ISDN-Accounts, wie auch Accounts, welche über den Registrar-Modus angebunden sind (SIP-Clients angemeldet an dtmfbox).

Damit das Telefon auf die Kurzwahl reagiert, müssen zwei Einträge unter [accX] eingefügt werden:

Beispiel:
[acc1]
// ...	 					// siehe Accounts
menu_keycode=*800				// Kurzwahl (hier *800)
menu_entry=menu:main				// Menü-Einstiegspunkt (menu:main ist das Hauptmenü)
Von Außerhalb kann das Menü über den Anrufbeantworter, bzw. über Callback/Callthrough erreicht werden.

Hinweis:

Es kann vorkommen, dass das Telefon nicht auf die Kurzwahl reagiert. Dies kann mit verschiedenen Dingen zusammenhängen (FW-Version, Telefone, usw.).

Man sollte zunächst prüfen, ob überhaupt DTMF-Zeichen empfangen werden, wenn gewählt wird. Dies kann mithilfe des Logs festgestellt werden.
Wenn abgenommen wird (Log: Hook up), aber kein Ton zu hören ist oder die Navigation per DTMF nicht möglich sein sollte, liegt das oft an dem Format der Kurzwahl.

Man sollte daher folgende Kurzwahlen durchprobieren:

800 ist nur ein Beispiel. Testweise sollte man auch andere Nummern verwenden.

Falls immer noch kein Ton zu hören ist, bzw. die Navigation nicht funktioniert, kann man im AVM-WebIf unter Telefoniegeräte\Festnetz eine zusätzliche Rufnummer hinterlegen (in dem Fall die gewünsche Kurzwahl, z.B. 800). Danach nochmal die oberen Kombinationen ausprobieren.

Falls dieser Versuch ebenfalls scheitert, bleibt noch die Möglichkeit, die ISDN-Telefone per SIP-Registrar anzubinden (siehe auch Accounts einrichten).
Die Kurzwahl darf in dem Fall aber kein # oder * enthalten! Beim ersten Internet-Telefonieaccount würde man *121#800 wählen. EOF fi # # Das Menü # if [ "$HELPPAGE" = "menu_start" ]; then show_title "Das Menü" cat << EOF In der dtmfbox-Standardkonfiguration ist ein vorgefertigtes Menü integriert, welches bei Bedarf geändert werden kann.
Das Menü kann über drei Wege erreicht werden:

Menüstruktur:
Hauptmenü
|
|- 1 = Anrufbeantworter
|  |
|  |- X# = Nachricht X abhören
|  |- 0# = Einstellungen
|  |  |
|  |  |- 1 = Aktivieren / Deaktivieren
|  |  |- 2 = Aufnahmen löschen
|  |  |  |
|  |  |  |- 1 = Alle Aufnahmen löschen
|  |  |  |- * = Zurück
|  |  |
|  |  |- * = Zurück
|  |
|  |- * = Zurück
|
|- 2 = DTMF-Befehle
|  |
|  |- X = Eigene Befehle, Shellskripte, etc.
|  |- * = Zurück
|
|- 3 = Callthrough
|  |
|  |- 1234# = Pineingabe (Pin kann im Menü bearbeitet werden)
|  |     |
|  |     |- X# = Account 1-10 oder 0# für die Wahl über den internen S0 Bus
|  |        |
|  |        |- NUMMER#   = Nummer eingeben und wählen (#)
|  |        |- NUMMER*#  = Nummer eingeben und korrigieren (verwählt)
|  |        |- #         = Auflegen
|  |        |- *         = Zurück
|  |
|  |- * = Zurück
|
|- 4 = Sonstiges
   |
   |- 1 = Fritz!Box
   |  |
   |  |- 1 = IP-Adresse
   |  |- 2 = Letzter Reboot
   |  |- 3 = Uhrzeit
   |  |- * = Zurück
   |
   |- 2 = Wettervorhersage
   |  |
   |  |- 1 = Wetter-Podcast abspielen
   |  |- * = Zurück
   |
   |- 3 = Checkmaild
   |  |
   |  |- X = Mailanzahl von Checkmail-Account X (1-3) abfragen
   |  |- * = Zurück
   |
   |- 4 = Radio
      |
      |- X = Radiostream 1-9
      |- * = Zurück	
EOF fi # # Menü bearbeiten # if [ "$HELPPAGE" = "menu" ]; then show_title "Menü bearbeiten" cat << EOF Das Menü kann individuell bearbeitet werden.
Es ist ebenfalls in [Bereiche] unterteilt, jedoch werden diese anders interpretiert.

Es gibt vier Bereiche: Alle Menü-, Skript- und Library-Bereiche müssen einen eindeutigen Namen besitzen.
Der Name wird nach dem Doppelpunkt gesetzt. Z.B. [menu:my_menu1], [script:my_script1], usw...

Es können beim Aufruf der Bereiche auch Parameter übergeben werden (bis zu 32):
[menu:main]
say=Hauptmenue
1=script:myscript("Hallo", "Test")		     // "Hallo" und "Test" an Skript übergeben
2=menu:zweites_menu("Hallo2")			     // "Hallo2" an Menü übergeben

[menu:zweites_menu]
say=Zweites Menue
1=script:myscript("%\$1%", "Test2")		     // %\$1%="Hallo2" u. "Test2" an Skript übergeben
*=menu:main

[script:myscript]				     // 1. und 2. Argument an Skript übergeben
cmd=/var/script/myscript.sh(/var/script/myscript.sh, "%\$1%", "%\$2%")
Die Parameter stehen dann als Argumente innerhalb des Bereiches zur Verfügung (von %\$1% bis %\$32%)

Ereignisse können ebenfalls als Parameter übergeben werden. EOF fi # # [menu: ... ] # if [ "$HELPPAGE" = "menu_menu" ]; then echo '' show_title "[menu: ... ]" cat << EOF Ein [menu:XYZ] stellt einen Menü-Bereich dar. In dem Fall mit dem eindeutigen Namen XYZ.

Ein Menü kann beliebig lang sein. Es können einzelne DTMF-Zeichen mit Untermenüs, Skripten und Library-Funktionen verknüpft werden. Ganze DTMF-Zeichenfolgen sind ebenfalls möglich.

Beispiel (einzelne DTMF-Zeichen):
[menu:main]
say=1 Erstes Menue, 2 Zweites Menue
1=menu:menu_1
2=menu:menu_2

[menu:menu_1]
say=Menu 1. Zurueck mit *
*=menu:main

[menu:menu_2]
say=Menu 2. Zurueck mit *
*=menu:main
Beispiel (mehrere DTMF-Zeichen):
[menu:main]
say=101# Erstes Menue, 102# Zweites Menue
101#=menu:menu_1
102#=menu:menu_2

[menu:menu_1]
say=Menu 1. Zurueck mit *
*=menu:main

[menu:menu_2]
say=Menu 2. Zurueck mit *
*=menu:main
Wird say= mit angegeben, wird das text2speech= Skript ausgeführt, welches unter den Basiseinstellungen hinterlegt ist.
Der angegebende Text wird auf das Telefon ausgegeben, solange eSpeak verwendet wird (Skripteinstellungen > ESPEAK_INSTALLED=X). EOF fi # # [script: ... ] # if [ "$HELPPAGE" = "menu_script" ]; then echo '' show_title "[script: ... ]" cat << EOF Ein [script:XYZ] stellt einen Skript-Bereich dar. In dem Fall mit dem eindeutigen Namen XYZ.

Skripte können von Menüs [menu:] und Aktionen [action:] aufgerufen werden.

Beispiel 1:
[menu:main]
say=1 Erste Skript Funktion, 2 Zweite Skript Funktion.
1=script:myscript(1)		// 1 übergeben
2=script:myscript(2)		// 2 übergeben

[script:myscript]
say=Skript %\$1% ausführen	// say "Skript X ausführen"
cmd=/var/dtmfbox/script/myscript1.sh(/var/dtmfbox/script/myscript1.sh, "%\$1%", "%src_id%")
In dem obigen Beispiel wird zweimal das selbe Skript aufgerufen, jedoch mit unterschiedlichen Parametern (1 und 2).
Zusätzlich wird der Platzhalter "%src_id%" an das Skript "myscript1.sh" übergeben.
Im Skript stehen die Parameter dann als Argumente zur Verfügung (\$1="1" oder "2" und \$2="%src_id%").

Auch hier kann say= angegeben werden, um einen Text auszugeben.

Beispiel 2 (selbes Skript wie oben, nur dynamisch):
[menu:main]
say=Skript-Funktion aufrufen
#=script:myscript(%dtmf%)	// DTMF-Zeichen übergeben

[script:myscript]
say=Skript %\$1% ausführen	// say "Skript X ausführen"
cmd=/var/dtmfbox/script/myscript1.sh(/var/dtmfbox/script/myscript1.sh, "%\$1%", "%src_id%")
In dem obigen Beispiel wird ebenfalls das Skript aufgerufen, jedoch etwas dynamischer.
Anstelle einzelne Skriptaufrufe für bestimmte Tasten festzulegen, wird beim Drücken der #-Taste der ganze DTMF-Buffer an das Skript übergeben. Solange # nicht eingegeben wurde, werden die DTMF-Zeichen "gesammelt".
Wird z.B. 100# eingegeben, so steht in %dtmf% ebenfalls "100#". In %data% steht immer das letzte Zeichen, welches in dem Fall "#" wäre.

In cmd= wird das eigentliche Skript angegeben. Der Aufruf ist wie bei der Funktion 'execl' unter C.
Die Skriptdatei wird vor der Klammer und als erster Parameter angegeben. EOF fi # # [lib: ... ] # if [ "$HELPPAGE" = "menu_lib" ]; then echo '' show_title "[lib: ... ]" cat << EOF Ein [lib:XYZ] stellt einen Library-Bereich dar. In dem Fall mit dem eindeutigen Namen XYZ.

Libraries können von Menüs [menu:] und Aktionen [action:] aufgerufen werden.
Hierbei wird gezielt eine Funktion in einer Library aufgerufen. Die Libraries müssen nicht zwingend als Plugin eingebunden werden.

Beispiel:
[menu:main]
1=lib:speak("Hallo 1")
2=lib:speak("Hallo 2")
3=lib:speak("Hallo 3")

[lib:speak]
library=/var/dtmfbox/menu.plugin.so
function=speak(%src_id%,"%\$1%")
Es können char*-und integer-Datentypen übergeben werden. Integer-Werte werden ohne Anführungsstriche angegeben.
In dem obigen Beispiel wird die Funktion "speak()" in der Library menu.plugin.so aufgerufen. Der erste Parameter ist ein Integer, der Zweite ein char*. EOF fi # # [action: ... ] # if [ "$HELPPAGE" = "menu_action" ]; then echo '' show_title "[action: ... ]" cat << EOF Ein [action:XYZ] stellt eine Aktion dar, die bei bestimmten Ereignissen ausgelöst wird. In dem Fall mit dem eindeutigen Namen XYZ.

Stimmen die angegebenen Ereignisse der Aktion überein, wird ein Skript oder eine Library aufgerufen.
Im Gegensatz zu den anderen Bereichen, wird eine Aktion nicht von Menüs verwendet.

Beispiel:
[action:action_1]
event=CONNECT
//type=
direction=INCOMING
//src_id=
//dst_id=
//src_no=
dst_no=0049301234567
//data=
action=script:action_hookup

[script:action_hookup]
cmd=/var/action_hookup.sh(/var/action_hookup.sh, "%event%", "%type%", "%direction%", "%src_id%", "%dst_id%")
Wenn:
%event%="CONNECT" und %direction%="INCOMING" und %dst_no%="0049301234567",
Dann:
"action_hookup.sh" ausführen (und Platzhalter übergeben).

Innerhalb des Skriptes könne man z.B. die Verbindung annehmen (\$DTMFBOX \$4 -hook up).

Hinweis:
Bei mehrere Aktionen werden diese nacheinander ausgeführt (nach Namen sortiert).
Eine Erläuterung zu den Ereignissen befindet sich hier. Eine Erläuterung zu den Befehlen, hier. EOF fi # # Skripteinstellungen # if [ "$HELPPAGE" = "skripteinstellungen" ]; then echo '' show_title "Skripteinstellungen" cat << EOF Unter Skripteinstellungen werden die Einstellungen zu den Skripten vorgenommen.

Alle Skripte binden diese Datei ein, wie auch das Webinterface, um Einstellungen am Text-Editor vorzunehmen zu können (Zeilen/Wrap).

EOF fi # # Skripte bearbeiten # if [ "$HELPPAGE" = "skripte_bearbeiten" ]; then echo '' show_title "Skripte bearbeiten" cat << EOF Skripte lassen unter Skripte bearbeiten ändern und erweitern.

Es handelt sich hierbei um Shellskripte, welche die eigentlichen Funktionen der dtmfbox implementieren (Anrufbeantworter, Callback/Callthrough, ...).

Alle Skripte werden durch das Menü-Plugin ausgeführt. Die einzelnen Skriptaufrufe stehen in den Bereichen [script:X].

Jedem Skript können Parameter mitgegeben werden, die in den Variablen \$1 bis \$32 zur Verfügung stehen. Dies können Ereignisse sein, aber auch benutzerdefinierte Parameter.

Man kann weitere Skripte unter /var/dtmfbox/script ablegen, welche automatisch mitgespeichert werden. EOF fi # # Nachrichten # if [ "$HELPPAGE" = "nachrichten" ]; then echo '' show_title "Nachrichten" cat << EOF Der Menüpunkt "Nachrichten" zeigt die Aufnahmen auf dem Anrufbeantworter an.

Es kann zwischen den einzelnen Accounts gewechselt werden. Aufnahmen lassen sich abhören und löschen.

Wird das "FTP-Streaming" verwendet, werden die Dateien auf dem FTP-Server abgelegt und stehen dort als RAW-PCM zur verfügung (8000hz/16bit/mono). Das sind ganz normale Wave-Dateien, jedoch ohne Header. Gespeicherte Aufnahmen sind im WAV-PCM Format (8000hz/16bit/mono). EOF fi # # Webphone # if [ "$HELPPAGE" = "webphone" ]; then echo '' show_title "Webphone" cat << EOF Unter "Webphone" befindet sich ein Java-Applet, womit es möglich ist, über die Weboberfläche, per Headset, zu telefonieren.

Es wird das Standard-Sounddevice verwendet. Account auswählen, Zielrufnummer eingeben und wählen.

Achtung: Alpha!! ;-)

Für das Webphone wird die Java Runtime Engine benötigt.
Download hier: http://www.java.com/de/download/
EOF fi # # dtmfbox Befehle # if [ "$HELPPAGE" = "befehle" ]; then echo '' show_title "Befehle" cat << EOF Die dtmfbox und die Plugins stellen eine Reihe von Befehlen zur Verfügung, welche über Kommandozeile oder über eine Funktion innerhalb der Plugins augerufen werden können.

Um Befehle auszuführen, muss die dtmfbox gestartet sein.

EOF echo "Standard-Befehle (dtmfbox):" echo -n "

"
if [ ! -z "$(pidof "dtmfbox")" ]; then
	/var/dtmfbox/dtmfbox
else
	echo -n "dtmfbox wurde nicht gestartet!"
fi
echo "
" echo "
Plugins (dtmfbox -list plugins):" echo -n "
"
if [ ! -z "$(pidof "dtmfbox")" ]; then
	/var/dtmfbox/dtmfbox -list plugins
else
	echo -n "dtmfbox wurde nicht gestartet!"
fi
echo -n "
" fi # # dtmfbox Webinterface # if [ "$HELPPAGE" = "webinterface" ]; then echo '' show_title "Webinterface" cat << EOF Die Einstellungen der dtmfbox werden zur Laufzeit ausgelesen und dynamisch angezeigt.

Dies trifft hauptsächlich auf die Dateien dtmfbox.cfg und script.cfg zu, wobei Letzere interessant sein kann, um benutzerdefinierte Skripteinstellungen zu hinterlegen.

Jeder Einstellung wird im Text-Editor ein Kommentar zugewiesen:
Dieser Kommentar wird als Bezeichnung für die Einstellung verwendet. Klickt man nun auf "Speichern" und verlässt den Text-Editor, stellt man fest, das die Einstellung mit dem jeweiligen Kommentar, als Textbox, angezeigt wird.

Es gibt weitere Flags, um die Darstellung und das Verhalten von Einstellungen zu verändern.
Diese werden ebenfalls im Kommentarteil angegeben: