Loin de Nagios et de ses innombrables possibilités, voici un script bash minimaliste pour tester la disponibilité d'une machine ou plusieurs machines via un ping et recevoir, en cas de non réponse, les alertes par SMS[1] et/ou mail. Le principe est le suivant :

  • on teste toutes les X minutes la disponibilité des hôtes
  • si une machine est détectée down, on le note dans un fichier temporaire
  • si 5 minutes après la machine est toujours down, on lance les alertes
  • quand la machine est de nouveau up, on renvoi un mail (pas de SMS dans ce cas)

Pour configurer le script, il suffit de préciser les variables commentées au début du fichier.

#!/bin/bash

# pingTest par Yves et Thierry
# http://www.grafactory.net/blog/
# 2008 / Licence LGPL

# les hotes a tester
HOSTS="domain.tld autredomaine.tld"

# sujets des mails
SUBJECT="machine down"
SUBJECT_UP="machine up"

# envoyer un SMS via tm4b.com
EMAILID="moi@domain.tld"
TELID="XXXXX"
PASSWD="XXXXX"

# envoyer un simple mail
EMAILSIMPLE="moi@domain.tld"

# nombre test
COUNT=4

for myHost in $HOSTS
do
    if ! ping -q -c $COUNT $myHost >> /dev/null
    # elle est KO
    then
        if [ ! -f /tmp/mail.$myHost ]
        # on n est pas encore au courant
        then
            if [ -f /tmp/ping.$myHost ]
                # elle etait KO cinq minutes avant, faut prevenir
            then
                # envoyer un SMS
                echo "To - $TELID\nFrom - $TELID\nMessage - La machine $myHost ne repond plus a $(date)\nPassword - $PASSWD" |\
                mail -s "[$myHost] $SUBJECT" $EMAILID
                # envoyer un mail normal
                echo "La machine $myHost ne repond plus a $(date)" |\
                mail -s "[$myHost] $SUBJECT" $EMAILSIMPLE
                #  creer le fichier pour indiquer que le mail a ete envoye
                touch /tmp/mail.$myHost
            fi
            touch /tmp/ping.$myHost
        fi
    else
        # elle n est pas KO
        if [ -f /tmp/ping.$myHost ]
        then
            rm /tmp/ping.$myHost
        fi
        if [ -f /tmp/mail.$myHost ]
        then
            rm /tmp/mail.$myHost
            # renvoyer un mail
            echo "La machine $myHost repond a nouveau a $(date)" |\
            mail -s "[$myHost] $SUBJECT_UP" $EMAILSIMPLE
        fi
    fi
done

Dans la crontab, on ajoute la ligne suivante (ici, un test toute les 5 minutes).

# faire un test de ping toutes les 5 min
*/5 * * * * /usr/local/sbin/pingtest >> /dev/null

(on suppose donc ici que le script est installé dans /usr/local/sbin/)

Toutes les améliorations sont les bienvenues ;)

Notes

[1] Pour recevoir les alertes par SMS, j'utilise le service Email to SMS de TM4B . Les SMS peuvent être de prépayés via PayPal à un tarif très intéressant. Cette société propose aussi un API très complet pour l'envoi de SMS depuis un programme, un site Web...