Nagios Sprachmeldungen mit SIP

NagiosUnter bestimmten Umständen ist es besser Nagios Meldungen per Telefonanruf zu erhalten. Vor allem in Zeiten von Telefonflatrates ist eine Meldung so günstiger als eine SMS. Damit dies unter Linux funktioniert, können einige freie Anwendungen zu einem einfachen Shell Script kombiniert werden, die genau diesen Zweck erfüllen. Zur Einrichtung benötigt man linphonec für den Aufbau des Telefonats, Expect zur Steuerung von linphonec und text2wave vom festival Paket für die Sprachsynthese.

Installation unter Debian

Die Installation unter Debian gestalltet sich wie immer mit apt recht komfortabel und einfach.

apt-get install expect festival linphonec-nox

Linphonec

linphonec ist ein freier Kommandozeilen-Client für das SIP Protokoll. Nach der Installation muss man noch eine funktionierende Konfigurationsdatei erstellen.

Beispielkonfiguration linphonec für sipgate

natürlich kann hier ein beliebiger Provider verwendet werden. Auch die Anbindung an einen eigenen SIP Server ist problemlos möglich.

[net]
con_type=3
use_nat=1
nat_address=
download_bw=0
upload_bw=0
firewall_policy=2
stun_server=stun.sipgate.net:10000
 
[sip]
username=
hostname=sipgate.de
sip_port=5060
use_registrar=1
as_proxy=0
expires=900
registrar=sip:sipgate.de
passwd=
addr_of_rec=sip:@sipgate.de
guess_hostname=1
contact=sip:@sipgate.de
inc_timeout=15
use_info=0
use_ipv6=0
default_proxy=-1
 
[rtp]
audio_rtp_port=5004
video_rtp_port=9078
audio_jitt_comp=60
video_jitt_comp=60
 
[sound]
dev_id=2
rec_lev=100
play_lev=80
source=m
local_ring=/usr/share/sounds/linphone/rings/oldphone.wav
remote_ring=/usr/share/sounds/linphone/ringback.wav
playback_dev_id=ALSA: default device
ringer_dev_id=ALSA: default device
capture_dev_id=ALSA: default device
echocancelation=0
 
[video]
enabled=0
show_local=0
display=0
capture=0
 
[audio_codec_0]
mime=PCMU
rate=8000
enabled=1
 
[audio_codec_1]
mime=GSM
rate=8000
enabled=1
 
[audio_codec_2]
mime=PCMA
rate=8000
enabled=1
 
[audio_codec_3]
mime=speex
rate=8000
enabled=1
 
[audio_codec_4]
mime=speex
rate=16000
enabled=1
 
[audio_codec_5]
mime=1015
rate=8000
enabled=1
 
[address_book]
entry_count=0
 
[video_codec_0]
mime=theora
rate=90000
enabled=1
 
[video_codec_1]
mime=H263-1998
rate=90000
enabled=1
 
[video_codec_2]
mime=MP4V-ES
rate=90000
enabled=1
 
[video_codec_3]
mime=x-snow
rate=90000
enabled=1
 
[auth_info_0]
username=
passwd=
realm="sipgate.de"

Die fertige Konfigurationsdatei speichert man an einem Ort, der später für den Nagios Benutzer erreichbar und lesbar ist.

sip-talk shell script

Das folgende shell script sip-talk übernimmt die Anfragen von Nagios und erzeugt eine entsprechende Sprachnachricht, die mit Hilfe von linphhonec an eine Telefonnummer übertragen wird.

#!/bin/bash
# sip-talk - send a voice message
# 12.01.2009 fk@kworx.de
 
# config
SIPREALM=sipgate.de		# used for uri sip:
@SIPREALM
LINPHONERC=./.linphonerc	# path to linphonerc
CALLDURATION=60			# max call duration in seconds
TMPDIR=/var/tmp
LINPHONEC=/usr/bin/linphonec
EXPECT=/usr/bin/expect
TEXT2WAVE=/usr/bin/text2wave
# end config
 
function usage(){
	echo "usage: $0 -r -m \"<message>\""
	exit 1
}
 
if [ $# -lt 2 ]; then
	usage
fi
 
while getopts "r:m:" OPTION; do
	case $OPTION in
		r)
			RECIPIENT="sip:$OPTARG@$SIPREALM"
		;;
		m)
			MESSAGE="$OPTARG"
		;;
		*)
			usage
		;;
 
	esac
done
 
# check values
if [ "$RECIPIENT" = "" ]; then
	usage
fi
if [ "$MESSAGE" = "" ]; then
	usage
fi
# check binaries
if [ ! -x "$LINPHONEC" ]; then
	echo "$LINPHONEC not found!"
	exit 1
fi
if [ ! -f "$LINPHONERC" ]; then
	echo "$LINPHONERC not found!"
	exit 1
fi
if [ ! -x "$EXPECT" ]; then
	echo "$EXPECT not found!"
	exit 1
