Letzte Änderung dieses Dokuments: 06.04.2008, 11:35:52. vbox3 mit deutscher Spachausgabe
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
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.
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.
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.
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 ...
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.
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
So, das war die Installation von vbox3 und raccess4vbox3. Im nächsten
Abschnitt befassen wir uns mit der Konfiguration von beiden.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
***"
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.
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
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.
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.
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.
In dieser Sektion geben Sie an, welche Aktionen beim Entgegennehmen eines
Anrufes erfolgen sollen. In diesem Fall der Start des Skriptes
answeringmachine.
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.
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.
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!
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.
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.
Marc Sülzle <
msuelzle@users.sourceforge.net> hat ein Web-Frontend für vbox3 in Perl
realisiert.
Das Projekt befindet sich hier:
hier.
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.
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.
; 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]
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.
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.
; 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"
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.
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.
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.
[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}
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.
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.
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.
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.
In diesem Verzeichnis befinden sich normalerweile alle externen Skripte, die
von vbox3 aufgerufen werden.
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.
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.
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.
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"}
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.
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.
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.
Dieses neu hinzu gekommene Verzeichnis gehört zum Skript buffer aus
/usr/share/isdn/vbox/bin. Details dazu unter
Problembehebung und Tipps.
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! :)
Nun zur Einrichtung der deutschen Sprachausgabe, dem wichtigsten Teil der
Dokumentation.
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.
Grundsätzlich gibt es zwei Möglichkeiten, vbox3 zur Sprachausgabe zu
bewegen.
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.
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.
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.
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.
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.
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".
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.
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.
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
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.
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.
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)
|
|