#

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:

- Eine Soundkarte muß installiert sein und unter Linux laufen. Bei Eingabe von `ls > /dev/audio` sollte ein kurzes Rauschen zu hören sein - falls nicht, muß wohl der Kernel neu kompiliert werden unter Einbeziehung der Soundoptionen (siehe auch Sound-HOWTO!).
- Der Kernel muß im Abschnitt ISDN mit Audiosupport compiliert worden sein.
- Das mgetty-Paket muß installiert sein, wenn man auf andere Aufzeichnungsformate als uLAW zurückgreifen will (im Paket ist eine Tools-Sammlung enthalten, die in diesem Falle benötigt wird). Das Paket wird im Kapitel Fax genau erklärt (im Moment allerdings noch nicht :-).

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!