fi
if [ ! -x "$TEXT2WAVE" ]; then
	echo "$TEXT2WAVE not found!"
	exit 1
fi
 
DATE=`date +%y%m%d%k%M|sed 's/ /0/'`
# generate message
MSGWAV=$TMPDIR/$DATE.$RANDOM.wav
 
$TEXT2WAVE -o $MSGWAV -f 8000 << EOF
$MESSAGE
EOF
# execute linphonec
while [ -f $TMPDIR/linphonec ]; do
        sleep 10
done
touch $TMPDIR/linphonec
$EXPECT << EOF 
spawn $LINPHONEC -c $LINPHONERC 
expect "linphonec> " {send "soundcard use files\r"}
expect "linphonec> "
sleep 5
send "call $RECIPIENT\r"
expect "linphonec>; Connected."
sleep 1
send "play $MSGWAV\r"
sleep $CALLDURATION
send "quit\r"
EOF
 
# cleanup
rm -f $MSGWAV
rm -f $TMPDIR/linphonec

Nagios Konfiguration

In der Nagios Konfiguration müssen noch die Kommandos für die Benachrichtigungen(notifications.cfg) angelegt bzw. konfiguriert werden.
Danach können notify-by-voice und host-notify-by-voice wie gewohnt in der Konfiguration genutzt werden.

define command{
        command_name    notify-by-voice
        command_line
 -r $CONTACTPAGER$ \
           -m '"Service: $SERVICEDESC$ Host: $HOSTNAME$ Address: $HOSTADDRESS$ State: $SERVICESTATE$ Info: $SERVICEOUTPUT$ Date: $LONGDATETIME$"'
        }
 
define command{
        command_name    host-notify-by-voice
        command_line
 -r $CONTACTPAGER$ \
           -m '"$NOTIFICATIONTYPE$: $HOSTNAME$ is $HOSTSTATE$ Info: $HOSTOUTPUT$ Time: $LONGDATETIME$"'
        }

5 Gedanken zu „Nagios Sprachmeldungen mit SIP“

  1. Hi kworx,

    Das Skript hat mir verdammt viel geholfen,
    allerdings musste ich bei der notifications.cfg noch ’sip-talk‘ bei command_line einfügen.

    Was ich bei mir noch angepasst habe ist

    touch $TMPDIR/linphonec
    /usr/bin/expect < set timeout $CALLDURATION
    $EXPECT <; terminated.“
    timeout
    }

    Was bewirken sollte (scheint zumindest so) dass wenn der Angerufene auflegt nagios den nächsten Anruf tätigen könnte während gleichzeitig nach den 60 Sekunden das Gespräch automatisch beendet wird.

    Gruß,
    Robert

  2. hm,
    da ich offensichtlich zu blöd zum richtigen Kommentieren bin hier der ganze Code-Abschnitt den ich meine ^^;

    touch $TMPDIR/linphonec
    /usr/bin/expect < set timeout 60
    $EXPECT < “ {send „soundcard use files\r“}
    expect „linphonec> “
    sleep 5
    send „call $RECIPIENT\r“
    expect „linphonec>; Connected.“
    sleep 1
    send „play $MSGWAV\r“
    expect {
    „linphonec>; terminated.“
    timeout
    }
    sleep 5
    send „quit\r“
    EOF

  3. Prima Script, das mir in der Vergangenheit schon sehr geholfen hat. Nun aber ein Problem: ich bin von Ubuntu 10.04LTS auf 12.04LTS umgestiegen. Nach dem Start des Skripts werden die send-Befehle im EXPECT-Abschnitt nur sehr langsam gesendet. Auf der Konsole sehe ich im Sekundenabschnitt einen Buchstaben nach dem anderen folgen. Beim Ausführen von „send „call $RECIPIENT\r““ ist nach dem ersten Digits Schluss und nichts passiert mehr.

    ich vermute, dass das Problem mit der aktuellen Version von linphonec (3.3.2) zusammenhängt, denn in der alten Ubuntu-Version funktionierte es noch.

    # ./call_out.sh -r 0******** -m „TEST“
    spawn /usr/bin/linphonec -c ./linphone.cfg
    ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 0
    ALSA lib control.c:951:(snd_ctl_open_noupdate) Invalid CTL default:0
    Ready
    Warning: video is disabled in linphonec, use -V or -C or -D to enable.
    linphonec> soundcard use files
    Using wav files instead of soundcard.
    linphonec> call sip:0

    Über einen Tipp würde ich mich sehr freuen.

    Gruß
    Peter

  4. Scheint mir eher ein expect Problem zu sein.

    Funktioniert linphonec bei manueller Ausführung?

    linphonec -c LINPHONERC

    Danach beim linphone Prompt:

    soundcard use files
    call sip:NUMMER@PROVIDER

    Wenn es klingelt, dran gehen und ein beliebiges WAV abspielen:

    play /PFAD/WAV

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.