Christophe Nowicki

December 9, 2009

Notifications Nagios par Téléphone

J’ai configuré mon instance de Nagios pour recevoir une notification par téléphone en cas d’incident. (déclenchement d’une alarme ou d’un détecteur d’eau / fumée dans mon installation domotique).

Ce billet décrit comment mettre en place un système de la notification par téléphone avec Nagios.

Pré-requis

Vous avez besoin des composants suivants :

  • Une distribution Debian GNU/Linux ;
  • Une installation fonctionnelle de Nagios ;
  • Une PABX IP avec le support du protocole SIP, comme Asterisk ;
  • Un système de Synthèse vocale fonctionnelle, comme eSpeak + MBROLA ;
  • Un client SIP en ligne de commande comme PJSUA.

Installation

Le client SIP en ligne de commande PJSUA n’est pas disponible dans les paquets du projet Debian.
Il est donc nécessaire de l’installer manuellement à l’aide du classique : configure, make, make install.
La procédure est décrite dans ce billet : Un client SIP en ligne de commande.

Pour l’installation du système de synthèse vocale, vous pouvez vous référer à mon précèdent billet sur le sujet : Text-to-Speech avec eSpeak, MBROLA et Speech Dispatcher.

Configuration

Vous devez créer un compte SIP pour Nagios sur votre PABX et tester que l’enregistrement est fonctionnel.

Pour cela vous avez besoin d’un fichier de configuration spécifique à Nagios pour PJSUA, dans /etc/nagios/sip.cfg par exemple :

--id sip:nagios@pabx.csquad.lan
--registrar sip:pabx.csquad.lan
--realm *
--username nagios
--password secret

Vous pouvez ensuite tester l’enregistrement en ligne de commande :
$ pjsua --config-file /etc/nagios/sip.cfg
...
11:17:05.376 pjsua_acc.c sip:nagios@pabx.csquad.lan: registration success, status=200 (OK), will re-register in 300 seconds

Un appel de test :
$ pjsua --config-file /etc/nagios/sip.cfg --null-audio sip:secretariat@pabx.csquad.lan

Ensuite un appel de test audio avec un message :
$ espeak -v mb/mb-fr1 "E.T. téléphone maison" | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - test.wav
$ pjsua --config-file /etc/nagios/sip.cfg --play-file=test.wav --auto-play --null-audio sip:secretariat@pabx.csquad.lan
$ rm -f test.wav

On met le tout dans un petit script expect pour prendre en charge la déconnections de manière polie :

#!/usr/bin/expect --
set timeout 45
set addr [lindex $argv 0]
set text [lindex $argv 1]
exec /usr/bin/espeak -v mb/mb-fr1 $text | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - /tmp/phone-call.wav;
spawn /usr/local/bin/pjsua --app-log-level=3 --config-file /etc/nagios/sip.cfg --play-file /tmp/phone-call.wav --auto-play --null-audio --max-calls 1 sip:$addr
expect {
"DISCONNCTD" {
exit
}
timeout {
send "h\n"
exit
}
eof {
exit
}
}

Et voilà ;-)

Il ne nous reste plus qu’à configurer ce type de notification dans Nagios.
Pour cela, il faut modifier le fichier contacts.cfg :
# 'nagios-phone' contact definition
define contact{
contact_name nagios-phone
alias Nagios Admin via Phone
service_notification_period 24x7 ; mouahahahahahaha
host_notification_period 24x7 ; moiahahahahahahah
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-by-phone
host_notification_commands host-notify-by-phone
email sip:secretariat@pabx.csquad.lan
}

Puis le fichier misccommands.cfg :
# 'notify-by-phone' personnal command definition
define command{
command_name notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "$NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
# 'host-notify-by-phone' personnal command definition
define command{
command_name host-notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "Host $HOSTSTATE$ alert for $HOSTNAME$!"
}

Ensuite, vous pouvez définir nagios-phone comme un contact pour des services ou hosts.

Il faut aussi modifier la valeur de la variable notification_timeout dans le fichier de configuration nagios.cfg, pour avoir le temps de décrocher le téléphone et d’en tendre le message.

Conclusion

Vous n’avez plus aucune excuse pour ne pas brancher vos esclaves^Wéquipe d’administrateurs systèmes directement sur le système de surveillance de vos serveurs ;-)

Plus sérieusement, la notification par téléphone est une méthode très intrusive. Il est nécessaire de décrocher le téléphone. Il faut donc l’utiliser avec parcimonie.

Filed under: Debian,Network — Tags:, , , — cscm @ 20:39

August 27, 2009

Text-to-Speech avec eSpeak, MBROLA et Speech Dispatcher

