Nagios und Asterisk (Nagios lernt sprechen)

by tuhlmann on March 1, 2006 Posted in News,Programming

Da wir ja bei uns eine Asterisk-Telefonanlage im Einsatz haben (Hint: wir verkaufen die auch!) und außerdem ein Nagios-Monitoringsystem (NMS: Network Management System), lag die Idee ja nahe, Nagios über Asterisk reden zu lassen.
Dazu habe ich folgendes gemacht: Im Nagios ein neues Kommando notify-by-asterisk angelegt, dass im entsprechenden Kontakt angegeben wird. Das Kommando selbst ist recht simpel:

# 'notify-by-asterisk' command definition
define command{
command_name    notify-by-asterisk
command_line    /usr/local/nagios/bin/asterisk_call.sh $NOTIFICATIONTYPE$ $SERVICEDESC$
$HOSTALIAS$ $SERVICESTATE$ $SERVICEOUTPUT$
}

Das Skript asterisk_call.sh ist ein einfaches Shellskript, das zuerst einen Textstring erzeugt, diesen dann durch Festival jagt (erzeugt eine Wav-Datei) und anschließend eine Asterisk-Call-Datei erzeugt, die dann in das outgoing-Verzeichnis von Asterisk kopiert wird. Asterisk nimmt die Datei, generiert einen Anruf und spielt die wav-Datei ab.

103-0391_img.jpg

Die Lösung funktioniert auf unserem System. Damit sie auch woanders läuft müssen noch ein paar Einstellungen vorgenommen werden:

  • visudo ausführen: Der Nagios-User (bei mir: nagios) braucht das Recht, eine Datei als User www-data (unter dem läuft Asterisk bei mir. Ist der Web-User weil ich zusätzlich noch AMP im Einsatz habe und hier gibt es Rechtekonflikte, wenn AMP als Webapplikation nicht auf die Asteriskdateien zugreifen darf.) in das Asterisk outgoing-Verzeichnis (/var/spool/asterisk/outgoing) zu dürfen:
  • nagios   ALL = (www-data NOPASSWD:) /bin/cp
  • Die Datei asterisk_call.sh anpassen und für nagios ausführbar in /usr/local/nagios/bin (oder woanders, dann aber das Nagios-Kommando anpassen) zur Verfügung stellen:
#!/bin/sh
NOTIFICATIONTYPE=$1
SERVICEDESC=$2
HOSTALIAS=$3
SERVICESTATE=$4
SERVICEOUTPUT=$5
OUT_STR=`/usr/bin/printf "%b" "This is the Nagios Monitoring System sending a \
$NOTIFICATIONTYPE notification. The Service $SERVICEDESC at host $HOSTALIAS \
is in state $SERVICESTATE. This is the service output: $SERVICEOUTPUT."`
play_file="/tmp/asterisk_nagios"
bf="$play_file.wav"
cf="$play_file.call"
lf="$play_file.log"
CHANNEL="SIP/(peer)/(no to dial)"
CALLER_ID="Nagios "

echo "$OUT_STR" > $lf

echo "$OUT_STR" | /usr/bin/text2wave -scale 1.5 -F 8000 -o $bf

echo "Channel: $CHANNEL" > $cf
echo "WaitTime: 60" >> $cf
echo "MaxRetries: 3" >> $cf
echo "CallerId: $CALLER_ID" >> $cf
echo "Application: Playback" >> $cf
echo "Data: $play_file" >> $cf

sudo -u www-data cp $cf /var/spool/asterisk/outgoing

rm $cf

Das wars. Festival ist nur als englische Version erhältlich (es gibt zwar deutsche Anpassungen, hab ich aber noch nicht ausprobiert), es gibt jedoch unter http://www.cepstral.com sehr gut klingende englische und deutsche Stimmen- die kosten so um die 30$.

Viel Spaß.

{ 4 comments… read them below or add one }

Eisbaeeer December 2, 2008 at 6:16 am

Hi
Gut gemacht. Gleich mit Logfile. Ich haette noch einen Verbesserungsvorschlag:

Jetzt:
sudo -u www-data cp $cf /var/spool/asterisk/outgoing
rm $cf

Besser:
sudo -u www-data mv $cf /var/spool/asterisk/outgoing

Sonst kann es passieren, dass Asterisk die Datei liesst, bevor sie vollstaendig kopiert ist.
Gruesse Eisbaeeer

Torsten December 2, 2008 at 8:17 am

Danke sehr für den Hinweis!

Was passiert, wenn $cf auf einem anderen Mountpoint liegt als /var/spool/asterisk ? Ich nehme an, in diesem Fall wird die Datei ebenfalls erst kopiert und dann gelöscht.

Der sicherste Weg wäre dann wohl so etwas:

sudo -u www-data cp $cf /var/spool/asterisk/outgoing/${cf}.tmp
mv ${cf}.tmp $cf
rm $cf

Damit ist sichergestellt, dass die Datei auf jeden Fall in einem Stück ist, wenn sie von Asterisk gefunden wird.

Torsten.

Eisbaeeer December 2, 2008 at 10:40 am

Sweit ich gelesen habe, ist es Asterisk ganz egal, wie die Datei heisst, die in /var/spool/asterisk/outgoing/ landet.Er versucht diese sofort zu verarbeiten. Also sollte man die tmp-Datei in einem anderen Verzeichnis ablegen und dann per move verschieben.

Ich bin gerade dabei, einen Email to Sprachanruf zu realisieren. Dann kann man eine Email an eine bestimmte Email-Adresse schicken. In der EMailadresse ist die Zielrufnummer enthalten. Mein Script wandelt dann mit txt2pho und mbrola den Text in Sprache um. Weiter soll ein Callfile erzeugt werden. Beides per FTP an Asterisk und der ruft dann die Nummer an.
Mal sehen, wie weit ich heute noch komme.

Grüße EIsbaeeer

Torsten December 2, 2008 at 10:54 am

Sehr interessante Idee!

Ja, Du hast recht, Asterisk nimmt einfach die Dateien, die in dem outgoing-Verzeichnis stehen.

Dann also erstmal sicherstellen, dass die Datei auf dem gleichen Mountpoint liegt und dann nach outgoing verschieben.

Leave a Comment

Previous post:

Next post:

design by rowboat media using thesis