Homepage Logo

Letzte Änderung dieses Dokuments: 06.04.2008, 11:35:52.

vbox3 mit deutscher Spachausgabe

1. Inhalt

   1. Inhalt
   2. Einleitung
   3. Benötigte Dateien
   4. Installation
       4.1. vbox3
           4.1.1. Besonderheiten bestimmter Distributionen
       4.2. vboxputty
       4.3. raccess4vbox3
       4.4. Fertig!
   5. Konfiguration
       5.1. Spoolverzeichnis
       5.2. vboxgetty
       5.3. init
           5.3.1. Bemerkungen
       5.4. Einrichten der Spoolverzeichnisses
       5.5. Der erste Test
   6. Weitergehende Konfiguration
       6.1. vboxrc
           6.1.1. Sektion [CALLERID]
           6.1.2. Profil Sektionen
       6.2. raccess.conf
           6.2.1. Sektion [tuning]
           6.2.2. Sektion [dtmf]
           6.2.3. Sektion [events]
           6.2.4. Sektion [run]
   7. Abhören der Nachrichten - Die Möglichkeiten
       7.1. Mimetypen
       7.2. Versand als Wave oder mp3
       7.3. Zugriff per vbox-Client
       7.4. Fernabfrage
       7.5. Abfrage über Web-Frontend
   8. Das Funktionsprinzip
       8.1. Allgemeines Prinzip
       8.2. Die Datei answeringmachine
           8.2.1. Sektion [run]
           8.2.2. Sektion [dtmf]
       8.3. Die Datei remoteaccess
           8.3.1. Sektion [run]
           8.3.2. Sektion [dtmf]
           8.3.3. Sektion [events]
       8.4. Die Datei sysinfo
           8.4.1. Sektion [run]
           8.4.2. Sektion [dtmf]
   9. Das Erweiterungspaket
       9.1. Installation
       9.2. Änderungen in /usr/share/isdn/vbox/bin
           9.2.1. Die Mailerskripte
           9.2.2. Die IP Abfrage
           9.2.3. Interface-Status
           9.2.4. Sensoren
           9.2.5. Interneteinwahl
           9.2.6. Das Skript buffer
       9.3. Änderungen in /var/spool/vbox/mjw/raccess
       9.4. Änderungen in /var/spool/vbox/mjw/buffer.d
       9.5. Änderungen in /var/spool/vbox/mjw/msg
   10. Deutsche Sprache
       10.1. Voraussetzungen
       10.2. Die zwei Wege
           10.2.1. Sampling
           10.2.2. Synthese on-the-fly
   11. Problembehebung und Tipps
       11.1. Plötzliches Beenden der Verbindung beim Abspielen von Audio
       11.2. [raccess] Selbstmodifizierende Konfiguration
       11.3. [Sysinfo] Wechselnde Geräte für Interneteinwahl
       11.4. Freie Eingabe beliebiger DTMF-Sequenzen
       11.5. Weiterverbinden, Vermitteln, Makeln mit vbox3
       11.6. vbox-Rufannahme schnell und einfach aus- und wieder anstellen
       11.7. CallerID, angerufene Nummer o.ä. innerhalb des play-Befehls
       11.8. Zeit- oder Anruferabhängige Ansagen
       11.9. Seltsame Fehler beim Parsen der vboxrc
       11.10. DTMF-Tastendefinitionen meines Erweiterungspakets


2. Einleitung

vbox ist ein ISDN-Anrufbeantworter für Linux. Ich habe ihn bei mir installiert und einige Änderungen bzw. Erweiterungen daran vorgenommen, die mir sinnvoll erschienen. Hier finden Sie eine kurze Anleitung zum Nachbauen der von mir vorgenommenen Änderungen, welche insbesondere eine deutsche Sprachausgabe betreffen.

Fehlerkorrekturen, Anregungen und Kritik sind herzlich willkommen.


3. Benötigte Dateien

Folgende Dateien benötigen Sie für die Installation von vbox:

vbox3
Laden Sie sich das Quellpaket von der vbox3 Homepage herunter. Dies ist der Sourcecode des eigentlichen Anrufbeantworters.
raccess4vbox3
Hierbei handelt es sich um ein fertiges tcl-Skript, das vbox3 um gewisse Fernwartungsfunktionen (Fernabfrage der Anrufbeantworters, Interneteinwahl des PC, etc.) erweitert. Wenn Sie wirklich nur einen reinen Anrufbeantworter wollen, brauchen Sie es nicht unbedingt. Ansonsten kann ich es jedem nur empfehlen.
Erweiterung
Dieses Paket enthält alle meine Änderungen und Ergäzungen an der vbox3-Konfiguration.
mbrola
mbrola ist ein Programm(paket) zur Sprachsynthese. Es ist nicht zwingend erforderlich, wenn Sie mit den Möglichkeiten, die raccess4vbox3 bietet, zufrieden sind. Wollen Sie aber eigene (deutsche!) Sprachsamples erzeugen oder die Sprachsynthese on-the-fly erledigen, werden Sie um die Installation dieses Pakets nicht herumkommen. Ich habe dazu auch eine Installationsanleitung geschrieben.
txt2pho
txt2pho dient dazu, aus normalem Text die Phoneme zu generieren, die mbrola (s.o.) als Eingabedaten erwartet.

4. Installation

4.1. vbox3

Die Installation von vbox3 ist eigentlich sehr einfach. Ich empfehle, die Installationsanleitung von vbox3 auch einmal durchzulesen, denn dort wird alles ausführlich beschrieben.

Entpacken Sie den Quellcode mit:

bash# tar xvzf vbox3-XXXX.tar.gz

Wobei XXXX für die Versionsnummer Ihres Quellpakets steht, z.B. "0.1.3".

Nun erfolgen die üblichen Schritte:

bash# sh ./configure --prefix=/usr \
--datadir=\${prefix}/share/isdn \
--sysconfdir=\${prefix}/../etc/isdn/vbox \
--mandir=\${prefix}/share/man \
--infodir=\${prefix}/share/info
bash# make
bash# make install

Die jeweiligen Pfadangaben hinter dem ./configure entsprechen den Empfehlungen der Installationsanleitung. Natürlich können Sie auch andere Pfade angeben, beispielweise LFS-konform alles unter /usr/local ablegen.

4.1.1. Besonderheiten bestimmter Distributionen

Manche Distributionen (z.B. SuSE, Debian Sarge) erlauben die parallele Installation mehrerer unterschiedlicher Versionen der TK/TCL-Bibliotheken. Dabei werden diese durch die Versionsnummer eindeutig unterschieden, was aber wiederum verhindert, dass das configure-Skript sie finden kann.

Daher sei an dieser Stelle noch einmal auf einen Abschnitt aus der vbox3 Installationsanleitung hingewiesen:

Falls das configure-Skript meldet, es könne die TCL-Bibliothek nicht finden, so müssen Sie wie folgt vorgehen:

bash# make distclean
bash# sed -e 's/-ltcl/-ltcl8.X/g' < configure > configure.local
bash# sh ./configure.local --prefix=/usr \
--datadir=\${prefix}/share/isdn \
--sysconfdir=\${prefix}/../etc/isdn/vbox \
--mandir=\${prefix}/share/man \
--infodir=\${prefix}/share/info

Dabei müssen Sie in dem Abschnitt "-ltcl8.X" das X an Ihre TCL-Version anpassen. Wie Sie diese Version ermittelt, sei hier am Beispiel meiner SuSE 7.1 demonstriert:

bash# ldconfig -p | grep tcl
   libtcl8.3.so.1 (libc6) => /usr/lib/libtcl8.3.so.1
   libtcl8.3.so (libc6) => /usr/lib/libtcl8.3.so

Bei SuSE 7.1 ist also die TCL-Bibliothek in der Version 8.3 vorhanden, also muss das "X" durch "3" ersetzt werden. Der entsprechende Befehl würde also so lauten:

bash# sed -e 's/-ltcl/-ltcl8.3/g' < configure > configure.local

Ferner kann es erforderlich sein, den Pfad zu den Headern explizit anzugeben, falls sie nicht in /usr/include zu finden sind. Bei Debian Sarge wäre das für TCL 8.4 beispielsweise:

bash# sh ./configure.local --with-tcl-include=/usr/include/tcl8.4 ...

4.2. vboxputty

Einer der Vorzüge von vbox3 ist wohl, dass es auch selbständig Anrufe tätigen kann. Wenn Sie diese Funktion nutzen möchten, dann gehen Sie in das Verzeichnis, in welches Sie die Binaries installiert haben (üblicherweise /usr/sbin) und geben Sie ein:

bash# ln -s vboxgetty vboxputty

Auf die Verwendung von vboxputty will ich hier nicht weiter eingehen. Im Grunde genommen läuft es so, dass Sie einen Aufruf der Form:

bash# vboxputty --device /dev/ttyI6 --call 023459988

machen. vboxputty ruft dann selbständig über das Device /dev/ttyI6 die Nummer 02345-9988 an und verhält sich danach wie ein auf /dev/ttyI6 konfiguriertes vboxgetty.

4.3. raccess4vbox3

Da raccess4vbox3 nur aus einem Satz tcl-Skripte mit den dazugehörenden Konfigurationsdateien besteht, ist es nicht erforderlich, hierfür irgendetwas zu kompilieren. Das macht die Installation relativ einfach.

Zunächst das Übliche - entpacken des Quellcodes:

bash# tar xvzf raccess4vbox3_0.2.2.tar.gz
bash# cd raccess4vbox3-0.2.2

Die Installationsanleitung für raccess4vbox3 empfiehlt, dass man nun die Makefile bearbeitet, um die dortigen Pfadangaben an seine Bedürfnisse anzupassen:

bash# joe Makefile

Ist dies erledigt, erfolgt die Installation mit den üblichen Befehlen:

bash# make
bash# make install

4.4. Fertig!

So, das war die Installation von vbox3 und raccess4vbox3. Im nächsten Abschnitt befassen wir uns mit der Konfiguration von beiden.


5. Konfiguration

Im folgenden Abschnitt erläutere ich kurz (!) die Konfiguration von vbox3 und raccess4vbox3. Ich weise darauf hin, dass ich in diesem Zusammenhang keine umfassende Anleitung für alle möglichen System und Distributionen geben kann, da ich selbst nur SuSE 7.1 verwende und hier nur von Dingen berichten will, die ich selbst ausprobiert habe.

Daher möchte ich auf die Konfigurationsanleitung von raccess4vbox3 verweisen. Dort wird ebenfalls die Konfiguration von vbox3 beschrieben.

5.1. Spoolverzeichnis

Zunächst benötigen wir einen User, unter welchem vbox3 laufen soll. Bei einem Einzelplatzrechner kann dies ruhig Sie selbst sein, aber falls:

  • Sie ein Multiuser-System haben und vbox für alle auf nur einer Rufnummer lauschen soll
  • oder die entgegengenommenen Anrufe vielleicht im Netzwerk per E-Mail verteilen möchten
  • oder Sie Sicherheitsfanatiker sind
  • oder Netzwerkclients auf das vbox Spoolverzeichnis zugreifen können/sollen
  • oder sonstige Gründe dafür sprechen...

sollten Sie vbox3 unter einem eigenen User laufen lassen, der extra hierfür angelegt wurde. Im Folgenden werde ich den User einfach phone nennen. Wenn Sie wirklich einen eigenen Useraccount für vbox erstellen, geben Sie als Homeverzeichnis am besten das Spoolverzeichnis an.