Je continue à travailler sur l’ajout de la parole dans mon système domotique.
En ajoutant le support des voix MBROLA, je trouvais le code de mon module xPL, de plus en plus difficile à comprendre.
Et je n’étais pas très satisfait du résultat :

  • le module est spécifique à eSpeak ;
  • le nombre d’arguments à passer en ligne de commande au module devenait trop important.

J’ai donc continué mes recherches dans le domaine est découvert Speech Dispatcher.
Il s’agit d’un daemon réseau qui s’occupe de l’abstraction par rapport aux différents systèmes de Text-to-Speech et met à disposition ces ressources à l’aide d’un protocole unique : SSIP.

Dans cette article, je vais décrie l’installation que j’ai mis en place chez moi.
Pour obtenir un voix en Français de qualité correct et compréhensible sur une distribution Debian GNU/Linux version “Lenny”.

Installation de MBROLA

Vous avez besoin de l’exécutable et des voix du projet MBROLA.
Téléchargeables sur le site du projet au format binaire :

$ wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip
$ unzip mbr301h.zip
$ chmod +x mbrola-linux-i386
# mv mbrola-linux-i386 /usr/local/bin/mbrola
$ mbrola
MBROLA 3.01h - speech synthesizer
Author : Thierry Dutoit with help of AC/DC adaptator Vincent Pagel
Copyright (c) 95 Faculte Polytechnique de Mons (TCTS lab) - T.Dutoit
Email mbrola@tcts.fpms.ac.be to freely subscribe as a user
...

Vous avez ensuite besoin d’une voix :

$ wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr1/fr1-990204.zip
$ unzip fr1-990204.zip
# mkdir /usr/share/mbrola/
# mv fr1 /usr/share/mbrola/

Vous pouvez ensuite tester la sortie à l’aide de la commande suivante :

$ espeak -v mb/mb-fr1 "bonjour, c'est la voix de secret story" | mbrola /usr/share/mbrola/fr1/fr1 - - | aplay -r16000 -fS16

Installation et configuration de Speech Dispatcher

Le programme est directement disponible dans Debian.

# apt-get install speech-dispatcher

Il faut ensuite modifier le fichier de configuration /etc/speech-dispatcher/speechd.conf de la manière suivante :

DefaultLanguage "fr"
DefaultVoiceType "MALE1"
AddModule "espeak-generic" "sd_generic" "espeak-generic.conf"
DefaultModule espeak-generic

Et le fichier /etc/speech-dispatcher/modules/espeak-generic.conf :


GenericExecuteSynth \
"echo \"$DATA\" | espeak -v $VOICE -s $RATE -a $VOLUME -p $PITCH $PUNCT --stdin | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - - | aplay -r16000 -fS16"

Vous pouvez relancer le deamon et vous connecter dessus :

# /etc/init.d/speech-dispatcher restart


$ telnet localhost 6560
SET self CLIENT_name me:and:myself
208 OK CLIENT NAME SET
SPEAK
230 OK RECEIVING DATA
Attention, le frigo est vide
.
225-20
225 OK MESSAGE QUEUED

Références

Voici quelques liens vers des documents intéressants sur le sujet :

Filed under: Debian,Home automation — Tags:, , , — cscm @ 16:41

August 11, 2009

xPL Text-to-Speech module

I’ve wote an Text-to-Speech module for xPL Perl based on eSpeak and the Speech::eSpeak Perl module.

The xPL TTS.BAISC schema is very basic, but suffisent for my text-to-speech needs.

Setup on Debian GNU/Linux

You should install the fallowing packages with apt :
# apt-get install libespeak-dev dh-make-perl espeak-data devscripts

And build the Perl module :
# cd /usr/src
# wget http://search.cpan.org/CPAN/authors/id/H/HG/HGNENG/Speech-eSpeak-0.3.tar.gz
# tar xzf Speech-eSpeak-0.3.tar.gz
# dh-make-perl Speech-eSpeak-0.3
# cd Speech-eSpeak-0.3
# debuild
# dpkg -i dpkg -i ../libspeech-espeak-perl*

Get my source code :
# wget http://www.csquad.org/wp-content/contrib/eSpeak.pm -O /usr/share/perl5/xPL/Dock/eSpeak.pm
# wget http://www.csquad.org/wp-content/contrib/xpl-tts -O /usr/bin/xpl-tts
# chmod +x /usr/bin/xpl-tts

Usage exemples

Launch the xpl-tts program :
$ xpl-tts -espeak-verbose -espeak-voice-language en -espeak-voice-gender 2 -espeak-voice-age 42
Then, send an xpl command on the network :
$ xpl-sender -m xpl-cmnd -c tts.basic speech="xPL rocks everything"

You should hear the synthesized voice.

And Voila ;-)

Bugs and evolutions

I will submit this module to the xpl-perl project and try to implement MBROLA project support. Because I’ve got a more humain voices.

Filed under: Home automation — Tags:, , , — cscm @ 17:17

Powered by WordPress