8. Für Einserkandidaten ;-)

Contents of this section

8.1 Kann ich mehrere Teles-Module laden?

Seit isdn-11 ist das Teles-Modul zweiteilig; der "untere" Teil teles.o ist für die Karte selbst zuständig. Damit erspart man sich das Herumprobieren in Config.c (siehe DOKU)

Möchte man nun mehrere Karten damit betreiben, sollte in modules.isdn in etwa folgendes stehen:

-o Tel0 teles.o name=$(cardname Tel0) mem=0xD8000 irq=15 ipl=1
-o Tel1 teles.o name=$(cardname Tel1) mem=0xC8000 irq=14 ipl=2

In isdn.conf kann man sich dann auf die Kartnennamen "Tel0" und "Tel1" beziehen.

8.2 Wie war das mit dem Anrufbeantworter?

Was man hierzu wissen muß, in der Dokumentation zu Linux-ISDN aber nicht so richtig rueberkommt: Das Modul alaw wandelt nicht "alaw" (vom ISDN) in linear codiertes PCM um, wie man vielleicht annehmen möchte. Es erzeugt signed 8-bit, logarithmisch codierte Werte. Zur Wandlung von/zu normalem, linearem PCM sind in jedem Fall tosnd/toalaw zu verwenden.

Verwirrend an der ganzen Sache ist, das man die logarithmisch codierten Files zwar einwandfrei abspielen kann, selbstaufgenommenes wegen falscher Codierung jedoch ziemlich unverständlich klingt.

Also: WAV-Files nach signed binary, dann toalaw drueberlaufen lassen. Diese kann man dann, bei zugeschaltetem alaw-Modul, abspielen lassen. Umgekehrt: Aufgenommene Nachrichten mit tosnd umwandeln, dann abspielen. ( Johannes Deisenhofer )

Hier eine Beispiel-Konfiguration, auch von Johannes Deisenhofer :

Folgende Features haben wir eingebaut:

Bei jedem Anruf auf der angegebenen Leitung wird das Anrufbeanworter-Skript gestartet. Dies geschieht sofort, nach der eingestellten Wartezeit (im Beispiel 30 Sekunden) werden dann Daten geliefert. Wir haben das benutzt, um im Anrufbeantworter-Skript eine Nachricht an alle Rechner im LAN zu schicken, mit der Nummer und dem Namen des Anrufers. Auf diese Weise kriegen wir bei jedem Anruf aus dem ISDN einen Popup mit dem Namen des Anrufers... Außerdem loggt das Skript die Anrufe in eine Datei, benennt die Dateien nach der Telefonnummer des Anrufers, schickt eine Mail, etc. Bei uns landen die Anrufe alle in einem Verzeichniss, auf das der HTTP- Daemon Zugriff hat. So kann man sich die Nachrichten komfortabel mit einem HTML-Browser anschauen und anhören.

Das ganze läuft hier unter Version 1.2.9-8 (oder so), allerdings war dafür ein Patch im master-Programm erforderlich. Sonst hat sich der Anrufbeantworter nach dem ersten Anruf verabschiedet. Meines Wissens ist der Fehler in neueren Versionen bereits behoben, Matthias Urlichs hat hier auch mal den entsprechenden Patch gepostet. (Wo iss denn der? hm)

Um hiermit starten zu können, sollte man in /var/spool das Verzeichnis fone/, und darin die Verzeichnisse ansage/ und in/ anlegen. In ansage/ kommt eine Datei, bei uns VOICE, die die Filenamen der Ansage enthält. Dann braucht man noch ein Skript work, kann man erst mal weglassen. Beschreibung und Beispiel unten.

Hier der Auszug aus der ISDN-Konfigurationsdatei

# Anrufbeantworter an der Telefonleitung
# Nach 30 Sekunden abheben... auf MSN 59376

R phone * * * root DRi.30 /usr/local/isdn/bin/catfone_v
P phone * * * RXi :vB 8090A3 EFFF9F  :lr .9376 :iL
MP phone * * * - alaw 
ML phone * * * - transalaw alaw 

Ab hier das Shell-Script bin/catfone_v

#!/bin/sh
# Anrufbeantworter-Skript der MvWG Ulm, Johannes Deisenhofer
# sicher nicht perfekt, aber so als Anregung...

# Dieses Skript wird mit folgenden Parametern aufgerufen
# 1) Name des Directorys mit Ansagen, relativ zu /var/spool/fone oder absolut
# 2) Name des Directorys fuer die aufgenommenen Nachrichten
# 3) Name des Scriptes zur Nachbearbeitung der Nachrichten

# Zuerst mal den Pfad zu unseren Utilities anfuegen
PATH=.:/usr/local/isdn/bin:$PATH
# Pfad eines File mit uns bekannten Telephonnummern im 
# Format 'Nummer Name <LF>'
PHONENUMBERS=/usr/local/isdn/bin/phonenumbers.txt

set -e

cd /var/spool/fone
pid=$$

# Evtl. Defaultwerte fuer Parameter einsetzen

if test -n "$1" ; then ansage="$1" ; else ansage=ansage ; fi
if test -n "$2" ; then in="$2" ; else in=in ; fi
if test -n "$3" ; then work="$3" ; else work=work ; fi