Falls Sie also einen eigenen User für vbox3 anlegen wollen, machen Sie dies nun. Oder ersetzen Sie den Usernamen "phone" im Folgenden immer durch Ihren eigenen Usernamen.

Richten Sie nun das Spoolverzeichnis ein:

bash# mkdir /var/spool/vbox/phone
bash# chown phone /var/spool/vbox/phone

Sie sollten sich vielleicht nach Abschluss der Installation nochmals davon vergewissern, dass wirklich alle Dateien und Unterzeichnisse des Spoolverzeichnis dem User phone gehören. Ausserhalb dieses Spoolverzeichnisses sollten dem User aber keine Dateien oder Verzeichnisse gehören.

5.2. vboxgetty

Die Gerätedateien /dev/ttyI? simulieren ein Modemgerät unter ISDN. An eines dieser virtuellen Modems wird vboxgetty nun gebunden. vboxgetty wird dann dieses virtuelle Modem überwachen und Anrufe entsprechend seiner Konfiguration entgegennehmen.

Die Modem-Devices sind durchnummeriert und welches Sie verwenden, ist völlig egal. Allerdings wird dieses Gerät durch vboxgetty belegt und kann dann nicht für andere Dinge verwendet werden. Bei SuSE sind standardmässig die Geräte ttyI6 und ttyI7 für vbox vorgesehen, also werde ich diese auch hier verwenden. Es steht Ihnen natürlich frei, jedes andere freie ttyI-Gerät zu verwenden.

Natürlich können Sie auch mehrere Instanzen von vboxgetty mit unterschiedlicher Konfiguration an verschiedene ttyI-Geräte binden, falls Sie dies für sinnvoll erachten. Bei mir war es nicht nötig und die Einrichtung ist immer die gleiche.

Nun müssen wir vboxgetty konfigurieren. Beispielsweise muss es wissen, auf welche Telefonnummer (MSN) es denn nun reagieren soll. Vorher benötigen Sie natürlich auch die MSN, auf die vboxgetty reagieren soll. vboxgetty nimmt nur die Anrufe entgegen, die auf dieser betreffenden MSN eingehen und ignoriert alle anderen. Im Normalfall haben Sie einen Standard-ISDN-Anschluss und 3 Rufnummern von der Telekom zugewiesen bekommen. Diese sind dann Ihre MSN's und Sie können frei entschieden, welche davon Sie für vboxgetty verwenden möchten.

Falls Sie eine Telefonanlage mit internem S0-Bus besitzen, müssen Sie hier jedoch die interne MSN eintragen, also bspw. die Nummer, die man wählt, wenn man intern auf Ihrem Endgerät anrufen möchte.

Im Folgenden gehe ich mal von der MSN 31 aus, da wir hier eine entsprechende TK-Anlage besitzen. Wer keinen internen S0-Bus hat, soll die "31" einfach durch seine eigene Rufnummer ersetzen.

Öffnen Sie die Datei /etc/isdn/vbox/vboxgetty.conf. Je nach den Einstellungen, die Sie beim ./configure gemacht haben, kann der Pfad dieser Datei ein anderer sein, aber der Name ist immer gleich.

Nun der Reihe nach die wichtigen Sektionen dieser Datei:

[VBOXGETTY-TTYI6]
init = ATZ&B512
initnumber = AT&E31

Diese Sektion legt die Konfiguration für das virtuelle Modem ttyI6 fest. Wie ein auch ein richtiges Modem müssen die virtuellen Modems mit AT-Befehlen konfiguriert werden, bevor man Sie verwenden kann. vboxgetty erledigt das beim Start nach den hier gemachten Angaben.

Die Zeile init = ATZ&B512 gibt den Initstring des Modems an. Wenn Sie nicht wissen, was das ist, dann lassen Sie es mit dem hier genannten Wert bewenden. Und wenn Sie es doch wissen, brauche ich ja nichts zu erklären :-D.

Für Sie relevanter ist die folgende Zeile (initnumber = AT&E31). Mit diesem AT-Befehl wird vboxgetty mitgeteilt, auf welche MSNs es reagieren soll. In meinem Fall (Sie erinnern sich - interner S0-Bus) ist das die MSN 31. Falls Sie lieber auf eine oder gar mehrere Telefonnummer reagieren wollen, sollten Sie die folgende Syntax verwenden:

initnumber = AT&Ltelnr

Sie können auch mehrere Telefonnummern, durch Semikolon getrennt, angeben. Weitere Information für die möglichen Kommandos erhalten Sie unter anderem auf der ttyI man page (bash$ man ttyI).

[VBOXGETTY-PHONE-31]
user = phone
group = dialout
umask = 0077
hdspace = 5000000

In dieser Sektion legen wir fest, welcher Benutzer einer MSN zugeordnet wird. In diesem Fall betreffen Anrufe auf der MSN 31 den Benutzer phone, den ich ja für alle Anrufe als Standardnutzer verwenden möchte. Hier können Sie natürlich genausogut differenzieren. Wenn Sie zum Beispiel bei einen TK-Server für eine Wohngemeinschaft oder ähnliches aufbauen wollen, steht es Ihnen frei, jedem eine eigene MSN zuzuordnen und die eingehenden Anrufe entsprechend auf die Nutzer zu verteilen. Das hat den Vorteil, dass jeder ein eigenes Spoolverzeichnis erhält, in welchem er nach Belieben herumwerkeln kann und auf das er mit dem Frontend seiner Wahl zugreifen darf. In diesem Fall brauchen Sie den User phone nicht, sondern können die Spoolverzeichnisse direkt den jeweiligen Nutzern übereignen.

5.3. init

Nun zum Start von vboxgetty. Prinzipiell spricht nichts dagegen, dies per Hand von der Konsole aus zu machen. Am Anfang, für Testzwecke, mag das vielleicht sogar die bessere Lösung sein. Gestartet wird vboxgetty mit folgendem Befehl:

bash# /usr/sbin/vboxgetty -d /dev/ttyI6 -x FULL

Die Parameter von vboxgetty entnehmen Sie dessen Hilfe (vboxgetty -h), hier wieder nur eine kurze Erklärung: vboxgetty soll sich das Gerät ttyI6 ("-d /dev/ttyI6") schnappen und alles mitloggen ("-x FULL"). Diese letzte Einstellung führt dazu, dass die Logs sehr schnell recht gross werden können, hilft aber bei der Fehlersuche. Wenn alles einwandfrei läuft, können Sie den Logging Level auch reduzieren.

Für den dauerhaften Einsatz empfiehlt sich jedoch ein anderes Vorgehen: vboxgetty als Dämon im Hintergrund zu starten.

Die Konfigurationsanleitung empfiehlt, die Daemontools zu verwenden. Aber bei SuSE und den meisten anderen Distributionen sind diese nicht dabei und ich selbst habe sie nicht getestet. Also hier die Einrichtung ohne Daemontools.

Öffnen Sie die Datei /etc/inittab und tragen Sie dort am Ende folgende Zeilen ein:

# vbox (voice box) getty
I6:35:respawn:/usr/sbin/vboxgetty -d /dev/ttyI6 -x FULL

Für die genaue Syntax der inittab können Sie sich die Manpage (man inittab) ansehen. Hier nur eine kurze Erklärung der einzelnen, mit einem Doppelpunkt getrennten Felder: Am Gerät ttyI6 (das "tty" entfällt in der inittab) soll innerhalb der Runlevel 3 und 5 das Programm vboxgetty mit den angegebenen Parametern gestaret werden. Das Programm soll automatisch neu gestartet werden, wenn es beendet wird ("respawn").

Teilen Sie nun dem init Prozess mit, dass Sie seine Konfigurationdatei geändert haben und er den neuen Prozess starten soll:

bash# init q

Warten Sie einen Moment und prüfen Sie dann nach, ob der Prozess wirklich läuft:

bash# ps awx|grep vbox
1593 ttyI6 S 0:00 /usr/sbin/vboxgetty -d /dev/ttyI6 -x FULL
21075 pts/2 S 0:00 grep vbox

In diesem Falle wurde vboxgetty erfolgreich gestartet (siehe Zeile mit "1593"). Wenn Sie eine solche Angabe nicht bekommen, suchen Sie am besten in der Datei /var/log/messages nach Fehlermeldungen. Einige typische Probleme werden im Folgenden beschrieben.

5.3.1. Bemerkungen

Hier möchte ich einmal kurz auf einige mögliche Probleme eingehen, die häufig auftreten und deren Ursache dem Laien nicht immer sofort ersichtlich ist.

  • Wenn vboxgetty nicht startet und in den Logs die Fehlermeldung "blahblah is respawing to fast, disableing for 5 minutes" auftaucht, dann bedeutet das, dass vboxgetty sich nach dem Start sofort wieder beendet hat. Entsprechend seiner Konfiguration hat der init Prozess versucht, es neu zu starten ("respawn"), aber es hat sich wieder und wieder beendet. Also hat der Prozess es aufgegeben und wird die nächsten 5 Minuten nicht mehr versuchen, das Programm zu starten. Die Ursache hierfür kann vielfältig sein. Probieren Sie zunächst, vboxgetty auf der Konsole zu starten, vielleicht gibt es eine brauchbare Meldung aus. Prüfen Sie auch die Konfigurationsdatei und die inittab auf Tippfehler!
  • Wenn vboxgetty bereits gestartet ist und Sie dann etwas an der Konfiguration (insbesondere an vboxgetty.conf) ändern, oder wenn allgemein irgendeine Änderung an vbox bzw. raccess4vbox scheinbar unbeachtet bleibt, versuchen Sie als erstes, vboxgetty zu einem erneuten Einlesen seiner Konfiguration zu bewegen:
    bash# kill -HUP `cat /var/run/vboxgetty-ttyI6.pid`

5.4. Einrichten der Spoolverzeichnisses

Nun muss das Spoolverzeichnis noch mit einigen Dateien "bevölkert" werden. Wie üblich, beziehe ich alles auf den User phone. Als erstes nehmen Sie die Identität des Users phone an und kopieren die Vorlagen herüber:

