Hier moechte ich euch zeigen, wie ihr mit einer ISDN Karte einen Asterisk Server unter Debian Etch betreibt. Dieses Tutorial wird sich Stueck fuer Stueck erweitern und neue Moeglichkeiten zeigen, wie ihr Asterisk einsetzen koennt. Da ich die meisten Moeglichkeiten erst noch testen muss, bevor ich eine Anleitung ueber sie veroeffentliche, bitte ich euch um Geduld. Wie immer gibt es mehrere Moeglichkeiten zum Ziel zu kommen, ich nutze in dieser Sourcen von Asterisk und lasse diese compilieren.
Im ersten Teil dieses Tutorials wird ein Computer mit nur einer ISDN Karte mit hfc-Chipsatz (preislich ca. 25Euro fuer die ISDN Karte) zum Asteriskserver umgebaut (Ich nutze die "ISDN TA Karte" von Conrad). Dieser soll uns als Anrufbeantworter (Voicemail) dienen. Desweiteren wird er uns ueber Jabber von jedem eingehenden Anruf benachrichtigen und einen zeitgesteuerten Anrufplan bereitstellen, der uns laestige Anrufe in der Nacht erspart. Dieses Tutorial wird allerdings noch erweitert, deshalb schaut euch lieber das Inhaltsverzeichnis an, um Rueckschluesse darueber zu ziehen, welchen Inhalt ich hier behandle.
Ich gehe hierbei von einem Debian Etch Grundsystem aus, welches frisch installiert und auf dem neusten Stand des Etch Repositories ist. Als Asterisk dient mir die Version 1.2.25-BRIstuffed-0.3.0-PRE-1y-l. Wie immer gilt bei dem Tutorial, ihr seid selber fuer die Nutzung verantwortlich und solltet die Anleitungen nicht nur stupide befolgen, sondern mitdenken.
Sobald die Pakete installiert sind, wechselt ihr in /usr/src
h3rmes:~# cd /usr/src
und ladet euch den neusten Florz Patch runter von http://zaphfc.florz.dyndns.org/. Die dazu passende Asterisk Version ist auch auf dieser Seite verlinkt. Falls ihr sie dort nicht findet, koennt ihr sie hier suchen http://www.junghanns.net/en/download.html. Wenn ihr dies getan habt, entpackt ihr erstmal das bristuff Paket:
h3rmes:/usr/src# tar xfvz bristuff-0.3.0-PRE-1y-l.tar.gz
Nun wechselt ihr ins Verzeichnis /usr/src/bristuff-0.3.0-PRE-1y-l/zaphfc/
h3rmes:/usr/src# cd /usr/src/bristuff-0.3.0-PRE-1y-l/zaphfc/
Wenn ihr das erledigt habt, geht ihr ein Verzeichnis hoeher und installiert Asterisk und alle Module:
h3rmes:/usr/src/bristuff-0.3.0-PRE-1y-l/zaphfc# cd ..
h3rmes:/usr/src/bristuff-0.3.0-PRE-1y-l# ./install
Das Installationsskript wird ersteinmal alle benoetigten Sourcepakete herunterladen und sie dannach compilieren. Das kann je nach Rechnerleistung einige Zeit dauern.
Wenn die Installation fertig ist, geht ihr in den Asterisk Ordner und fuehrt make samples aus.
h3rmes:/usr/src/bristuff-0.3.0-PRE-1y-l# cd asterisk
h3rmes:/usr/src/bristuff-0.3.0-PRE-1y-l/asterisk# make samples
Wenn ihr dies erledigt habt, koennen wir anfangen zu konfigurieren. Dafuer bearbeiten wir die /etc/zaptel.conf
#/etc/zaptel.conf
loadzone=de
defaultzone=de
span=1,1,3,ccs,ami
bchan=1-2
dchan=3
Mehr muss in dieser Konfigurationsdatei nicht stehen.
Wenn ihr dies nun getan habt, muesst ihr in die /etc/modprobe.d/blacklist folgende Zeilen hinzufuegen:
#/etc/modprobe.d/blacklist
#fuer asterisk
blacklist hisax
blacklist vzaphfc
Und in die /etc/modules:
#/etc/modules
#fuer asterisk
zaphfc
Die Eintraege in die /etc/modprobe.d/blacklist sind dafuer da, dass die beiden Module hisax und vzaphfc nicht geladen werden. Diese wuerden unserem Modul, welches wir nutzen wollen, in die Quere kommen und nichts wuerde funktionieren. Der Eintrag in die /etc/modules veranlasst Debian dazu, beim Starten des Systems das Modul zaphfc zu laden, welches wir fuer unsere ISDN Karte benutzen wollen.
Wenn wir dies nun erledigt haben, starten wir unser System einmal neu.
So, wenn wir nun gestartet haben, schauen wir uns erstmal an, als was unsere ISDN Karte laeuft:
h3rmes:~# cat /proc/zaptel/1
Span 1: ZTHFC1 "HFC-S PCI A ISDN card 1 [TE]"
1 ZTHFC1/0/1
2 ZTHFC1/0/2
3 ZTHFC1/0/3
Wichtig hierbei ist es, dass die Karte als TE laeuft. Sollte sie als NT laufen, kann es passieren, dass ihr keine Anrufe mehr bekommen koennt (egal auf welchem Telefon), da euer NTBA damit nicht klar kommt. TE bedeutet einfach nur, dass diese ISDN Karte als normales ISDN Endgeraet fungieren soll (Terminal Equipment).
Jetzt koennen wir folgenden Befehl ausfuehren, um die Karte zu aktivieren:
h3rmes:~# ztcfg -v
Zaptel Configuration
======================
SPAN 1: CCS/ AMI Build-out: 399-533 feet (DSX-1)
3 channels configured.
Nun koennt ihr euch noch einmal mit folgenden Befehl den Status der ISDN Karte anzeigen lassen.
immediate=no
overlapdial=yes
group = 1
context=default
channel => 1-2
Ich hatte schon oefter Probleme, weil ich vergessen habe, dass es sich bei dem ISDN Anschluss um einen Mehrgeraeteanschluss handelte und nicht um einen Anlagenanschluss. Dies hat mir diverse Stunden meiner Zeit gekostet, da ich den Fehler wo anders vermutet hatte. Die grundsaetzliche Asteriskkonfiguration ist hiermit abgeschlossen.
Als erstes Konfigurieren wir Asterisk so, dass es einfach den Anruf annimmt und eine MP3 abspielt. Dazu muessen wir als erstes noch ein Paket installieren:
h3rmes:~# apt-get install mpg123
Der Ordner der von Asterisk als default fuer MP3s benutzt wird, liegt unter /usr/share/asterisk/mohmp3/. Dort legen wir nun einen Ordner an:
h3rmes:~# cd /var/lib/asterisk/mohmp3/
h3rmes:/var/lib/asterisk/mohmp3# mkdir test
Wenn dies nun geschehen ist, kopieren wir eine MP3 Datei in diesen Ordner.
Als naechstes muessen wir die Datei /etc/asterisk/musiconhold.conf bearbeiten. Dort fuegen wir folgende Zeilen hinzu:
Ich finde die quietmp3 Option am passensten zum MP3 abspielen. Dies kann jeder fuer sich selber entscheiden. Hier liste ich der Vollstaendigkeit halber einmal alle Modi auf:
; valid mode options:
; quietmp3 -- default
; mp3 -- loud
; mp3nb -- unbuffered
; quietmp3nb -- quiet unbuffered
; custom -- run a custom application
; files -- read files from a directory in any Asterisk supported format
Nun muessen wir als naechstes die /etc/asterisk/extensions.conf bearbeiten, damit Asterisk auch weiss, was er mit einem eingehenden Anruf machen soll. Alle anderen Standardeintraege in extensions.conf werden in unserem Fall nicht benoetigt.
Wenn wir das getan haben, werden wir Asterisk starten. Wir fuehren als root dieses hier aus:
h3rmes:/var/lib/asterisk/mohmp3# asterisk -vvvc
== Parsing '/etc/asterisk/asterisk.conf': Found
== Parsing '/etc/asterisk/extconfig.conf': Found
Asterisk 1.2.25-BRIstuffed-0.3.0-PRE-1y-l, Copyright (C) 1999 - 2007 Digium, Inc. and others.
Created by Mark Spencer <...>
[...]
Asterisk Ready.
*CLI>
Jetzt sollten wir bei der Wahl von 1234567 direkt eine Anrufendgegennahme von Asterisk haben, der sofort Musik spielt. In der Asteriskkonsole sollte es ungefaehr so aussehen:
-- Accepting voice call from 'xxxxxxx' to '1234567' on channel 0/2, span 1
-- Executing Answer("Zap/2-1", "") in new stack
-- Executing MusicOnHold("Zap/2-1", "") in new stack
-- Started music on hold, class 'default', on channel 'Zap/2-1'
Um Asterisk zu beenden, druecken wir entweder CTRL+c oder geben in die Konsole
Jetzt werden wir als naechstes das wohl interessanteste fuer Asterisk als Endgeraet einrichten. Die Voicemail funktion. Im Prinzip ist es nichts anderes als ein Anrufbeantworter. Dieser bietet sehr viele verschiedene Funktionen. Ich werde hier nur beschreiben, wie er einzurichten ist, damit er eine Ansage abspielt, den Anruf aufnimmt und per eMail weiterschickt. Dazu benoetigen wir als erstes einen SMTP Dienst. Dafuer nutzen wir Postfix.
h3rmes:~# apt-get install postfix
Bei der Installation waehlen wir "Internet Site" aus und geben unseren Mailnamen ein. Falls ihr euren Mailnamen nachtraeglich noch aendern wollt, dieser steht in der Datei /etc/mailname. Als naechstes konfigurieren wir postfix. Dazu ersetzen wir den aktuellen Inhalt der Konfigurationsdatei /etc/postfix/main.cf mit diesem hier:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
Natuerlich muss dieser Inhalt noch auf eure Beduerfnisse angepasst werden. Ich habe hier extra eine whitelist eingebaut, da ich nicht moechte, dass jeder aus unserem Netzwerk ueber diesen Server eMails verschicken kann. Nun muessen wir allerdings noch die whitelist anlegen. Dazu erstellen wir die Datei whitelist
h3rmes:~# cd /etc/postfix
h3rmes:/etc/postfix# touch whitelist
und fuegen ihr folgenden Inhalt hinzu:
127.0.0.1 OK
Im Moment ist nur der localhost eingetragen, dies koennt ihr aber beliebig mit den IPs aus eurem Netzwerk erweitern. Als naechstes muessen wir allerdings die Whitelist fuer Postfix noch nutzbar machen und Postfix neu starten.
So, nun geht es weiter zur Asteriskkonfiguration. Als erstes konfigurieren wir die Datei /etc/asterisk/voicemail.conf, dazu loeschen wir den jetzigen Inhalt bzw machen uns ein Backup (so wie es eigentlich immer gemacht werden sollte) und fuegen nur diesen ein:
[default]
;die Nachrichten sollen nach dem Versenden geloescht werden
1234567 => 1234,Max Mustermann,max@mustermann.de,,delete=yes
Mit dieser Einstellung, wird die aufgenommene Voicemail uns per eMail zugeschickt und aus dem Asteriskordner geloescht. So laufen wir nicht Gefahr, dass uns die Festplatte irgendwann mal durch alte Nachrichten voll laeuft. Das wichtigste an der Konfiguration ist eigentlich die letzte Zeile "1234567 => 1234,Max Mustermann,max@mustermann.de,,delete=yes". 1234567 steht hierbei nicht fuer die Telefonnummer, sondern fuer den Namen der Mailbox in Ziffern (ich nehme immer Telefonnummern hierfuer, sieht uebersichtlicher aus). Ihr koennt dort auch eine beliebige andere Zahlenkombination nutzen. "1234" ist das Kennwort fuer die Fernabfrage, die wir hier aber nicht benutzen werden. "Max Mustermann" ist der Name des Voicemail Inhabers und darauf folgt die eMailadresse, an die die Voicemail verschickt werden soll. Der Parameter danach ist fuer die Pager-Adresse zustaendig, an die eine Textzeile geschickt werden soll. Da wir so etwas nicht besitzen, lassen wir diesen Parameter leer. Als letztes steht der "Options" Parameter, der hier nur mit einem delete=yes ausgefuellt ist. Dies bedeutet, dass unsere Sprachnachricht nach dem Versenden via Mail geloescht werden soll. Zusaetzliche Optionen werden durch ein "|" ergaenzt. Die Syntax fuer eine Voicemailbox lautet:
Hier wird als aller erstes bei einem Anruf auf die Nummer 1234567 der Befehl Wait(10) ausgefuehrt. Dieser veranlasst Asterisk einfach nur 10 Sekunden zu warten. Dannach wird der Befehl VoiceMail(u1234567) ausgefuehrt, dieser veranlasst Asterisk eine "Anrufbeantworterfunktion" auszufuehren. Hierbei ist die Information noch nuetzlich, dass es verschiedene Arten gibt, wie Asterisk den Anruf entgegen nehmen soll. Hier einmal eine Liste:
u veranlasst, dass die "unavailable" (nicht verfuegbar) Nachricht abgespielt wird. Der Dateiname im Filesystem ist /var/lib/asterisk/sounds/vm-isunavail.gsm
b veranlasst, dass die "busy" (besetzt) Nachricht abgespielt wird. Der Dateiname im Filesystem ist /var/lib/asterisk/sounds/vm-rec-busy.gsm
s unterdrueckt das Abspielen einer Nachricht (Sounddatei) und startet unmittelbar die Aufnahme
Bei dem Befehl VoiceMail(u1234567) steht die Nummer 1234567 nicht fuer die Telefonnummer, sondern fuer den Namen der unter der Datei voicemail.conf vergeben wurde. Ich vergebe fuer die Voicemailfunktion gerne die Telefonnummer fuer den Namen, da ich es uebersichtlicher finde. Das u in VoiceMail(u1234567) steht einfach nur dafuer, dass wie oben erwaehnt die "unavailable" Nachricht abgespielt werden soll.
Jetzt koennen wir Asterisk einmal starten und testen was passiert. Wenn ihr nun eure Nummer waehlt, sollte Asterisk euch so etwas ausgeben:
-- Accepting voice call from 'xxxxxxxx' to '1234567' on channel 0/2, span 1
-- Executing Wait("Zap/2-1", "10") in new stack
-- Executing VoiceMail("Zap/2-1", "u1234567") in new stack
-- Playing 'vm-theperson' (language 'de')
-- Playing 'digits/1' (language 'de')
-- Playing 'digits/2' (language 'de')
-- Playing 'digits/3' (language 'de')
-- Playing 'digits/4' (language 'de')
-- Playing 'digits/5' (language 'de')
-- Playing 'digits/6' (language 'de')
-- Playing 'digits/7' (language 'de')
-- Playing 'vm-isunavail' (language 'de')
-- Playing 'vm-intro' (language 'de')
-- Playing 'beep' (language 'de')
-- Recording the message
-- x=0, open writing: /var/spool/asterisk/voicemail/default/1234567/tmp/Lm89oC format: wav, 0x81a8f30
-- Channel 0/2, span 1 got hangup request, cause 16
-- User hung up
== Spawn extension (default, 1234567, 2) exited non-zero on 'Zap/2-1'
-- Hungup 'Zap/2-1'
Da es aber ziemlich doof ist, eine Computeransage abzuspielen, die obendrein auch noch auf Englisch ist, bauen wir uns eine andere Ansage dort hinein. Hierzu muesst ihr einfach eine Ansage von euch als MP3 aufnehmen (wie ihr es macht ist euch ueberlassen, ich kann dazu nur Audacity empfehlen). Ich habe meine Ansage "eigen-nichterreichbar.mp3" genannt. Diese wandeln wir jetzt mit folgendem Befehl in eine *.gsm Datei um:
Wenn wir nun Asterisk ausfuehren und testen, werden wir sehen, dass Asterisk 10 Sekunden wartet, dann unsere Nachricht abspielt und dannach nur durch den Beepton anzeigt, dass er aufnimmt. Die aufgenommene Nachricht wird uns dann natuerlich via eMail zugeschickt.
Hier bringen wir nun Asterisk bei, uns eine Nachricht ueber Jabber zu schreiben, wenn uns jemand anruft. Dazu muessen wir als erstes unseren Konsolenjabberclient installieren:
h3rmes:~# apt-get install sendxmpp
Wenn wir das getan haben, muessen wir in /root eine Datei erstellen, mit den Zugangsdaten fuer den Jabberclient.
h3rmes:~# touch .sendxmpprc
Wenn wir diese Datei nun bearbeiten kommt folgendes hinein:
asterisk@jabber.de passwort
Das ist als erstes der Username, der auch gleichzetig den Server enthaelt und dahinter das Passwort. Also einfach in der Form "USERNAME@SERVER PASSWORT". Wir muessen allerdings damit der Jabberclient funktioniert, noch die Rechte der Datei veraendern:
h3rmes:~# chmod 600 /root/.sendxmpprc
So, damit Asterisk uns jetzt auch eine Nachricht bei jedem Anruf zusendet, muessen wir natuerlich noch etwas in der extensions.conf aendern. Diese sollte dann so aussehen:
Wenn wir nun angerufen werden, sendet Asterisk uns als erstes eine Nachricht ueber Jabber (der -t Parameter gibt dem Client an, dass TLS benutzt werden soll) zu. Diese teilt uns die Nummer mit, welche uns gerade anruft und die aktuelle Uhrzeit durch den Konsolenbefehl "date". Dann wird erst der Rest ausgefuehrt.
Als naechstes bringen wir Asterisk bei, abhaengig von der Uhrzeit direkt Nachrichten zu beantworten oder das Telefon laenger klingeln zu lassen. Dazu muessen wir die extensions.conf bearbeiten. Diese sollte dann ungefaehr so aussehen:
;##### DIALPLAN #####
[default]
;Syntax: include => context|<times>|<weekdays>|<mdays>|<months>
include => normal-woche-morgens|00:00-08:00|mon-fri|*|*
include => normal-woche-mittags|08:00-18:00|mon-fri|*|*
include => normal-woche-abends|18:00-23:00|mon-fri|*|*
include => normal-woche-nachts|23:00-00:00|mon-fri|*|*
include => normal-wochenende-tags|10:00-00:00|sat-sun|*|*
include => normal-wochenende-nachts|00:00-10:00|sat-sun|*|*
Hier sieht man, dass die einzelnen Befehle in Abschnitte unterteilt sind wie "normal-woche-mittags" oder "normal-wochenende-tags". Da wir die einzelnen Befehle dort schon vorher benutzt haben, lassen wir diese mal aussen vor. Wichtig hierbei ist eigentlich nur der include Befehl, der hierbei zeitgesteuert ist. Die Syntax hierfuer lautet:
include => Abschnitt|Uhrzeit|Wochentag|Monatstag|Monat
In dieser extensions.conf sind in der Woche von Montag bis Freitag jeweils 4 verschiedene Abschnitte die zu bestimmten Uhrzeiten benutzt werden und am Wochenende von Samstag bis Sonntag 2 Abschnitte die zu verschiedenen Uhrzeiten benutzt werden.
Wichtig hierbei ist noch zu erwaehnen, dass ich ueberall ein Wait(1) hinzugefuegt habe, da der Telefonanruf sonst ab und zu abgebrochen ist bzw unerwartet beendet wurde.
Hier zeige ich euch, wie ihr Asterisk so konfiguriert, dass ihr eure eingehenden Anrufe auf eine andere Nummer weiterleiten koennt. Bedenkt dabei, dass dadurch beide ISDN Leitungen besetzt werden, da der eingehende Anruf von Asterisk auf die neue Rufnummer durchgereicht wird. Auch zu beachten ist, dass ihr fuer den rausgehenden Anruf von Asterisk bezahlen muesst. Diese Rufumleitung kostet also wie ein normaler Anruf nach draussen.
Um nun Asterisk beizubringen, dass ein Anruf weitergeleitet werden soll, muessen wir nur die extensions.conf folgender massen aussehen lassen:
Dies alles kennt ihr schon. Das einzig neue ist diese Zeile: "exten => 1234567,4,Dial(Zap/g1/3456789,15)". Diese besagt, dass 15 Sekunden versucht werden soll, den Anruf an die Nummer 3456789 weiterzuleiten. Sollte es nach 15 Sekunden nicht geklappt haben, wird weiter mit der naechsten Zeile gemacht. Eigentlich ganz Simpel. Zap/g1 ist einfach nur der Type des Interfaces, welches benutzt wird (und welches). Die Syntax hierfuer lautet:
Ein Problem was sich einstellt, wenn man Asterisk ueber den ISDN Anschluss raustelefonieren laesst, ist die Rufnummer. Welche Rufnummer wird auf dem Display des "gegenuebers" angezeigt? Wenn man die vorher erwaehnte Konfiguration benutzt, wird die erste MSN Nummer benutzt. In meinem Fall will ich diese aber nicht verwenden. Also muessen wir die Konfiguration noch einmal bearbeiten, damit auch die richtige MSN Nummer verwendet wird.
Durch die Zeile "exten => 1234567,3,SetCallerID(1234567)" wird die Anrufnummer, die verwendet wird, auf die Nummer "1234567" gesetzt. Nun erscheint auf dem Display der angerufenen Nummer, diese Rufnummer.
Hier zeige ich alles, was nicht mehr zu einem eigentlichen Tutorial gehoert. Zum Beispiel Tipps und Tricks zu Asterisk oder kleinere Skripte von mir, die das Konfigurieren oder Benutzen vereinfachen sollen.
Da sich mein Zeitablaufplan am Tag auch mal aendert und deshalb der normale Asterisk Betrieb mit einem zeitgesteuerten DialPlan auch mal aussetzen muss, habe ich ein Skript entwickelt, welches uns Asterisk nach von uns vorgegebenen Konfigurationsdateien veraendert. Einfach gesagt, gibt es uns eine Auswahl von Moeglichkeiten die wir mit der Eingabe von 1-4 benutzen koennen. Es kopiert dann das jeweilige Template der Konfigurationsdatei an die Stelle der richtigen Konfigurationsdatei und laesst Asterisk neu laden.
Als Voraussetzung fuer dieses Skript benoetigt ihr das Paket "beep" aus dem Debian repository und die von dem Skript benutzten 4 Template Konfigurationsdateien. Wir installieren nun das Paket "beep".
h3rmes:~# apt-get install beep
Wofuer brauchen wir "beep" eigentlich? Ganz einfach, "beep" spricht unseren PC Speaker an und gibt Toene aus. Da mein Asterisk Rechner ohne Bildschirm laeuft und ich keinen zur Verfuegung habe den ich daran anschliessen koennte und auch keine Lust staendig via SSH mich zu verbinden, muss ich mir akustisch mitteilen lassen, ob ein Fehler passiert ist (falsche Eingabe) oder welche Konfiguration nun verwendet wird. Dies funktioniert ganz einfach, bei einer falschen Eingabe wird ein tieferer und laengerer Ton ausgegeben und bei einer richtigen Eingabe, wird ein hoeherer kuerzerer Ton ausgegeben. Je nachdem welche Ziffer wir eingegeben haben (1-4), wird uns auch 1-4 mal der gleiche Ton hintereinander ausgegeben, damit wir wissen welche Konfiguration verwendet wird. Zusaetzlich dazu, wird noch eine eMail an den Nutzer root geschickt, welche uns auch sagt, welche Konfigurationsdatei verwendet wird.
Bevor wir allerdings das Skript benutzen koennen, muessen wir uns die 4 Template Konfigurationsdateien erstellen, die wir benoetigen. Dazu erstellen wir in dem Ordner /etc/asterisk die 4 Dateien.
Diese 4 Templates muesst ihr natuerlich nach euren Beduerfnissen anpassen.
Das Skript laeuft in einer Endlosschleife und ist dauerhaft auf meiner Konsole aktiv. Ich habe diese kleine Numpad Tastatur an dem Asterisk Rechner angeschlossen.
Damit ich eben schnell via Tastendruck die Konfigurationsdatei aendern lassen kann.
Als kleiner Tipp noch bemerkt, damit ihr fuer das Skript keine root Konsole dauerhaft offen halten muesst, solltet ihr es als normaler User mit sudo ausfuehren. Dadurch hat das Skript alle Rechte die es braucht und sollte jemand an die Konsole dran gehen, hat dieser nur eingeschraenkte User Rechte.