# Hier wird die Telefonnummer des Anrufers ausgewertet,
# der dazu passende Name aus der Telefonnummerndatei
# geholt, und dann mit dem (selbstgeschriebenen) Utility
# SEND eine Nachricht an die lokalen Rechner geschickt
# Da dieses Skript immer sofort nach dem Anruf gestartet
# wird (aber verzoegert der B-Kanal aufgebaut wird, 
# kriegt man bei jedem Anruf ein Popup mit dem Namen des
# Anrufers 


if test -n "$PHONE"
  then
    PHONE="0`echo $PHONE | cut -b 2-99`"
    MESSAGE="`egrep $PHONE $PHONENUMBERS|cut -f 2-`"

    if test -n "$MESSAGE"
      then
        MESSAGE="$PHONE ($MESSAGE)"
      else
        MESSAGE=$PHONE
    fi

#    send urmel RING "$MESSAGE"
#    send case RING "$MESSAGE"
#    send struppi RING "$MESSAGE"
else
    PHONE="Analog"
fi

# Anruf loggen, mit Datum und Telefonnummer

((date; echo "Anruf auf Voiceleitung, $PHONE") >>/usr/local/isdn/calllog)

# Ansage abspielen: Im angegebenen Verzeichnis
# muss eine Datei VOICE liegen, die die abzuspielenden
# Files auflistet. 
# Aufnahme der Ansagen: Zuerst nach signed byte wandeln,
# dann mit toalaw behandeln. Alternativ kann man auch
# einfach selbst den Anrufbeantworter besprechen und die
# Datei dann kopieren

if test -d $ansage ; then
   (
        cd $ansage
                if test -s "VOICE" ; then
                        files=$(cat VOICE)
                else
                        file=1
                        files=""
                        while test -f $file ; do
                                files="$files $file"
                                file=$(expr $file + 1)
                        done
                fi
                cat $files
   )
# Anmerkung : 
# Hier steht im Original ein '&amp;', dies fuehrt dazu, das
# waehrend der Ansage bereits aufgenommen wird.
# Laesst man es weg, wird nur der Anfang und das Ende
# der eigenen Ansage aufgenommen, der Rest geht in einem
# Pufferueberlauf unter
 
fi

# Hier folgt die Aufnahme:
# Zuerst wird ein noch nicht belegter Filename gesucht,
# dazu wird die Endung des Files hochgezaehlt

if test -d $in ; then
        file=1
        thefile=$in/$PHONE.$file
        while test -f $thefile.aiff ; do
                file=$(expr $file + 1)
                thefile=$in/$PHONE.$file
        done

        # Umwandlung nach signed 8 Bit
        /usr/local/isdn/bin/tosnd 2 > $thefile  

        # Mail verschicken

        if test -s $thefile ; then
                echo "Anruf von $MESSAGE: $thefile" | mail -s "Anruf von $MESSAGE" crew
        else
                rm -f $thefile
                exit 0
        fi
else
        exit 1
fi

# Hiermit wird das work-script angestossen, das
# (nach Beendigung des Anrufes, deswegen Extra-Skript )
# die Konvertierung vornimmt
( $work $thefile >/tmp/outanr 2>&1 ) &amp;
exit 0

Hier folgt noch das Skript /var/spool/fone/work: Verwendet das Sound-Utility SOX, um ein aiff-File zu erzeugen (Man muß schließlich auf die Macs Rücksicht nehmen..) Wer das Fileformat ändert, muss dies auch im catfone-Skript tun.

#/bin/sh
/usr/local/bin/sox -t .ub -r 8000 $1 $1.aiff
rm $1
chmod go+r $1.aiff

So, das wars bereits, ich hoffe, ich habe beim Kommentieren nicht zu viele Fehler eingebaut.

8.3 Wie ist das mit der Gebührenerfassung?

Gibt es 3rd Party Tools, z.B. um Statistiken &uuml;ber die angefallenen
Gebuehren zu erstellen ?

Gebührenerfassung unter EuroISDN funktioniert zumindest mit isdn-1.2.9-8 noch etwas rudimentär. Die Kosten für eine Verbindung werden erst beim Aktivieren der nächsten Verbindung zur gleichen Gegenstelle ausgegeben. Ansonsten hilft ein Skript, das die COST-Zeilen aus dem syslog filtert. Folgendes Skript chlink verwende ich beispielsweise auf seneca (Euro-ISDN, daher die "8890"), um etwas Überblick zu behalten:

#!/bin/sh

# Aufruf: chlink <partner>
# als <partner> ist der Name aus der cf-Datei anzugeben

ISDNLOG=/var/log/isdnlog
CF=/usr/local/isdn/cf

# Nummer aus cf holen
NUMBER=`sed -n 's/^D .* '$1' .*=\([0-9]*\)-\([0-9]*\)\//\1\2/p' $CF`

# damit die entsprechenden Zeilen aus isdnlog ziehen
grep "UP $1\|DOWN $1\|COST $1\|ISDN In .* 8890 .*$NUMBER" $ISDNLOG |\
cut -c1-49,96-180

8.4 Kann ich abhängig vom Linkstatus Aktionen steuern?

Da gäbe es z.B. die Möglichkeit, den LOCAL7-Output des syslog in eine Named Pipe zu schicken, aus der ein Skript liest und abhängig von "UP" oder "DOWN" entsprechende Aktionen startet. Man könnte beispielsweise Routen setzen oder löschen, ein X-Fähnchen aufziehen etc.

Ab einer der 30er-Versionen kann mit der RP-Zeile beim UP oder DOWN ein Programm gestartet werden.


Next Chapter, Previous Chapter

Table of contents of this chapter, General table of contents

Top of the document, Beginning of this Chapter