bash# su - phone
bash$ cp -a /usr/share/isdn/vbox/skel/* .

Anschliessend ändern Sie noch die Rechte der Skripte, um sicherzustellen, dass kein Unbefugter die darin enthaltenen PINs auslesen kann:

bash$ chmod 0600 raccess/*

Nun können Sie noch die Datei raccess/answeringmachine mit einem Editor Ihrer Wahl öffnen und die dort enthaltenen PINs auf andere Werte einstellen.

An dieser Stelle endet die offizielle Konfigurationsanleitung, aber ich gebe noch ein paar weitere Tipps zur Einrichtung, bevor ich zu meinen Modifikationen komme.

Ein letzter Punkt noch, bevor wir zum abschliessenden Test kommen: Die Standardeinstellung von vbox3 ist, eingegangene Anrufe über das Skript /usr/share/isdn/vbox/bin/vboxmail per E-Mail zu versenden. Als Empfänger wird dort der Benutzer eingetragen, der in der Datei vboxgetty.conf für die betreffende MSN eingetragen wurde, also beispielsweise phone. Wenn alle eingehenden Anrufe prinzipiell nur an einen einzigen Benutzer weitergeleitet werden sollen und dieser nicht mit phone identisch ist, empfehle ich, im Homeverzeichnis des Users phone eine Weiterleitung zu Ihrem eigentlichen Benutzeraccount einzurichten:

bash$ cd ~
bash$ echo 'ihr_login_name@localhost' > .forward
Dann landen alle neuen Anrufe per E-Mail in Ihrem lokalen Postfach.

5.5. Der erste Test

Trotzdem können Sie bereits einen ersten Test machen, um zu sehen, ob bisher alles richtig war und auch, um nach der schwierigen Installation endlich mal ein paar Resultate zu sehen. Rufen Sie einfach mal auf der MSN, auf die Sie vboxgetty konfiguriert haben, an und Sie müssten die Standardansagen hören und bereits in der Lage sein Nachrichten aufzusprechen und abzuhören.

Tipp: Wir haben nicht umsonst den Logging Level von vboygetty auf "FULL" gestellt. Am besten überwachen Sie während des Anrufs die Logdatei:

bash# tail -f /var/log/vboxgetty-ttyI6.log

Dann können Sie sehen, was genau passiert und im Fehlerfalle entnehmen Sie die Ursache diesem Protokoll. Die eingegangenen Anrufe finden Sie in im Postfach des Users phone oder - falls Sie die Weiterleitung eingerichtet haben - in Ihrem eigenen Postfach. Ausserdem werden Sie im Spoolverzeichnis unterhalb von ./new angelegt.

Das Dateiformat ist in beiden Fällen µ-law. Zum Abspielen verwenden Sie am besten folgenden Befehl:

bash$ sox -t ul -r 8000 -U dateiname -t raw -u -r 8000 - > /dev/dsp

Hierfür benötigen Sie das Programm sox, dass jedoch bei den meisten Distributionen enthalten sein dürfte.


6. Weitergehende Konfiguration

Im folgenden Kapitel werde ich die bisher noch nicht erwähnten, aber dennoch vorhandenen Konfigurationsdateien und deren Sinn und Zweck kurz erläutern - sofern ich ihn verstanden habe, wohlgemerkt.

Ich möchte dabei aber betonen, dass ich später genauer auf die Zusammenhänge und Funktionsweise des ganzen Skriptapparetes eingehen werde. Hier soll wirklich nur der Aufbau der Dateien beschrieben werden.

6.1. vboxrc

Die Datei /var/spool/vbox/phone/vboxrc enthält Angaben darüber, welche Rufnummer zu welchem Namen gehört und welche Profile und Skripte anhand von Anrufer und Uhrzeit ausgewählt werden sollen.

6.1.1. Sektion [CALLERID]

In der Sektion [CALLERID] erfolgt eine Zuweisung von Rufnummern zu Profilen und Namen. Jeder Rufnummer oder Gruppe von Rufnummern wird ein Profil und ein Name zugewiesen.

An einem Beispiel wird das wohl am besten deutlich:

[CALLERID]
456456 me Me
001781234567 mobile Mobile
0234512345* default Peter
0654345678 vip Tanja
* default *** Unknown ***

Man erkennt die Syntax: [nr] [profil] [name].

In diesem Fall definiere ich zunächst meine eigene Telefonnummer, weise ihr das Profil "me" und den Namen "Me" zu. Danach trage ich noch mein eigenes Handy mit dem Profil "mobile" und dem Namen "Mobile" ein. Weiter unten in der Datei werde ich dies benutzen, um besondere Aktionen für den Fall, dass ich mich selbst anrufe, zu definieren.

Danach gebe ich die Rufnummer meines (erfundenen!) Freundes Peter ein. Peter hat einen ISDN-Komfortanschluss mit 10 Rufnummern, die von 123450 bis 123459 reichen. Seine Vorwahl ist 02345. Damit Peter immer gleich behandelt wird, egal von welchem seiner Endgeräte er anruft, ich aber nicht für jede der 10 Rufnummern einen eigenen Eintrag schreiben muss, habe ich die letzte Ziffer mit einen Stern maskiert. Peter erhält das Profil "default", wird also wie jeder andere Anrufer behandelt. Nur sein Namen soll anstelle der Rufnummer angezeigt werden.

Danach kommt Tanja an die Reihe. Sie hat nur eine Telefonnumer (06543-5678) und erhält das Profil "vip", das ihr eine bevorzugte Behandlung garaniert. Zum Beispiel könnte ich ihre Anrufe grundsätzlich auf mein Handy weiterleiten oder es bei ihr einfach länger klingeln lassen, bevor vbox den Anruf entgegennimmt.

Die letzte Zeile soll alle anderen Anrufer erwischen. Jede beliebige Rufnummer ("*") erhält das Profil "default" und als Anrufername "*** Unknown ***"

6.1.2. Profil Sektionen

Die Profile, die ich oben zugewiesen habe, müssen natürlich auch noch definiert werden. Dazu schreibt man für jedes Profil eine eigene Sektion, die mit dem Profilnamen in eckigen Klammern beginnt.

Beispiel:

[DEFAULT]
* * raccess4vbox3.tcl 90 3 5

[ME]
* * raccess4vbox3.tcl 90 2 2

Jede Sektion besteht aus einer oder mehr Zeilen der Form [zeit] [wochentag] [skript] [aufnahmedauer] [klingeldauer] [max. klingeldauer].

Somit beschreibt das Feld [zeit] die Uhrzeit(en), an denen der Eintrag gelten soll, [wochtentag] den Wochentag, an dem der Eintrag gültig ist, [skript] das auszuführende Programm und die restlichen drei Felder bestimmen, wie lange die Aufnahme max. dauern darf, wie lange es klingeln soll, bevor abgehoben wird und wie lange es höchstens klingeln darf, bis der Versuch abgebrochen wird.

Ein korrekter Eintrag würde also beispielsweise so aussehen:

8-10,13:30-15:30 MO,DI,MI,DO raccess4vbox3.tcl 90 2 5
8-10 FR raccess4vbox3.tcl 90 3 5
* * raccess4vbox3.tcl 90 2 5

An dieser Stelle übrigens herzlichen Dank an Thomas Karcher und Lothar Schweikle-Droll, die mir beide schon vor einiger Zeit eine entsprechende E-Mail zukommen liessen, weil meine ursprüngliche Anleitung an dieser Stelle wohl falsch war.

6.2. raccess.conf

Die Datei raccess.conf im Spoolverzeichnis dient der Festlegung einiger wichtiger Werte. Vermutlich kann man hier noch sehr viel mehr einstellen, ich beschränke mich aber in Ermangelung weiterer Informationen mal darauf, nur die Einstellungen in der Vorlage zu erläutern:

[tuning]
say 1
say_path /usr/local/bin/mbrola-say
say_flag ""
say_maxfilenamelen 16
say_cache 1
say_cachedir /usr/share/isdn/vbox/ulaw
say_breath " & "
callhandler /usr/share/isdn/vbox/bin/vboxmail

[dtmf]
8 "repeat" {repeat}
0 "skip" {skip}

[events]
error "error-msg"

[run]
run answeringmachine

6.2.1. Sektion [tuning]

In dieser Sektion werden alle Einstellungen vorgenommen, die für die on-the-fly Sprachsynthese erforderlich sind. In einem späteren Kapitel werde ich dies genauer erläutern, hier nur kurz die Bedeutung der Variablen. Wie Sie die Sprachsynthese selbst implementieren, folgt später.

say

Legt fest, dass raccess versuchen soll, die Sprache on-the-fly zu generieren, falls erforderlich. Default ist 0.

say_path

Gibt den vollständigen Pfad zu einem Programm an, welches Text von der Standardeingabe stdin einliest und diese in synthetisierte Sprache in Form eines µlaw komprimierten 8KHz Audiodatenstrom auf der Standardausgabe stdout ausgibt. In meinem Erweiterungspaket ist das Skript mkulawmgw dazu fähig, vorausgesetzt, die benötigten Hilfsprogramme stehen zur Verfügung.

say_flag

Parameter, die dem o.g. Programm mitgegeben werden sollen, beispielsweise um eben das Ausgabeformat festzulegen.

say_maxfilenamelen

Sprache, die raccess einmal synthetisiert hat, speichert es in einem Cache, um sie im Falle erneuter Verwendung schneller und mit weniger Rechenaufwand wiederverwenden zu können. Dabei leitet sich der Name der Datei von dem Text ab, der synthetisiert werden soll und kann man dieser Variable auf eine bestimmte Maximallänge beschränkt werden.

say_cache

Gibt an, dass einmal synthetisierte Sprache in einem Cache für die erneute Verwendung gespeichert werden soll.

Leider scheint es jedoch, als wäre dieser Parameter in neuen Versionen von vbox3 nicht mehr verfügbar.

say_cachedir

Legt fest, wo dieser Cache liegt.

say_breath

Damit die synthetisierte Sprache auch wirklich wiederverwendet werden kann, muss sie in geeignete Stücke zerlegt werden. Beispielsweise ein ganzer Satz in seine Worte, damit eben diese Worte später erneut Verwendung finden. Hier legen Sie ein Trennzeichen fest, das angibt, an welchen Stellen im Text diese Auftrennung erfolgen soll.

callhandler

Das Skript, das nach Beendigung eines Anrufes die Weiterverarbeitung übernimmt, in diesem Falle eben vboxmail, um die Nachricht per Mail zuzustellen.

6.2.2. Sektion [dtmf]

In dieser Sektion werden globale, während des kompletten Anrufs geltende DTMF-Tastentöne definiert, in diesem Falle eben "8" für Wiederholen und "0" für Überspringen.

6.2.3. Sektion [events]

Hier können Sie bestimmte, häufig wiederkehrende Texte als Events deklarieren, auf die Sie dann im konkreten Fall nur Bezug nehmen müssen, um sie auszugeben. Quasi eine Art Textbaustein. Hier ist dies die Standardfehlernachricht.

6.2.4. Sektion [run]

In dieser Sektion geben Sie an, welche Aktionen beim Entgegennehmen eines Anrufes erfolgen sollen. In diesem Fall der Start des Skriptes answeringmachine.


7. Abhören der Nachrichten - Die Möglichkeiten

Wie bereits mehrfach erwähnt, werden aufgezeichnete Anrufe per E-Mail weitergeleitet. Dabei werden Sie es unter Umständen etwas unkomfortabel finden, jedesmal die Konsole zum Abspielen der Nachrichten bemühen zu müssen. Sie haben daher mehrere Möglichkeiten.

7.1. Mimetypen

Zunächst mal können Sie den oben genannten Befehl zum Abspielen von µlaw komprimierten Audiodateien in ein Shellskript packen (oder mein Skript ulawplay verwenden, dass in meinem Erweiterungspaket enthalten ist) und dieses als die für das Abspielen von .ulaw-Dateien zuständige Applikation beim Desktop Ihrer Wahl einzutragen.

Unter KDE2 würde das so gehen: Starten Sie das Kontrollzentrum und wählen Sie Dateianzeige -> Dateizuordnungen aus. Klicken Sie dann auf Hinzufügen und wählen Sie die Gruppe Audio und einen passenden Namen, zum Beispiel "x-ulaw". Tragen Sie dann bei dem neuen Mimetypen das Dateimuster "*.ulaw" und eine passende Beschreibung ein. Bei den Anwendungen für diesen Mimetypen klicken Sie auf Hinzufügen, tragen Sie das Skript (z.B. "ulawplay") ein und aktivieren Sie das Kästchen In Terminal starten.

Je nach Ihrem System müssen Sie diese Einstellungen vielleicht woanders vornehmen, vielleicht im Mailreader selbst. Aber einmal vorgenommen, genügt meist ein Klick auf die angehängten Audiodatei, um sie abzuspielen.

7.2. Versand als Wave oder mp3

Eine andere Möglichkeit, das Abhören der Nachrichten komfortabler zu machen, ist, einfach das betreffende Audioformat zu ändern. Sie können die Datei auch als .wav oder .mp3 versenden und sie so auch in Windowsclients problemlos anhören.

In meiner Erweiterungssammlung finden Sie die beiden Skripte vboxmail.send-as-wav und vboxmail.send-as-mp3. Beide machen das, was der Name schon verspricht, sie versenden die angehängte Datei als Wave- oder mp3-Datei. Beide Skripte sind Abwandlungen eines Skripts von Lars Wessels, der die eigentliche Arbeit daran hatte. Ich habe nur nachträglich einige Kleinigkeiten geändert. Vermutlich müssen Sie noch einiges daran anpassen, aber als Anregung, um sich ggf. auch selber was zu basteln dürften sie reichen.

Hinweis: Für das Skript vboxmail.send-as-mp3 brauchen Sie den freien mp3-Encoder LAME.

Ich empfehle Ihnen, das bereits vorhandene Skript vboxmail einfach in vboxmail.original umzubenennen. Dann können Sie einfach per Symlink das Skript festlegen, ohne ständig in der vbox Konfiguration herumwerkeln zu müssen. Ungefähr so:

bash# cd /usr/share/isdn/vbox/bin
bash# mv vboxmail vboxmail.original
bash# ln -s vboxmail.send-as-mp3 vboxmail

Hinweis: Damit in meinem Skript vboxmail auch die Nummer, die angerufen wurde, eingetragen wird, müssen Sie den Patch gegen raccess4vbox3.tcl

anbringen!

7.3. Zugriff per vbox-Client

Die meisten mir bekannten Clients für vbox haben ein Problem: Sie wurden für vbox2 geschrieben und laufen nicht mit vbox3. Ich kenne keinen Client für vbox3, der funktioniert und weiss nicht, ob man die Konfiguration von vbox3 so abändern kann, dass ein vbox2 Client darauf zugreifen kann.

Ich halte es auch für sinnfrei, da der Versand per Mail viel komfortabler ist. Man kriegt neue Anrufe automatisch ins Postfach und muss nicht umständlich einen Client starten.

Wenn jemand dennoch meine Wissenslücken in dieser Richtung schliessen kann, möge er oder sie mir bitte mailen.

7.4. Fernabfrage

Natürlich ist auch eine Fernabfrage möglich. Unter anderem dafür haben wir uns die ganze Mühe ja gemacht! Also, rufen Sie vbox an und geben Sie die Fernabfrage-PIN ein, die Sie in der Datei /var/spool/vbox/phone/raccess/answeringmachine eingetraten haben.

Sie befinden sich nun im Fernabfragemodus und bekommen die neuen Nachrichten (sofern vorhanden), angesagt. Mit den Tasten des Telefons können Sie durch die Ansagen navigieren, Ansagen löschen und den Fernabfragemodus verlassen. Welche Taste dabei welche Funktion hat, möchte ich hier nicht beschreiben, da die Einteilung der Tasten in meinem Erweiterungpaket sich von der Standardbelegung unterscheidet (da ich sie für systematischer halte). Sie können aber einfach mal einen Blick in die Datei /var/spool/vbox/phone/raccess/remoteaccess werfen, dort sind die Tasten definiert und ich meine, die Syntax ist eigentlich auch gut für Menschen lesbar.

In folgenden Kapitel, wenn ich mich mit der allgemeinen Funktionsweise von vbox befassen und mein Erweiterungspaket erläutere, werde ich hierauf auch nochmal näher eingehen.

7.5. Abfrage über Web-Frontend

Marc Sülzle < msuelzle@users.sourceforge.net> hat ein Web-Frontend für vbox3 in Perl realisiert.

Das Projekt befindet sich hier: hier.


8. Das Funktionsprinzip

Ich will ehrlich sagen, dass ich dem folgenden Kapitel etwas zwiespältig gegenüber stehe. Ich werde hier versuchen, die Funktionsweise von vbox3 und raccess4vbox3 zu erklären. Welche Skripte wo, warum und wann angerufen werden und so weiter.

Das Problem dabei ist, ich kann meine Aussagen nur auf meine eigenen Erfahrungen begründen. Es gibt (meines Wissens nach) keine entsprechende Dokumentation im Internet und für das Lesen des Quellcode und der tcl-Skripte war ich zu faul und/oder zu blöd. Also verbeite ich hier im Grunde genommen unbewiesene Vermutungen!

Leider ist es notwendig, um mein Erweiterungspaket auch zu verstehen, deshalb habe ich es trotzdem getan. Dennoch ist dieses Kapitel noch mehr als die anderen von jeglicher Gewähr befreit und falls ich etwas Falsches schreibe, bin ich für jeden Hinweis dankbar.

8.1. Allgemeines Prinzip

Das allgemeine Prinzip von vbox3 besteht darin, dass einzelne TCL-Skripte das Verhalten und die Funktionen des Programmes bestimmen. So kann der Anwender, ohne den eigentlichen Programmcode zu ändern, beliebige neue Funktionen hinzufügen, indem er einfach entsprechende Skripte schreibt. Dazu muss er natürlich TCL beherrschen, was bei mir leider nicht der Fall ist. Allerdings ist das Skript raccess4vbox3.tcl so ausgeklügelt, dass man kaum Veranlassung haben dürfte, etwas daran zu ändern.

raccess4vbox3.tcl bezieht seine Einstellungen von Konfigurationsdateien, die es nach Belieben nachladen kann. Als allererstes (direkt nach Annahme des Anrufes) wird die Konfiguration geladen, die in der Datei raccess.conf in der Sektion [run] steht. In diesem Fall also answeringmachine. Diese Dateien liegen übrigens alle unterhalb von /var/spool/vbox/phone/raccess/. Zunächst haben wir also einen Anrufbeantworter.

In jeder Datei kann nun eine Reihe von DTMF-Sequenzen (die Tastentöne bei Mehrfrequenzwahl) definiert werden, die bestimmte Aktionen ausführen. Und natürlich kann eine Reihe von Funktionen auch immer ausgeführt werden. Ist das Skript komplett durchgearbeitet, beendet sich vboxgetty und legt auf.

Aber man kann auch innerhalb einer jeden Datei weitere Konfigurationsdateien aufrufen, die wiederum andere aufrufen können und in jedem können neuen DTMF Tastensequenzen mit neuen Aktionen festgelegt werden. So kann man (sprachgeführte) Menüs aufbauen.

Am Beispiel der Datei answeringmachine möchte ich hier einmal die Funktionsweise näher erläutern.

8.2. Die Datei answeringmachine

; config for mode answeringmachine
[run]
play @standard.ulaw & @beep.ulaw
record on
wait 120
[dtmf]
*4711# "remote access mode" {run remoteaccess}
*4712# "accept" {run sysinfo}

; read raccess/dialup before enabling this mode
*4713# "accept" {run dialup}
[events]

8.2.1. Sektion [run]

In dieser Sektion wird festgelegt, was raccess4vbox3 denn machen soll, sobald es gestartet wurde. Mit dem play Befehl wird zuerst die Ansage und dann ein Signalton ausgegeben. Normalerweise versucht raccess4vbox3, die hinter dem play Befehl stehenden Zeichen direkt zu sprechen, also entweder aus dem Cache zu laden oder sie zu synthetisieren, falls noch nicht geschehen. Durch das vorangestellte "@" wird ihm mitgeteilt, dass dies nicht der zu sprechende Text, sondern ein Dateiname ist und dass diese Datei abgespielt werden soll.

Nachdem die Ansage abgespielt wurde, wird mit record on die Sprachaufzeichnung eingeschaltet. Wenn ich mit richtig entsinne, steht dieser Befehl in der Standardkonfiguration vor dem Abspielen der Ansage. Dies ist meiner Ansicht nach aber problematisch, denn während der Anrufer die Ansage hört, spricht er ja im Allgemeinen nicht schon seine Nachricht auf das Band. Und so wartet er mit dem Sprechen, bis die Ansage zuende ist und er den Piep hört. Entscheidet sich der Anrufer nun, keine Nachricht zu hinterlassen und legt auf, dann erhält man einen eingegangen Anruf gemeldet, der aus nichts als längerem Schweigen besteht. Und selbst wenn der Anrufer eine Nachricht aufspricht, muss man beim Abspielen immer die Zeit, die die Ansage dauert, warten, bis man weiss, was eigentlich los ist.

Mit dem folgenden wait 120 wird raccess4vbox3 veranlasst, nicht sofort wieder aufzulegen, sobald es die Ansagen abgespielt und die Sprachaufzeichnung aktiviert hat. Statt dessen legt es eine Pause von 120 Sekunden ein, um dem Anrufer genügend Zeit zu geben, seine Nachricht aufzusprechen.

8.2.2. Sektion [dtmf]

In dieser Sektion werden alle zur Zeit gültigen DTMF-Tastensequenzen definiert.

*4711# "remote access mode" {run remoteaccess}

In dieser Zeile steht also, dass das aufeinanderfolgende Drücken der Tasten *,4,7,1,1,# die Meldung "remote access mode" (Ausgabe wie beim play Befehl) erzeugen soll und dann auf die Konfigurationsdatei remoteaccess gewechselt werden soll.

In diesem Fall hat das Ganze die Funktion einer PIN. Wer den Code kennt (*4711#), kann ihn eingeben und landet im Fernabfragemenü, wo er die eingegangenen Nachrichten abhören kann.

Entsprechendes gilt für die beiden anderen Modi (sysinfo und dialup), die über jeweils andere PINs zu erreichen sind.

8.3. Die Datei remoteaccess

; config for mode remoteaccess
[run]
record off
record delete
raccess start
[dtmf]
2 "remote access mode & exit" {raccess_quit}
4 "1. & message" {raccess_first}
6 "last & message" {raccess_last}
7 "previous & message" {raccess_rewind}
9 "next & message" {raccess_forwind}
8 "repeat" {raccess_repeat}
[events]
last_msg "repeating last message"
no_msgs "exit & remote access mode"
no_of_msgs "$no & messages"
msg_header "%B & %e. & %H & %M & %p & $id"

8.3.1. Sektion [run]

In dieser Sektion wird zunächst die Sprachaufzeichnung mit record off abgestellt. Bedenken Sie, dass wir vom Skript answeringmachine kommen und die Sprachaufzeichnung noch aktiv ist. Während der Fernabfrage brauchen wir sie aber nicht und das, was bisher aufgezeichnet wurde, kann bedenkenlos gelöscht werden. Daher ein record delete hinterher.

Mit raccess start rufen wir eine vordefinierte Funktion im eigentlichen raccess4vbox3 Skript auf und initialisieren so die Fernabfrage.

8.3.2. Sektion [dtmf]

Nun, die Syntax der folgenden Tastendefinitionen möchte ich nicht wiederholen. Im Grunde genommen ist es genau wie in der Datei answeringmachine. Die einzelnen Befehle, raccess_first, raccess_last, usw. sind alle bereits vordefinierte Funktionen aus dem eigentlichen TCL-Skript und müssen nur noch aufgerufen werden.

8.3.3. Sektion [events]

Die [events] interpretiere ich als eine Möglichkeit, aus den vordefinierten Funktionen (z.B. raccess_first) heraus wieder benutzerkonfigurierbare Ausgaben zu erzeugen. Die Funktionen erzeugen solche Ereignisse, Events, und diese können wir hier mit den entsprechenden Meldungen belegen. Eine Art Callback-Funktion, wenn das jemanden was sagt.

Besonders erwähnenswert ist hier der msg_header. Dieser beschreibt das Format, in dem die Datumangabe erfolgt. Wenn bei raccess4vbox3 bei Ihnen also im englischen Datumformat vorliest ("Anruf vom November, 13..."), dann ist dies der Ansatzpunkt, es zu ändern. Eine entsprechend angepasste Version des msg_header können Sie der remoteaccess meines Erweiterungspakets entnehmen.

8.4. Die Datei sysinfo

[run]
record off
do 100
play "sysinfo-mode & ready & help"
wait 10
[dtmf]
1 "uptime is" {play "|/usr/share/isdn/vbox/bin/uptime"}
2 "1. & ethernet & ip is" {play "|/usr/share/isdn/vbox/bin/ip-eth0"}
3 "2. & ethernet & ip is" {play "|/usr/share/isdn/vbox/bin/ip-eth1"}
0 "exit & sysinfo-mode" {raccess_quit}
9 "sysinfo-help" {repeat}

8.4.1. Sektion [run]

Zunächst stellen wir, wie schon in remoteaccess, die Sprachaufzeichnung ab. In der Standardkonfiguration steht hier jedoch kein record delete, was ich nicht ganz verstehe, aber sei's drum.

Dann folgt eine Schleife. 100mal soll das Skript den folgenden play Befehl ausführen und dann 10 Sekunden warten. Das dient dazu, dass der Anrufer immer weiss, wo er gerade ist und nicht von dem Dauerschweigen verwirrt wird.

Beachten Sie, dass hier, ebenso wie bereits vorher schon, ausgiebig von dem in der raccess.conf definierten say_breath Zeichen "&" gemacht wird.

8.4.2. Sektion [dtmf]

Hier wird nun, neben der üblichen Tastendefinition, auch ein neues Schlüsselzeichen für den play Befehl eingeführt. Das "|" signalisiert, dass der dahinterstehende Befehl ausgeführt und dessen Ausgabe als Sprache ausgegeben werden soll.

Somit wären z.B. die Befehle play "Hallo Welt" und play "|echo Hallo Welt" äquivalent. In unserem Fall ermitteln z.B. das Skript ip-eth0 die IP-Adresse des Netzwerkinterfaces eth0 und liefert eine für raccess4vbox3 verständliche Textmeldung zurück.


9. Das Erweiterungspaket

Nun ist es endlich soweit! Wir machen uns ans Erweiterungspaket heran. Im Grunde besteht das Paketarchiv aus einem Tarball, der mein eigene vbox3 Komplettkonfiguration enthält. Im Folgenden werde ich nach dem Entpacken kurz erläutern, was ich wo und warum geändert habe. Sie können die von mir geänderten Dateien ja mit dem Original vergleichen und so die entscheidenden Punkte schnell finden. Ich beziehe mich dabei, wie üblich, auf die Standardpfade, wie sie auch beim Entpacken meines Paketes wieder unterhalb des aktuellen Verzeichnisses angelegt werden.

9.1. Installation

Am besten entpacken Sie das Paket erst mal irgendwo von Ihrem vbox3 System getrennt und schauen es sich genau an. Bestimmt müssen Sie noch einige Anpassungen daran vornehmen. Zum Entpacken geben Sie wie üblich ein:

bash# tar xvzf /pfad/zu/vbox3-stuff.tar.gz

Bei den einzelnen Skripten steht jeweils eine kurze Anleitung, wie man sie verwendet. Aber da ich eine komplette Kopie meiner eigenen raccess4vbox3 Konfiguration mitgeliefert habe, können Sie auch einfach in die entsprechenden Dateien direkt verwenden. Wenn Sie nicht lange herumprobieren wollen, dann schauen Sie einfach, wie beispielsweise meine sysinfo aussieht, kopieren Sie sie über Ihre eigene und kopieren Sie die notwendigen Skripte in die entsprechenden Verzeichnisse.

Hinweis: In den aktuellen Fassung habe ich die Pfade etwas verkürzt. Ausgepackt enthält das Archiv zwei Verzeichnisse, vbox mit der vbox3-Systemkonfiguration und spooldir mit den Konfigurationsskripten meines Spoolverzeichnisses.

Unterhalb von vbox liegen dann bin mit allen Skripten (entspricht /usr/share/isdn/vbox/bin) und share mit den restlichen gemeinsamen Dateien.

9.2. Änderungen in /usr/share/isdn/vbox/bin

In diesem Verzeichnis befinden sich normalerweile alle externen Skripte, die von vbox3 aufgerufen werden.

9.2.1. Die Mailerskripte

Das alte, bei vbox3 enthalte Skript vboxmail habe ich nach vboxmail.original umbenannt und es sind zwei neue Skripte hinzugekommen, vboxmail.send-as-wav und vboxmail.send-as-mp3. Beide wurden schon weiter oben bei den Abfragemöglichkeiten erwähnt, daher will ich hier nicht näher darauf eingehen. Kopieren Sie sie am besten einfach ins richtige Verzeichnis.

9.2.2. Die IP Abfrage

Im Original sind die Skripte von Ermitteln der IP einzeln und losgelöst voneinander. Anders gesagt, das Skript, dass die IP Adresse von eth0 ermittelt (namentlich ip-eth0) ist ein völlig anderes als das für ippp0. Will man nun die Ausgabe der IP Adresse irgendwie ändern, muss man beide Skripte parallel ändern und weiterpflegen.

Ich habe daher ein einheitliches Skript names get-ip geschrieben, welches die aktuelle IP Adresse eines beliebigen Interfaces ermittelt und eine für vbox3 passende Ausgabe erzeugt. Damit es weiterhin kompatibel zu der original raccess4vbox3 Konfiguration ist, erzeugt man einfach für jedes abzufragende Interface einen Symlink und ruft diesen auf.

get-ip extrahiert aus dem Namen, unter dem es aufgerufen wird (z.B. ip-eth0) den Namen des Interfaces, ermittelt dessen IP und liefert eine entsprechende Ausgabe zurück.

Mit dem Befehl:

bash# cd /usr/share/isdn/vbox/bin
bash# ln -s get-ip ip-ippp1

können Sie z.B. einfach einen Symlink für die IP Abfrage von ippp1 erzeugen, den Sie dann nur noch in der Datei sysinfo einpflegen müssen:

3 "2. & internet & ip is" {play "|/usr/share/isdn/vbox/bin/ip-ippp1"}

Um dieses Skript anstelle des Originals zu verwenden, kopieren Sie es einfach ins Verzeichnis /usr/share/isdn/vbox und richten Sie die nötigen Symlinks ein. In der raccess4vbox3 Konfiguration, speziell dem Skript sysinfo, brauchen Sie nichts zu ändern.

Das Skript unterstützt ferner auch noch die "besonderen" Symlink-Namen ip-devfromfile, wobei es den Namen des Interfaces aus einer Datei einliest, die per Kommandozeilenparameter zu übergeben ist und ip-ipfromfile, wobei es direkt die IP-Adresse aus einer solchen Datei ausliest.

Bei Probleme, Fehler und Tipps finden Sie eine nähere Beschreibung von Sinn und Zweck des ganzen.

9.2.3. Interface-Status

Hier gilt das gleiche wie bei der IP Adresse. Ein gemeinsames Skript, get-ifstatus, ermitteln den Status des Interface, dessen Name aus dem entsprechenden Symlink axtrahiert wurde.

Jedoch wurde hier noch ein kleiner Zusatz von mir eingebaut, dessen Beschreibung Sie zwei Abschnitte weiter unten unter der Überschrift "Interneteinwahl" finden.

9.2.4. Sensoren

Eine Zugabe von mir ist das Skript get-sensor, dass Ihnen dabei hilft, die aktuellen Temperaturen und Lüfterdrehzahlen auf Ihrem PC anzusagen. Damit können Sie auch aus der Ferne eine Überwachung dieser Werte durchführen.

Erforderlich für dieses Skript ist das lm-sensors Paket, welches für die eigentliche Sensorüberwachung verantwortlich ist.

Das Skript akzeptiert einen Kommandozeilenparameter, der den Sensor bezeichnet, dessen Wert ausgeben werden soll. Die Namen sind der Sensoren entsprechen denen aus /etc/sensors.conf. Als Ersatz für das Leerzeichen können Sie den Unterstrich ("_") verwenden.

Um dieses Skript zu verwenden, können Sie jede beliebige Konfigurationsdatei (sysinfo würde sich aber anbieten) für einen oder mehrere entsprechende Einträge modifizieren. Beispielsweise so:

5 "CPU & temperature & is" {play "|/usr/share/isdn/vbox/bin/get-sensor CPU_Temp"}
6 "CPU & fan speed & is" {play "|/usr/share/isdn/vbox/bin/get-sensor CPU_Fan"}
7 "CPU & core voltage & is" {play "|/usr/share/isdn/vbox/bin/get-sensor CPU_core"}

9.2.5. Interneteinwahl

Eines der besonderen "Schmankerl" von raccess4vbox ist, dass man damit eine ferngesteuerte Einwahl ins Internet konfigurieren kann. Nachdem die Verbindung aufgebaut wurde, kann man dann ausserdem die ebenfalls bereits vorhandene Funktion zum Abfragen der IP-Adresse verwenden um so einfach und bequem einen Fernzugriff auf den eigenen Rechner zu haben.

Im Original wird dies von dem Skript setifstatus erledigt, welches aber unter ähnlichen Schwächen leidet wie die anderen Skripte auch. Statt dessen habe ich mein Skript get-ifstatus, welches eigentlich nur dazu diente, den Status des Interfaces auszulesen, so verändert, dass es auch die Einwahl- und Abwahl ins Internet durchführen kann.

Zuerst wurden leider nur ISDN-Interfaces (ipppX) unterstützt. Mittlerweile habe ich auch die Unterstützung für ADSL über den rp-ppoe eingebaut. Inwieweit das vielleicht auch bei anderen PPPoE-Implementierungen oder gar normalen Modems funktioniert, weiss ich nicht. Aber es steht natürlich jedem frei, sich an der Erweiterung des Skripts zu beteiligen.

Die Verwendung ist ganz einfach: Wenn man das Skript ohne Kommandozeilenparameter aufruft, wird lediglich der Status des Interfaces ermittelt. Diese Variante findet in der Datei sysinfo ihre Verwendung. Wird jedoch zusätzlich ein Kommandozeilenparameter mit angegeben, so kann man die Einwahl steuern. Dabei steht der Parameter up für die Einwahl und der Parameter down für die Trennung vom Internet. Der Name des Interfaces wird, wie schon oben beschrieben, aus dem Symlink gewonnen.

Zur Verwendung tragen Sie einfach in eine geeignete Konfigurationsdatei (dialup ist z.B. sehr empfehlenswert) ein:

1 "information" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ippp0"}
2 "hangup" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ippp0 down"}
3 "dialing" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ippp0 up"}

Die ehemals geforderte Grossschreibung der Worte "UP" und "DOWN" wurde aufgehoben! Sie können noch sowohl "UP" als auch "up" schreiben, wie Sie wollen.

Wie Sie erkennen können, verwendet das Skript sudo, um die eigentlich nur root möglichen Befehle auszuführen. Bedenken Sie, dass Sie dem User phone entsprechende Rechte in der /etc/sudoers einräumen müssen (man sudoers).

Für die Einwahl via DSL geben Sie einfach entsprechend Ihr PPPoE-Device an:

1 "information" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ppp0"}
2 "hangup" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ppp0 down"}
3 "dialing" {play "|sudo /usr/share/isdn/vbox/bin/ifstatus-ppp0 down"}

Vergessen Sie nicht, ggf. die Pfade zu Ihren ADSL-Skripten in get-ifstatus anzupassen.

Seit neustem kann im Einwahlmodus auch über die Taste 4 ein DynDNS-Eintrag gesetzt werden. Alles, was Sie dazu brauchen, ist ein Account bei einem entsprechenden Anbieter und einen korrekt konfigurierten Client.

Als Standard habe ich mal den ddclient gewählt.

9.2.6. Das Skript buffer

Dieses Skript puffert auf der Kommandozeile angegebene Werte in einer temporären Datei. Eine genaue Beschreibung über Sinn und Zweck dieses Skripts finden Sie unter Problembehebung und Tipps.

9.3. Änderungen in /var/spool/vbox/mjw/raccess

Im Grunde hat sich gegenüber dem Original nur die Tastenbelegung geändert, da ich die aktuelle Einteilung sinnvoller finde. Am Ende dieser Anleitung finden Sie eine Übersicht über die betreffende Tastenbelegung.

Davon abgesehen sind die entsprechenden Konfigurationsskripte entsprechend den bereits oben genannten Erweiterungen modifiziert worden.

Ausserdem wurde in remoteaccess die Möglichkeit zum Löschen der aktuellen Nachricht eingebaut.

Neu dagegen ist die Datei recall, die ich ausführlicher am Ende dieser Anleitung unter Problembehebung und Tipps erläutere.

9.4. Änderungen in /var/spool/vbox/mjw/buffer.d

Dieses neu hinzu gekommene Verzeichnis gehört zum Skript buffer aus /usr/share/isdn/vbox/bin. Details dazu unter Problembehebung und Tipps.

9.5. Änderungen in /var/spool/vbox/mjw/msg

Hier habe ich alle Messagefiles, also alle die Dateien, die in meiner Konfiguration über den play "@..." Befehl abgespielt werden, abgelegt. Dazu auch die Textquellen, aus denen man sich die entsprechenden Sprachdateien mithilfe von mkulawmsg selbst erzeugen kann.

Ausserdem hört sich mein Piepton (beep.ulaw) viel schöner an! :)


10. Deutsche Sprache

Nun zur Einrichtung der deutschen Sprachausgabe, dem wichtigsten Teil der Dokumentation.

10.1. Voraussetzungen

vbox3 und raccess4vbox3 müssen installiert sein und fehlerfrei laufen. Ebenso gehe ich davon aus, dass auch mbrola und txt2pho fehlerfrei installiert wurden.

Bedauerlicherweise gestattet die mbrola-Lizenz nur dann die kostenlose Nutzung, wenn der Einsatzzweck nicht kommerzieller Natur. Daher scheidet diese Variante für Firmen leider aus.

Wenn Ihnen eine andere Sprachsynthesesoftware für Linux bekannt ist, mit der man deutsche Sprache erzeugen kann und die diese Beschränkungen nicht, teilen Sie mir dies bitte mit.

10.2. Die zwei Wege

Grundsätzlich gibt es zwei Möglichkeiten, vbox3 zur Sprachausgabe zu bewegen.

10.2.1. Sampling

Die eine, einfache Variante ist der sogenannte say_cache. Hierbei findet eigentlich gar keine Sprachsynthese statt. vbox3 spielt einfach Audiodateien, die es in seinem Sprachcache findet, ab. Was auch immer vbox3 sagen soll, es muss vorher eine entsprechende Audiodatei angelegt werden.

Damit man für alle theoretisch denkbaren Sätze und Kombinationen (man denke nur an die theoretisch vier Milliarden IP Adressen, die vbox3 alle einzeln ausgeben können müsste), verfährt man ähnlich, wie Sie es zum Beispiel von der Zeitansage her kennen: Man zerlegt die Sätze in passende Teilstücke, sogenannte Samples, und packt nur diese in den Cache. Dann kann man aus diesen Samples jeden beliebigen Satz zusammenbauen, in dem man sie einfach passend aneinander reiht. Üblicherweise splittet man die Samples in Worte auf. Um vbox3 zu sagen, dass es einen Satz in solche Samples zerlegen soll, dient das bereits in der Konfigurationsdatei raccess.conf erwähnte Sonderzeichen say_breath, welches standardmässig ein kaufmännisches Und ("&") ist, theoretisch aber jedes beliebige andere Zeichen sein kann.

Beispiel - Der folgende Befehl:

1 "sample" {play "This is a test"}

würde von vbox3 als ein einziges Sample interpretiert werden. Es würde versuchen, die Datei mit dem Namen This is a test in seinem Sprachcache zu finden und abzuspielen. Existiert die Datei nicht, gibt es einen Fehler.

Anmerkung: Der Name der Datei entpricht immer dem zu sprechenden Text, wird dabei aber nach say_maxfilelen Zeichen abgeschnitten, siehe entsprechende Erläuterung zu raccess.conf. Ich lasse dies hier aber mal ausser Acht.

Hingegen würde der folgende Befehl:

1 "sample" {play "This & is & a & test"}

den Satz in die Teilstücke "This", "is", "a" und "test" zerlegen, die der Reihe als Datei mit gleichem Namen gesucht und abgespielt werden.

Beachten Sie, dass alle gängigen Linux-Dateisysteme zwischen Gross- und Kleinschreibung unterscheiden, so dass die Sprachsampledatei This nicht gefunden wird, wenn Sie anderswo nur eine this haben. Damit Sie nicht je nach Wortstellung die gleichen Wörter zweimal als Sample anlegen müssen, empfiehlt es sich daher, grundsätzlich die Kleinschreibung zu verwenden. Beim Sprechen hört man die Grösse des Anfangsbuchstaben ja sowieso nicht.

Aber auch hier muss jedes einzelne Wort bereits als Datei vorliegen. Wie erreicht man dies?

Am einfachsten ist es, Sie schnappen sich ihr Mikrofon und zeichnen der Reihe nach alle Sprachsamples mit Ihrer eigenen Stimme auf. Etwas umständlich zwar, dafür haben Sie aber dann aber auch Ihre eigene Stimme und können vor allem deutlich und mit Betonung sprechen, was bei Sprachsynthese via Rechner ja nicht immer so gut möglich ist.

Die andere Alternative ist es, eine installierte Sprachsynthese-Software zu benutzen, um die Sprachsamples zu generieren. Dies geschieht in der Regel nur einmal.

Um die Sache etwas zu erleichtern, findet man im Quellcode von raccess4vbox3 bereits ein Unterzeichnis namens ulaw, wo schon entscheidende Vorarbeit geleistet wurde. Beispielsweise eine Makefile zum einfachen generieren der Sprache via "make". Allerdings basiert diese Lösung auf rsynth und wir wollen ja mbrola nehmen, weil dort die Sprachqualtität deutlich besser ist.

Daher habe ich in meinem Eweiterungspaket unterhalb von /usr/share/isdn/vbox/ulaw-generator eine leicht abgewandelte Version des originalen ulaw hinterlegt, wo alles für mbrola vorbereitet wurde. Zudem enthält das Original natürlich nicht jene Sprachsamples, die von meinen anderen Erweiterungen (wie beispielsweise dem Skript get-sensors) verwendet werden.

In diesem Verzeichnis befinden sich verschiedene Dateien der Form files.*. Diese enthalten, thematisch gruppiert, die Einträge für die Samples. Also files.months z.B. alle Monatsnamen.

Das Format der Dateien ist einfach: [datei] [text]. Zuerst steht also der Name der Sampledatei, dann kommt der Text, der synthetisiert und in der Datei als Audiodaten gespeichert werden soll.

Bei meinem Erweiterungspaket habe ich es so gehalten, dass ich die Dateinamen im englischen belassen und nur den Text ins deutsche übersetzt habe. Der Grund hierfür ist einfach: Innerhalb von raccess4vbox3 sind alle Text auf englisch. Wenn ich deutsche Sprache will und die Dateinamen auch auf deutsch wähle, dann muss ich in allen Konfigurationsdatei überall auch die englischen Texte durch deutsche ersetzen. Lasse ich dagegen alles auf englisch, brauche ich nur die Sprache zu übersetzen. Beispielsweise kriegt vbox die Anweisung, doch "Hello & World" zu sagen. Es sucht im Cache nach den Dateien "Hello" und "World" und spielt diese ab. Dass darin nun in Wirklichlichkeit ein deutsches "Hallo Welt" steckt, merkt es dabei gar nicht. So hat man viel weniger Arbeit beim Übersetzen und kommt zum gleichen Ergebnis!

Ich habe die files.* Dateien so verändert, dass alle zusätzlichen Samples, die mein Sprachpaket benötigt, darin enthalten sind.

Die Samples werden dann mit einem einfachen:

bash# make

Der wesentliche Teil ist hier ist Skript t2s, welches für jeden Eintrag in den files.* aufgerufen wird. Dieses Skript muss (auf welche Weise auch immer) den Text in Audiodaten wandeln und in der Datei speichern.

In dem originalen t2s Skript wird dazu rsynth verwendet, bei meinem Erweiterungspaket eben das Skript mkulawmsg, welches sich wiederum mbrola bedient.

Wenn Sie auf diese Weise den Cache mit allen Samples, die vbox beherrschen muss, gefüllt haben, können Sie ihn einfach nach /usr/share/isdn/vbox/ulaw kopieren und fertig. vbox wird nie versuchen, Sprache selber zu synthetisieren, weil es eben alles schon in seinem Cache hat. Sicherheitshalber können Sie mit dem Eintrag

say 0

in der raccess.conf dies auch erzwingen.

10.2.2. Synthese on-the-fly

Die andere, etwas kompliziertere Variante ist, auf den Cache ganz oder teilweise zu verzichten und die Sprache direkt on-the-fly, also während der vbox-Sitzung zu synthetisieren.

Dies erfordert natürlich, dass der verwendete Rechner über hinreichend Rechenkapazität verfügt, um immer einen konstanten Datenstrom liefern zu können. Kommt zu einem Buffer-Underrun, hängt vbox sich i.d.R. auf!

Ansonsten ist nicht viel dazu zu beachten, wenn man bereits ein funktionierendes Sprachsynthesesystem aufgesetzt hat. Man benötigt ein Programm, welches normalen Text von der Standardeingabe einliest und die dazu passende Sprache auf der Standardausgabe als µlaw-komprimierten Audiostrom ausgibt.

Bei mir ist dies wie gesagt mit mkulawmsg möglich. Tragen Sie es einfach in der raccess.conf als say_path ein und aktivieren Sie die Synthese mit "say 1".

Danach müssten Sie alles, was Sie in den verschiedenen Skriptdateien mithilfe des play Befehls ausgeben, direkt und ohne Cache synthetisieren können.

Mit "say_cache 0" können Sie veranlassen, das vbox keinen Cache anlegt und auch beim nächsten Mal wieder alles on-the-fly synthetisieren soll.


11. Problembehebung und Tipps

11.1. Plötzliches Beenden der Verbindung beim Abspielen von Audio

Es gibt verschiedene Berichte, dass bei Synthese on-the-fly gelegentlich Probleme mit vboxgetty auftraten, es sich beispielsweise einfach aufgehängt hat und neu gestartet werden musste.

Ich habe dies jedoch unabhängig von der Synthese auch beim normalen Sample-Verfahren erlebt und zwar bedeutend öfter, seit ich vbox nicht mehr auf meinem schnellen Desktop-PC, sondern statt dessen auf meinem alten Router-PC (Pentium, 90 MHz) einsetze.

In den Logs äussert sich das so:

12-Feb 12:50:17 <D> raccess: play: filename is: sysinfo-help.ulaw
12-Feb 12:50:17 <D> Playing "sysinfo-help.ulaw"...
12-Feb 12:50:18 <D> Play: incoming 8060; outgoing 8060...
12-Feb 12:50:18 <D> Play: incoming 2563; outgoing 2562...
12-Feb 12:50:18 <D> *** Remote hangup ***
12-Feb 12:50:18 <D> Reading modem answer (4s timeout)...
12-Feb 12:50:22 <D> *** Timeout [14] ***
12-Feb 12:50:22 <W> Can't read from modem [0] (timeout).
12-Feb 12:50:22 <D> Flushing modem (with timeout)...
12-Feb 12:50:22 <D> raccess: run: default: HANGUP
12-Feb 12:50:22 <D> raccess: run: leaving with return HANGUP

Wobei die Einträge nicht immer absolut gleich sind. Häufig beschwert sich das vboxgetty auch über Müll (Junk), der angeblich über die Leitung rauscht.

Meist handelt es sich dabei um ein unerwartet auftretendes: <DLE>3<DLE><DC4> NO CARRIER <CR><NL>.

Ohne einen konkreten Anhaltspunkt zu haben, verdächtige ich die im Kernel implementierte Modem-Emulation für ISDN-Devices.

Es fällt mir zum einen auf, dass dieser Fehler vermehrt auftritt, seit der verwendete Rechner deutlich leistungsschwächer geworden ist und zum anderen, dass es manchmal auch passiert, dass die Audiowiedergabe nur kurz ins Stocken kommt, sich danach aber wieder fängt.

Vielleicht liegt es daran, dass der Audiostrom abreisst und es zu einem "Buffer-Underrun" kommt.

Das ist alles nur Vermutung, aber ich habe jetzt gerade auf meinem Router einen neuen Kernel (2.4.17) mit allen Patches aus dem ISDN-CVS und auch dem Preemptible-Kernel-Patch installiert und die Samples neu generiert. Bis jetzt ist der Fehler nicht mehr aufgetreten.

Update: Daniel Geske <daniel.geske@yoc.de> hat mir berichtet, es läge an der Lautstärke der Sprachsamples. Sind diese zu laut, hängt sich vboxgetty auf.

11.2. [raccess] Selbstmodifizierende Konfiguration

Eventuell ist es gewünscht, dass raccess4vbox3 eine selbstmodifizierende Konfiguration verwendet, also das sich der Inhalt der Konfigurationsdateien während einer Sitzung verändern kann. Eine solche dynamische Konfiguration schlägt zunächst einmal fehl, da raccess4vbox3 die Konfiguration nur einmal zu Beginn ausliest und sie danach im Cache hält. Werden die Dateien dann verändert, merkt raccess dies nicht.

Daniel Geske <daniel.geske@yoc.de> hat hier herausgefunden, dass man in der Datei raccess4vbox3.tcl die Zeilen 63-68 auskommentieren muss, um dieses Verhalten abzustellen:

# if { [ info exists ${prefix}run ] && \
# [ string length $prefix ] > 0 } {
# raccess_log D "readrc: file $tuning(rcfilename) allready read, skipping"
# return
# }
#

Die Kehrseite der Medaille ist natürlich, das die Dateien nun jedesmal neu eingelesen werden, das Ganze also die Performance drückt.

11.3. [Sysinfo] Wechselnde Geräte für Interneteinwahl

Manchmal kommt es vor, dass man für die Einwahl ins Internet unterschiedliche Devices verwendet, beispielsweise weil man verschiedene Provider auf verschiedene ipppX-Devices konfiguriert hat. Oder weil man sich normalerweise per DSL einwählt, aber für den Notfall auch noch einen ISDN-Zugang eingerichtet hat.

Hier kann es unter Umständen ziemlich aufwendig sein, in der IP-Adressabfrage in raccess/sysinfo-Datei jedes einzelne Device manuell einzutragen.

Statt dessen empfehle ich folgendes Vorgehen: Legen Sie auf eine Taste den Befehl

{play "|/usr/share/isdn/vbox/bin/ip-devfromfile /var/lock/ip-dev.lck"}
und erzeugen Sie einen Symlink von get-ip:
bash# cd usr/share/isdn/vbox/bin
bash# ln -s get-ip ip-devfromfile

Nun wird get-ip den Namen des Gerät, welches zur Interneteinwahl verwendet wurde, aus der Datei /var/lock/ip-dev.lck auslesen. Der Name ist natürlich frei konfigurierbar.

Damit das ganze dann funktioniert, müssen noch dafür sorgen, dass die besagte Datei auch immer das aktuelle Netzwerkdevice enthält, beispielsweise, indem Sie die /etc/ppp/ip-up Datei an geeigneter Stelle modifizieren. Die Datei wird bei jeder erfolgreichen Einwahl aufgerufen und erhält unter anderem den Namen des Interfaces als Parameter über die Kommandozeile zugeschoben.

In meiner alten /etc/ppp/ip-up.local (noch unter SuSE) sah es z.B. so aus:

[...]
# Write current datetime to timelog for charge info
echo -n "$(date +"%d.%m.%Y %H:%M:%S") - " >> $TIMELOG

# Tell the chronysync script that internet is up, so it can now access ntp
# servers around the world
/usr/local/sbin/chronysync up > /dev/null 2>&1

# Write name of device currently in use to lock file. The file itself is
# already required for MasqDialer, so we can as well use it for
# raccess4vbox3.
echo $1 > /var/lock/ip-link-up.lck
[...]

Hinweis: Bei SuSE sollten Sie statt dessen die Datei ip-up.local verwenden, während Debian ein eigenes kleines Skriptfile unter /etc/ppp/ip-up.d erwartet.

Alternativ können Sie auch den den Symlink ip-ipfromfile verwenden, welcher gar kein Interface benötigt und direkt die IP-Adresse aus der Datei ausliest.

11.4. Freie Eingabe beliebiger DTMF-Sequenzen

Manchmal möchte man eine beliebige, längere DTMF-Sequenz eingeben. Beispielsweise möchte man den Anrufer in die Lage versetzen, seine Kundennummer einzugeben. Oder er soll seine Telefonnummer für einen Rückruf hinterlassen.

Natürlich könnte er beides auch als Sprachaufzeichnung hinterlassen, wie man es von einem gewöhnlichen Anrufbeantworter her kennt. Aber das hat unter Umständen den Nachteil, dass man diese Daten nicht maschinell weiterverarbeiten kann. Es muss immer ein "richtiger Mensch" die Aufzeichnungen abhören und bearbeiten. Würde die Rückrufnummer aber beispielsweise als einfacher Text in einer Datei stehen, könnte ein automatisch ablaufendes Skript anhand der Vorwahl selbständig den zuständigen Sachbearbeiter ermitteln. Und anhand der Kundennummer könnte bereits der komplette Datensatz des Kunden aus einer Datenbank extrahiert und für den Rückruf vorbereitet werden. Dann weiß der PC-Händler z.B., dass Herr Peter Mustermann in Berlin wohnt und ein Sony Notebook besitzt, mit dem es schon mehrfach Probleme gab, bevor er überhaupt dessen Stimme hört!

Genug von den Vorteilen geschwärmt, wie geht's denn nun?

Für das alte vbox2 gab es einen speziellen Patch, der dies direkt ermöglichte, aber für vbox3 ist mir da nichts bekannt. Aber wir können uns da selber was improvisieren:

Im Grunde ganz einfach. Man definiert für jede Ziffer auf der Tastatur einen Eintrag in der [dtmf]-Sektion einer raccess-Konfigurationsdatei. Und als auszuführenden Befehl hängt man die betreffende Ziffer hinten an eine Datei an.

Dann kann man z.B. noch die *-Taste zu einer Art "Enter"-Taste umfunktionieren, die diese temporäre Datei ausliest, den Inhalt weiterverarbeitet und die Datei dann für den nächsten Anrufer wieder löscht.

In meinem Erweiterungspaket habe ich so etwas an dem Beispiel "Hinterlassen der Rückrufnummer" einmal implementiert. Es gibt eine Konfigurationsdatei namens /var/spool/vbox/mjw/raccess/recall. Diese ruft für jede Ziffer von 0-9 das Skript buffer auf, welches diese Ziffer dann zwischenspeichert. Drückt der Anrufer die #-Taste, wird alles wieder gelöscht und er kann von vorne anfangen, falls er sich vertippt hat. Die *-Taste schliesst die Eingabe ab.

Die Weiterverarbeitung nach abgeschlossener Eingabe habe ich mir bei Debian abgeguckt: Es gibt ein Verzeichnis namens /var/spool/vbox/mjw/buffer.d. Wenn buffer die Eingabe verarbeitet, führt es jede Datei in diesem Verzeichnis aus und übergibt ihr die eingegebene Rufnummer als Parameter. Die beiliegenden Dateien demonstrieren dies, in dem sie auf entfernten Unix- oder für Windowsrechner ein Fenster öffnen und eine zusätzliche Informationsmail verschicken.

Damit man das selbe Skript innerhalb einer vbox-Konfigurations mehrfach verwenden kann, besteht ferner die Möglichkeit, dem buffer-Skript hinter der gedrückten Ziffer noch eine ID mitzugeben, die dieses dann auch an die Programme in buffer.d durchreicht. Die Standard-ID ist "0".

11.5. Weiterverbinden, Vermitteln, Makeln mit vbox3

Eine der Fragen, die mir am häufigsten gestellt wird, ist, wie man einen einmal von vbox angenommenen Anruf nachträglich auf einen anderen Anschluss umlegen kann. Wenn dies nämlich möglich wäre, könnte man mit vbox3 ein komplettes Call-Center aufbauen.

Leider geht es nicht, jedenfalls nicht so einfach. Eine standartisierte Methode für I4L scheint es meines Wissens nicht zu geben.

Wer eine ISDN-Karte besitzt, für es eine CAPI für Linux gibt, kann sich freuen und sein Glück mit caiviar versuchen. Besitzer einer AVM Fritz-Karte freuen sich da aber vielleicht nicht sehr lange, z.B. wenn sie ein SMP-System haben.

Ich habe mir aber sagen lassen, dass manche TK-Anlagen einem Anschluss das dort liegende Gespräch quasi "entziehen" können, z.B. für Anrufbeantworter. Da könnte Rechner mit vboxputty anrufen und dem Benutzer sagen, dass ein Gespräch auf ihn wartet. Dieser muss es sich dann manuell herbei holen. :-/

Ansonsten kann man nur rumprobieren, z.B. mal das Aufschalten auf das Gespräch versuchen und schauen, was passiert, wenn vboxgetty dann auflegt. Bei meiner Alcatel kann man Anlagenfunktionen wie beispielsweise "Halten" oder "Verbinden" auf Nachwahlkennziffern legen, z.B. "*#55". Vielleicht kann man diese DTMF-Sequenzen als Klang aufzeichnen und via »play« über die Leitung zurückschicken. Kann natürlich sein, dass der Anrufer dann nur ein "düdidud" hört und nix passiert. Dann muss man evtl. erst ein ETX oder sowas schicken. Manche Anlage kann man mit AT-Befehlen steuern, vielleicht lässt sich da was machen.

Sollte jemand ein Möglichkeit kennen oder eines der hier genannten Experimente erfolgreich duchgeführt haben, wäre ich sehr dankbar, wenn er mich an seinen Erkenntnissen teilhaben lassen würde.

11.6. vbox-Rufannahme schnell und einfach aus- und wieder anstellen

Wenn Sie vbox ständig einsetzen, kommen Sie unter Umständen in die Verlegenheit, den Anrufbeantworter auch gerne mal ausschalten zu wollen, weil sie ja jetzt gerade zu Hause sind.

Am einfachsten geschieht dies durch das Anlegen einer Datei namens vboxctrl-answer im Spoolverzeichnis des betreffenden vbox-Users. Ist diese Datei vorhanden, dann liest vboxgetty aus ihr die Zahl der Rings (also Rufzeichen), die es wartet, bevor es den Anruf annimt. Die Einträge in der vboxrc werden dabei ignoriert.

So können z.B. mit:

bash$ echo 99 > /var/spool/vbox/user/vboxctrl-answer

die Rufannahme quasi abschalten (99 Klingelzeichen) und sie mit

bash$ rm /var/spool/vbox/user/vboxctrl-answer

wieder aktivieren.

Den entsprechenden Shellbefehl können Sie notfalls sogar mit einem Flipflop-Icon versehen auf Ihrem Desktop ablegen. Ein entsprechendes Skript werde ich evtl. auch bald zur Verfügung stellen.

Falls vbox nicht auf Ihrem Desktop-PC läuft, sondern auf einem entfernten Rechner, können Sie die SecureShell (ssh) verwenden, um den Befehl remote auszuführen. Wenn Sie dabei RSA-Authentifizierung wählen (man ssh), brauchen Sie noch nicht mal ständig ihr Passwort einzugeben.

Ein entsprechendes Skript, dass vbox auf diese Weise fernsteuern kann, liegt hier zum Download bereit.

11.7. CallerID, angerufene Nummer o.ä. innerhalb des play-Befehls

Machnmal wäre es überaus praktisch, man könnte innerhalb der Konfigurationsdateien auf gewisse Variablen von vbox3 zugreifen, beispielsweise die Caller-ID des Anrufers oder die Nummer, die dieser angerufen hat.

Ein einfaches Anwendungsbeispiel wäre folgender Eintrag in der Datei answeringmachine:

play "|/pfad/zu/speak-callerid $vbxv_callerid"

Und dann ein kleines Shellskript, welches die übergebene Rufnummer passend formatiert wieder ausgibt, so dass der Anrufer hört: "Sie rufen von dem Abschluss mit der Nummer 4-7-1-1 an."

Prinzipiell steht diese Variable $vbxv_callerid zur Verfügung, aber sie wird von raccess4vbox3 nicht exportiert, also sozusagen nicht für die Allgemeinheit freigegeben.

Mithilfe dieses Patches, den Sie gegen raccess4vbox3.tcl (Version 0.2.7) anbringen können, lässt sich dass ändern.

Sie können damit innerhalb des play-Befehls folgende Variablen verwenden:

$vbxv_callerid
Die Rufnummer des Anrufers, sofern übertragen
$vbxv_callername
Der dieser Nummer zugeordnete Name des Anrufers aus der vboxrc
$vbxv_localphone
Die lokal angerufene MSN
$vbxv_savevbox
Der Name der vbox-Infodatei über die aufgezeichnete Nachricht, die vboxgetty angelegt hat

11.8. Zeit- oder Anruferabhängige Ansagen

Wer seine Ansagen zeitabhängig auswählen will, kann entweder den Mechanismus der vboxrc dafür verwenden oder aber - was flexibler ist - ein Shellskript zu Hilfe nehmen. Denn damit kann man die Ansagen auch in Abhängigkeit vom jeweiligen Anrufer auswählen.

Betrachten wir zunächst folgende Konfigurationsvorlage für raccess/answeringmachine:

[run]
play "|/pfad/zu/select-message.sh $vbxv_callerid"
play @message.ulaw
...

Die Funktionsweise dürfte nach der Lektüre dieser Anleitung niemandem mehr ein Rätsel sein. Es wird einfach das Skript select-message.sh mit dem Parameter $vbxv_callerid aufgerufen und zwar bevor die eigentliche Ansage abgespielt wird.

Der Trick ist, dass die danach abgespielte Ansage message.ulaw gar keine "richtige" Datei sondern, sondern ein Symlink - ein Verweis auf eine andere Datei. Innerhalb des Skriptes select-message.sh kann man dann die Ansage beliebig auswählen und diesen Symlink passend setzen. Beispielsweise so:

#!/bin/sh
SPOOLDIR=/pfad/zu/spooldir
case "$1" in
  456789)
    MESSAGE_FILE=ansage_klaus.ulaw
  ;;
  987654)
    MESSSAGE_FILE=ansage_petra.ulaw
  ;;
  *)
    MESSAGE_FILE=ansage_sonstige.ulaw
  ;;
esac
rm $SPOOLDIR/msg/message.ulaw
ln -s $SPOOLDIR/msg/$MESSAGE_FILE $SPOOLDIR/msg/message.ulaw

# irgendwas für den play-Befehl ausgeben:
echo "%1"

Ebenso kann man die Uhrzeit als Kriterium hernehmen. Für eine einfache, stundengenaue Auflösung genügt z.B. folgender Code-Schnipsel:

HOUR=`date "+%H"`
if test $HOUR -ge 8 -a $HOUR -le 16; then
  MESSAGE_FILE=ansage_arbeit.ulaw
else
  MESSAGE_FILE=ansage_zuhause.ulaw
fi

Damit wird die Ansage zwischen 8 und 16 Uhr auf "Arbeit" umgestellt.

Die Grenzen dieser Methode liegen lediglich in den eigenen Fähigkeiten, Shellskripte zu schreiben. Folgende Erweiterung z.B.:

HOUR=`date "+%H"`
DOW=`date "+%w"`
if test $HOUR -ge 8 -a $HOUR -le 16 -a $DOW -ge 1 -a $DOW -le 5; then
  MESSAGE_FILE=ansage_arbeit.ulaw
else
  MESSAGE_FILE=ansage_zuhause.ulaw
fi

...würde die Ansage nur an Werktagen (Montag bis Freitag) wechseln, am Wochenende aber unverändert lassen. Mit den Konfigurationsmöglichkeiten der vboxrc ist so etwas schon nicht mehr realisierbar.

Wer sich näher damit befassen will, dem seien die Manpages zu seiner Lieblingsshell, zu date(1) und zu test(1) ans Herz gelegt.

Hinweis: Damit das Übergeben der Rufnummer als Parameter an das Shellskript funktioniert, muss zuvor der Patch angebracht werden, der eine Sektion höher verlinkt ist.

11.9. Seltsame Fehler beim Parsen der vboxrc

Es wurde mir mehrfach zugetragen, dass vboxgetty beim Parsen der vboxrc seltsame Fehlermeldungen produziert. Diese sehen dann in etwa so aus:

14-Oct 23:00:53 Seeking to section "[CALLERID]"...
14-Oct 23:00:53 Searching callerid "61"...
14-Oct 23:00:53 Found - name is "61".
14-Oct 23:00:53 Seeking to section "[61]"...
14-Oct 23:00:53 Can't seek to section "[61]".
14-Oct 23:00:53 Incoming call will be ignored (user setup)!
14-Oct 23:00:53 Reading modem answer (6s timeout)...

Das Problem ist also, dass vboxgetty nicht nach dem Namen der betreffenden Sektion sucht, sondern nach der Nummer. Und eine Sektion mit dem Namen "61" gibt es eben nicht.

Jens Hoffmann hat in <bi25n6$elf$00$1@news.t-online.com> einen Workaround dafür gepostet. Dazu muss man in der vboxrc.c jedes Vorkommen von:

if ((*dummy) && (dummy)) phone = strsep((char **)&dummy, " \t");

ersetzen durch:

if ((*dummy) && (dummy)) phone = strsep((char **)&dummy, "\t");

und muss vbox3 neu kompilieren. Danach darf dann in der vboxrc nur noch Tabstopps zum Trennen der Fehler verwenden und keine Leerzeichen. Aber das Problem müsste dadurch behoben sein.

Leider lässt es sich nicht reproduzieren, weder bei Gerrit noch bei mir. Sollten Sie daher ebenfalls dieses Problem haben, lassen es mich bitte per E-Mail wissen und schreiben Sie Ihre Distribution und ihre libc-Version dazu. Ich vermute nämlich, dass es an einer fehlerhaften strsep-Implementierung einiger libc-Versionen liegt.

11.10. DTMF-Tastendefinitionen meines Erweiterungspakets

Wenn Sie vbox3 und raccess4vbox3 mit der Konfiguration meines Erweiterungspakets ohne Änderungen übernehmen, dann gelten folgende Tastendefinitionen:

Fernabfragemodus (remoteaccess)

1

Erste Nachricht

2

(nicht belegt)

3

Letzte Nachricht

4

Vorherige Nachricht

5

Wiederholen

6

Nächste Nachricht

7

Lösche Nachricht

8

Überspringe Nachricht

9

Hilfsansage

*

Fernabfrage beenden

0

(nicht belegt)

#

(nicht belegt)

Systeminformationsmodus (sysinfo)

1

Aktuelle Uptime

2

IP-Adresse eth0

3

IP-Adresse eth0

4

Internet IP-Adresse

5

CPU-Temperatur

6

CPU Lüfterdrehzahl

7

CPU Kernspannung (Vcore)

8

(nicht belegt)

9

Hilfsansage

*

Systeminformation beenden

0

(nicht belegt)

#

(nicht belegt)

Einwahlmodus (dialup)

1

Statusinformation

2

Trennen

3

Verbinden

4

DynDNS Eintrag setzen

5

(nicht belegt)

6

(nicht belegt)

7

(nicht belegt)

8

(nicht belegt)

9

Hilfsansage

*

Einwahlmodus beenden

0

(nicht belegt)

#

(nicht belegt)

[05.05.2008] Neuer PGP-Schlüssel
Ich habe einen neuen PGP/GPG-Schlüssel erzeugt. Der alte ist nach wie vor gültig und kann auch noch benutzt werden.

[02.04.2008] Umzug
Die Domain malte-wetz.de wird jetzt bei einem anderen Anbieter gehostet. Es sollte keine Probleme mehr mit der Umleitung geben und Werbepopups oder -frames gehören der Vergangenheit an.

[02.04.2008] Gästebuch offline
Das Gästebuch bleibt erst einmal offline. Es wurde dort zu viel Werbemüll hinein geschrieben. Sorry.

[09.01.2006] Diverses
Kleinere Korrekturen und Ergänzungen an den Texten, IP-Filter im Gästebuch stark erweitert (Lateinamerika, Spanien, Asien, Italien).

[28.07.2005] vbox3-Anleitung
Kleinere Ergänzungen/Korrekturen im Abschnitt 4.1.1

[23.04.2005] gDesklets aktualisiert
Da meine gDesklets offenbar von gdesklets.gnomedesktop.org gelöscht wurden, habe ich die aktuellsten Fassungen hier abgelegt.

[25.01.2005] Kleinere Reparaturen
Links auf BSI-Seite und OE-FAQ angepasst und Gästebuch repariert.