Provya

Sécurité et téléphonie

Articles & Tutoriaux  -  Liens & Actualités

[Asterisk] Superviser son service

icon 10/06/2014

Un service Asterisk qui tombe, ça peut arriver. C'est la panne et il faut le relancer.

Nous proposons un script shell qui s'occupe de vérifier à intervalle régulier l'état du service Asterisk. Si le service est DOWN, celui-ci est relancé et un e-mail d'alerte est envoyé.

Vérifier l'état du service

Une première solution peut consister à s'assurer que le service soit bien lancé. Cela s'opère depuis la commande suivante :
myserver# ps ax | grep 'asterisk

Si le service Asterisk tourne, il nous est retourné quelque chose comme :
12039 ?        Ssl    7:13 /usr/sbin/asterisk

De notre expérience, cette vérification ne suffit pas : nous avons déjà rencontré des services Asterisk qui était lancé (service UP), mais qui était en défaut de fonctionnement (impossible de connecter à la console, impossible d'enregistrer un peer, etc.).
Pour cette raison, nous préférons utiliser la commande suivante qui a pour intérêt de se connecter à la console Asterisk :
asterisk -rx 'test'

Si le service Asterisk est démarré et pleinement fonctionnel, le message suivant est retourné :
No such command 'test' (type 'core show help test' for other possible commands)

Si le service est arrêté ou qu'il ne répond plus, nous recevrons le message suivant :
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)


On script !
On crée un script shell qui vérifie si le service Asterisk est OK ou KO :

#!/bin/bash
#
# Commande Asterisk
testAsterisk=$(asterisk -rx 'test')

# On compte le nombre de caractères retournés
nombre=${#testAsterisk}
case $nombre in
        81)
                #Asterisk OUT, on le redémarre
                /etc/init.d/asterisk restart
                ;;
        79)
                #Asterisk est OK
                ;;
esac

Ce script pose néanmoins deux problèmes :

  1. Que se passe-t-il si Asterisk retourne autre chose que l'un des deux messages prévus ?
  2. Il peut être intéressant d'être prévenu par e-mail !

On améliore donc tout ça...


Script final
On ajoute la possibilité que le message retourné puisse être autre chose que ceux prévus. On alerte par e-mail :
#!/bin/bash
#
# Fonctionnement :
# Vérification de l'état du service Asterisk - toutes les minutes (job cron)
# 1) Asterisk est KO : on redémarre et on envoie un e-mail au support
# 2) Asterisk est OK : on ne fait rien...
# 3) On ne sait pas : on envoie un e-mail au support

# Commande Asterisk
testAsterisk=$(asterisk -rx 'test')

# On compte le nombre de caractères retournés
nombre=${#testAsterisk}
case $nombre in
        81)
                #Asterisk OUT, on le redémarre
                /etc/init.d/asterisk restart

                SUBJECT="[URGENT] Serveur Asterisk KO"
                EMAIL="support@example.com, john.doe@example.com, paul.smith@example.com"
                EMAILMESSAGE="/tmp/emailmessage.txt"
                echo "Le service Asterisk est KO" > $EMAILMESSAGE
                echo "Il vient d'être redémarré automatiquement..." >> $EMAILMESSAGE
                echo "Merci de vérifier !" >> $EMAILMESSAGE
                echo "Bonne journée" >> $EMAILMESSAGE
                echo "--" >> $EMAILMESSAGE
                echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE
                echo $testAsterisk >> $EMAILMESSAGE
                mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
                ;;
        79)
                #Asterisk est OK
                ;;
        *)
                #Retour inattendu
                SUBJECT="Serveur Asterisk -> État inconnu"
                EMAIL="support@example.com"
                EMAILMESSAGE="/tmp/emailmessage.txt"
                echo "L'état du service Asterisk n'est pas connu." > $EMAILMESSAGE
                echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE
                echo $testAsterisk >> $EMAILMESSAGE
                echo "Bonne journée" >> $EMAILMESSAGE
                mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
                ;;
esac

On automatise l'exécution de ce script
On édite le fichier /etc/crontab pour y ajouter les lignes suivantes :
# Verifie que le service Asterisk soit bien OK - toutes les minutes
* * * * *       root /home/supervision/verifAsteriskStart.sh > /dev/null 2> /dev/null


Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous

Nouveau : découvrez nos firewall Gbps full-SSD pour pfSense 2.4+

       

store.provya.fr

icon Tags de l'article :

3 commentaires

stephane Thomas - 17/09/2014 à 18:27:53

Merci très beaucoup pour cet exposé. Continuez.

super boulot! rien à dire

@répondre #lien

Mireille - 17/09/2014 à 18:28:33

On en veut davantage traité de cette manière. Sympa.

excellent travail

@répondre #lien

Monel - 08/06/2015 à 15:53:45

Peu au fait du sujet, je vérifie assez peu mes services donc merci pour ce script très ingénieux.

@répondre #lien

icon Flux RSS des commentaires de cet article