Anrufbeantworter-Bingo

Diverse Anrufer beschweren sich derzeit, dass mein Anrufbeantworter nicht funktioniert. Dieses Problem ist nun behoben. Ich habe gleich noch ein paar Lustige Anrufbeantwortersprüche aufgenommen, diese werden zufällig ausgewählt dem Anrufer kredenzt. Und so geht’s:

Zunächst braucht man einen funktionierenden Capi-Treiber. Es gibt von AVM Treiber für SuSE 9.3, die sich aber nicht sofort bauen lassen, wenn man z.B. Debian verwendet:

make -C src
make[1]: Entering directory `/home/melle/tmp/fritz/src'
make -C /lib/modules/2.6.17-2-k7/build SUBDIRS=/home/melle/tmp/fritz/src modules
make[2]: Entering directory `/usr/src/linux-headers-2.6.17-2-k7'
CC [M] /home/melle/tmp/fritz/src/main.o
In file included from /home/melle/tmp/fritz/src/queue.h:27,
from /home/melle/tmp/fritz/src/tables.h:31,
from /home/melle/tmp/fritz/src/driver.h:31,
from /home/melle/tmp/fritz/src/main.c:45:
/home/melle/tmp/fritz/src/tools.h:74: error: expected identifier or '(' before 'typeof'
/home/melle/tmp/fritz/src/tools.h:74: error: expected ')' before '__xchg'
make[3]: *** [/home/melle/tmp/fritz/src/main.o] Fehler 1
make[2]: *** [_module_/home/melle/tmp/fritz/src] Fehler 2
make[2]: Leaving directory `/usr/src/linux-headers-2.6.17-2-k7'
make[1]: *** [fcpci.ko] Fehler 2
make[1]: Leaving directory `/home/melle/tmp/fritz/src'
make: *** [src/fcpci.ko] Fehler 2

Zum Glück haben schon andere freundliche Menschen herausgefunden, dass man ledliglich in src/tools.h eine Inline-Definition entsorgen muss. Einfach diese Zeilen auskommentieren:

static inline unsigned long atomic_xchg (
volatile atomic_t * v,
unsigned value
) {
return __xchg (value, &v->counter, sizeof (unsigned));
} /* atomic_xchg */

Und schon kann das Modul fcpci.ko gebaut und geladen werden. Das sieht gut aus:

fcpci: module license 'Proprietary' taints kernel.
fcpci: AVM FRITZ!Card PCI driver, revision 0.7.2
fcpci: (fcpci built on Jan 27 2007 at 11:46:23)
fcpci: -- 32 bit CAPI driver --
ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 16
ACPI: PCI Interrupt 0000:02:0a.0[A] -> Link [LNKA] -> GSI 16 (level, low) -> IRQ 225
fcpci: AVM FRITZ!Card PCI found: port 0xcc00, irq 225
fcpci: Loading...
fcpci: Driver 'fcpci' attached to fcpci-stack. (152)
fcpci: Stack version 3.11-07
kcapi: Controller 1: fcpci-cc00-225 attached
kcapi: card 1 "fcpci-cc00-225" ready.
fcpci: Loaded.

Dann installiert man sich mit dem Paketmanager der Wahl Capisuite. /etc/capisuite/answering_machine.conf muss um einen Eintrag für den Anrufbeantworter erweitert werden:

[melle]
voice_numbers="8715419"
voice_action="MailAndSave"
voice_delay="1"
record_length="90"
voice_email="melle <email @ adresse.de>"
pin="1234"
announcement="ansage.la"

Die Telefonnummer ist die Zielnummer ohne Ortsvorwahl, nach einer Sekunde kommt die Ansage und man kann 90 Sekunden quatschen, das Resultat wird via e-Mail verschickt.
Jeder User (der Name in den eckigen Klammern) hat ein Spool-Verzeichnis unterhalb von /var/spool/capisuite/users/. Die Ansage ansage.la wird in diesem User-Verzeichnis gesucht.

Der Anrufbeantworter funktioniert schon fast, wir brauchen noch ein paar lustige Ansagen. Die kann man entweder aufnehmen in dem man sich selbst anruft, die PIN eingibt und dann losquatscht. Oder man hat eine tolle Plattensammlung und möchte die Audioschnipsel von CD durch die Telfonleitung quetschen.
Wenn das gewünschte File als WAV vorliegt, kann man es mit sox konvertieren:

sox ansage.wav -r 8000 -c 1 -b ansage.la resample -ql

Super, jetzt funktioniert der Anrufbeantworter. Fehlt nur noch eine Shuffle-Funktion. Die sieht bei mir so aus:

#!/bin/sh
rm /var/spool/capisuite/users/melle/ansage.la;
ln -s `ls /var/spool/capisuite/users/melle/*.la -1 | rl | tail -1` /var/spool/capisuite/users/melle/ansage.la

rl kommt aus dem Paket randomize-lines und verwurstelt die Ausgabe von ls. Das Script kann man jetzt via Cronjob ausführen lassen, um z.B. stündlich die Ansage zu shuffeln. Lustiger ist es vor jedem Anruf, damit immer eine neue Ansage zu hören ist.
In /etc/capisuite/incoming.py sucht man sich die Funktion callIncoming und dann die Zeile

capisuite.connect_voice(call,int(delay))

heraus. Dort geht der Anrufbeantworter ran, es genügt also oberhalb dieser Zeile folgendes einzufügen:

os.popen("rm /var/spool/capisuite/users/melle/ansage.la; ln -s `ls /var/spool/capisuite/users/melle/*.la -1 | rl | tail -1` /var/spool/capisuite/users/melle/ansage.la")

Fertig ist die Laube. Wer es ausprobieren will – einfach ein paar Mal hier anrufen: +49-331-8715419. Keine Angst, ist nur der Anrufbeantworter, ich werde nicht geweckt, wenn dort jemand anruft 😉