Linux
Ein Anrufbeantworter


Man kann schon feine Sachen machen mit seinem Linuxmaschinchen! Wer hätt's gedacht - inzwischen kann man relativ einfach sogar einen Anrufbeantworter selbst basteln. Die Grundlage zu dieser Anleitung bildet eine email, die mir dankenswerterweise Matthias Heßler geschickt hat - vielen Dank für die Erlaubnis, das übernehmen zu dürfen!

Ein paar Voraussetzungen gibt es allerdings:

Nun besorgt man sich die vbox-Software von Michael `Ghandi' Herold, die nicht Bestandteil des ISDN4Linux-Pakets ist. Man muß sie sich herunterladen:
  ftp.franken.de/pub/isdn4linux/contributions/vbox-1.1.tgz
Man setzt sich das ins Verzeichnis /usr/src und entpackt sie per "tar zxfv vbox-1.1.tgz". Im Verzeichnis
  /usr/src/vbox
sind jetzt die benötigten Dateien. Die darin enthaltene Dokumentation (auf Deutsch, mit einem WWW-Browser anschaubar!) ist empfehlenswert! Nach der Compilation ist auch ein TeX-Dokument lesbar.

Compilation

Vor der Übersetzung von vbox muß man sich das Makefile vornehmen und die Installationspfade anpassen (in der Regel sind keine Änderungen notwendig).

Ebenfalls angepaßt werden muß die Datei src/settings.h:

src/settings.h (Ausschnitt)
  ...
  #define DEFAULT_RINGS 24           /* hebt ca. nach dem 4. Klingeln ab */
  ...
  #define DEFAULT_RECORD_TIME 120    /* maximal 2 min Aufnahme zulassen */
  ...
  #define VOICE_COMPRESSION_MODE 6   /* <--- Hier MUSS "6" stehen!!! */
  ...
  #define VBOXPLAYCMD "/usr/local/sbin/vboxplay"
  ...
Zum VOICE_COMPRESSION_MODE: 2, 3 und 4 (ADPCM-2, ADPCM-3 und ADPCM-4) sind komprimierte Modi, zum Abspielen werden die pvftools von mgetty-0.99 benötigt. 5 entspricht einer Aufzeichnung im aLAW-Format, 6 einer im uLAW-Format. Trotz gegenteiliger Angabe in der Anleitung kann man "aLAW"-Dateien nicht mit den mitgelieferten Tools (rmd*) abspielen - nur uLAW kann verarbeitet werden!

Sollte man ein anderes Format angegeben haben, kann man sich über einen kleinen Trick die Nachrichten trotzdem abspielen: vboxgetty kennt nämlich alle Formate. Man kopiere die abzuspielende Datei um in das message-Verzeichnis (siehe unten) unter dem Namen standard.msg. Die wird dann als Ansage abgespielt, wenn man sich selbst anruft (vielleicht nicht ganz billig, aber ein schneller Weg... :-)

Die pvftools sind im Paket mgetty von Gert Doering enthalten. Siehe dazu die Fax-Seiten in dieser Anleitungssammlung.

In meinem Falle mußte auch noch ein kleiner Patch angewendet werden, damit die Darstellung unter X brauchbar wurde (ohne Patch waren im vbox-Terminal nur wirre Zeichen zu sehen). Für den Hinweis, wo der Patch zu setzen ist, danke ich Roland Rosenfeld <roland@spinnaker.rhein.de>.
/usr/src/vbox/vbox.c.patch
--- vbox.c      Sat Sep 28 11:57:58 1996
+++ vbox.c.orig Sat Sep 28 11:57:46 1996
@@ -1953,9 +1953,9 @@
 
 static chtype Color(int Pair)
 {
-       if (!Mono) return(COLOR_PAIR(Pair) | A_ALTCHARSET);
+       if (!Mono) return(COLOR_PAIR(Pair));
 
-       return(COLOR_PAIR(0) | A_ALTCHARSET);
+       return(COLOR_PAIR(0));
 }
 
 /*************************************************************************
Diesen Patch fügt man ein mit
  root:# patch -p0 src/vbox.c <vbox.c.patch
  root:# _
Nun kann es ans Compilieren gehen. Man lasse sich zeigen, was getan werden muß:
  root:# make
  (eine lange Liste erscheint)
  root:# _
Im Ganzen ist das folgende zu tun:
  root:# make vbox
  ...
  root:# make vbox-install
  ...
  root:# make vbox-spooldir
  ...
  root:# _
Sind die Programme nun installiert, geht es daran, das Spool-Verzeichnis aufzubereiten. Es ist wichtig zu wissen, daß für jeden User, der später vbox aufrufen will, ein separates Unterverzeichnis angelegt werden muß:
  root:# mkdir /var/spool/vbox/user
  root:# mkdir /var/spool/vbox/user/messages
  root:# mkdir /var/spool/vbox/user/incoming
  root:# _
Jetzt werden einige Scripte und Tools an ihren Platz kopiert und etwas Feinschliff daran vorgenommen:
  root:# mkdir /usr/local/lib/vbox
  root:# cp /usr/src/vbox/scripts/vbox* /usr/local/sbin
  root:# cp /usr/src/vbox/bin/rmd* /usr/local/bin
  root:# chown root.root -R /usr/local/sbin/vbox*
  root:# chmod 755 /usr/local/sbin/vbox*
  root:# chown root.root -R /usr/local/bin/rmd*
  root:# chmod 755 /usr/local/bin/rmd*
  root:# _
Falls sich die Verzeichnisse /usr/local/bin und /usr/local/sbin nicht im Pfad befinden, muß man /etc/profile editieren und diese Pfade in die PATH-Variable nachtragen.

Schließlich muß jeder User in seinem Heimatverzeichnis die Datei ~/.vboxrc installiert haben. Man kopiert sich am besten die mitgelieferte Beispieldatei an Ort und Stelle:

  root:# cp /usr/src/vbox/samples/sample-vboxrc /home/<user>/.vboxrc
  root:# chown <user>.users /home/<user>/.vboxrc
  root:# _
Diese Datei muß man noch editieren und den Inhalt an seine Bedürfnisse anpassen. Rufnummern mit Vorwahl ohne führende Null. Beispiel:
/home/<user>/.vboxrc
  [CALLERID]
  81785005                -               K. Gentner
  817890031               -               Familie Hailer
  817890032               -               Bernhard Hailer
  *                       -               *** Unbekannt ***

  [DEBUG]
  FATAL + ERRORS + WARNINGS + INFOS + DEBUG + JUNK

  [RINGS]
  0-8             MO,DI,MI,DO,FR,SA,SO    5
  *               *                       30

  [STANDARD]
  *       *       standard.msg    120
Für den Anfang werden die mitgelieferten Ansagetexte in unser messages-Verzeichnis kopiert:
  root:# cp samples/messages/*  /var/spool/vbox/user/messages
  root:# _
Nun können wir vboxgetty starten (unter EAZ die EAZ/MSN eintragen, unter der Anrufe entgegengenommen werden sollen):
  root:# /usr/local/sbin/vboxgetty -d /dev/ttyI1 -i "ATZ&EEAZ" -u user
  root:# _

Ein Test

Einem Testanruf steht nun nichts im Wege - vboxgetty sollte nach dem 4. Klingeln (je nach DEFAULT_RINGS) abnehmen und eine kurze Ansage abspielen.

Dabei kann man gleich seinen neuen Ansagetext aufsprechen (wer will schon die Telefonnummer des Autors von vbox in Würzburg in der Ansage behalten :-). Wenn's geklappt hat, müßte sich in /var/spool/vbox/incoming eine neue Datei finden. Mit

  root:# cat /var/spool/vbox/incoming/Zeit-Rufnummer > /dev/audio
  root:# _
sollte man die sich dann schon relativ gut anhören können (falls VOICE_COMPRESSION_MODE nicht auf 6 gestellt wurde, ist natürlich nichts zu verstehen, zum Abspielen werden dann die pvftools im mgetty-0.99-Paket vom Juni benötigt).

Fehlersuche

Schiefgehen kann immer etwas. Falls im Folgenden etwas nicht funktioniert, sehe man in /var/log/messages oder - sehr aussagekräftig! - in /var/log/vbox.ttyI1 nach.

Feinjustage

Der Rest ist jetzt nur noch Feinkram, um es etwas komfortabler zu gestalten.

Als erstes rufen wir vbox auf - das ist der "eigentliche" Anrufbeantworter:

  root:# vbox -u user
  [Der vbox-Screen kommt im "View Mode"]
Die Angabe -u user ist nur unter root nötig/möglich - User user kann direkt
 
  user:# vbox
  [Der vbox-Screen erscheint]
eingeben. Dann müßte unser Testanruf angezeigt werden.

Wer kein "auplay" auf seinem System hat, legt sich einfach ein Script an, um nicht mehr den cat direkt verwenden zu müssen (auplay wird von vboxplay aufgerufen).

/usr/local/bin/auplay
  #!/bin/sh
  cat $1 > /dev/audio
Nachdem man mit chmod 755 /usr/local/bin/auplay das Script ausführbar gemacht hat, klappt das Abspielen auch so:
  root:# auplay /var/spool/vbox/incoming/Zeit-Rufnummer
  root:# _
Wenn das klappt, kann man es auch in vbox versuchen: dazu auf dem aufgelisteten Anruf einfach RETURN drücken - und schon sollte die Nachricht zu hören sein.

Wenn man zufrieden ist, kann man die Aufnahme zum Standard-Ansagetext machen:

  root:# cp /var/spool/vbox/incoming/Zeit-Rufnummer /var/spool/vbox/messages/standard.msg
  root:# _
Und alles ist in Butter...

Der automatische Systemstart

Natürlich soll der Anrufbeantworter auch bei jedem Booten automatisch gestartet werden. Dazu muß ein Eintrag in der Datei /etc/inittab vorgenommen werden. Wie der aussieht, kann auch der Datei /usr/src/vbox/samples/sample-inittab entnommen werden. Einige Änderungen sind aber nötig; der Eintrag sollte etwa so aussehen:
/etc/inittab
  ...
  # getty-programs for the normal runlevels
  ...
  I1:23:respawn:/usr/local/sbin/vboxgetty -d /dev/ttyI1 -i "ATZ&EEAZ" -u user
  ...
Zu beachten ist, daß die Runlevel korrekt sein müssen (in der Regel "23"). Nach einem Systemrestart läuft unsere Voicebox!

Achtung - Aufnahme!

Nun kosten Ansagen, wenn man sie über einen Selbstanruf erledigt, Geld - so ist das sicherlich nicht im Sinne des Erfinders. Wir haben eine Soundkarte, und mit der kann man ja schließlich auch was aufnehmen, oder?

Ein paar Zeichen am Beginn einer Sounddatei sagen etwas über ihre Verpackung aus. Mit vbox kommt ein Programm, mit dem man einen solchen Header herstellen kann. Dieses Programm benutzen wir nun, um einen solchen Header herzustellen (uLAW-Kompression):

  root:# rmdcatheader -u >/etc/ulaw.header
  root:# _
Ein Miniscript macht uns aus au-Dateien uLAW-Dateien:
/usr/local/sbin/au2ulaw
  #!/bin/sh
  cat /etc/ulaw.header $1.au > $1.msg
Damit ist das Aufnehmen des Ansagetextes ganz einfach:
  root:# cd /var/spool/vbox/user/messages
  root:# cat </dev/audio >standard.au
  (Nun Ansagetext aufnehmen, danach Strg-C drücken)
  root:# au2ulaw standard
  root:# _
Fertig! Entsprechend kann man noch eine individuelle beep.msg herstellen, in der der "Piep!" nach dem Ansagetext gespeichert ist. Ferner gibt es noch die Datei timeout.msg", in der das Ende der Aufzeichnungszeit verkündet wird, und die Datei panic.msg", in der bekanntgegeben wird, daß der Plattenplatz knapp wird.

Tools

Dem Paket liegen zwei sehr interessante Scripten bei: vboxnotify und vboxmime.

vboxnotify schickt eine simple Email als Nachricht, wenn ein Anruf hereinkommt, vboxmime schickt gleich die ganze Voicedatei selbst base64-kodiert weiter.

Wer's unter X mag, der kann noch mit mam und xvboxled experimentieren.

mam (Motif Answering Machine) von Chris Benndorf benötigt zum Übersetzen allerdings Motif, so daß man sich das nicht so ohne weiteres basteln kann. Es gibt allerdings unter ftp.franken.de/pub/isdn4linux/contributions/ eine statisch gelinkte Version zum Downloaden. Sie ist optisch ansprechender als das vt100-vbox-Programm, stürzt aber gern mal ab, wenn es irgend etwas nicht findet. Apropos: die statisch gelinkte Version erwartet die vboxgetty-Dateien in den Originalverzeichnissen. Ich habe diese für die Anleitung etwas verändert, um die logische Linux-Verzeichnisstruktur besser zu unterstützen. Eventuell sind ein paar Softlinks von den erwarteten in die tatsächlichen Verzeichnisse zu legen.

Auch xvboxled von Jan Schoenepauck und Joachim Gassen, ein Programm, das ähnlich wie xbiff die Ankunft neuer Anrufe anzeigt und vbox starten kann, muß man sich erst noch übersetzen. Dazu begibt man sich ins Verzeichnis /usr/src/vbox/xvboxled, kopiert example-config.h in config.h und editiert letzteres. Darin ist nur ein Pfad anzupassen:

/usr/src/vbox/tools/xvboxled (Ausschnitt)
  #define INCOMING_DIR "/var/spool/vbox/user/incoming"
Das Makefile ist in der Regel bereits so wie es ist brauchbar (vielleicht will man die Installationspfade verändern). Das Programm wird nun übersetzt und installiert:
  root:# make
  ...
  root:# make install
  ...
  root:# _
Programm nun aufrufen und benutzen! Bei mir hat es seinen Platz neben xbiff und isdnmon in einem "Schaltkasten" eingenommen. Kommt echt schön!


Copyright © (GPL V 2) 1996 Matthias Heßler, Bernhard Hailer
Letzte Änderung: 21-Feb-97 BeH