Etape 1 : création d'un compte Orange Partner et récupération de votre "API key"

Tout est expliqué sur le site des API d'Orange à cette adresse. Notez bien votre "API key" qu'il faudra renseigner dans le script Python fourni à l'étape 2.

Etape 2 : installation du script d'envoi de SMS

La documentation Orange inclut un exemple d'envoi de SMS en PHP. Francois Marx a écrit un article très complet sur Developpez.com, avec des exemples en PHP, Python, Java et VBscript. Je me suis inspiré des quelques lignes en Python pour écrire un script d'envoi de SMS baptisé simplement sms.py.

Téléchargez sms.py sur votre serveur Nagios. Personnalisez le script avec votre API key (ligne 16), puis rendez le exécutable (chmod +x).

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# sms.py
#
# This scripts sends a SMS through Orange SMS API
# It takes the phone number as argument and reads the text message from standard input
#
# (c) Hervé Le Roy
# Licence: GPLv3
 
import re, string, sys, urllib
import xml.etree.ElementTree as ET
 
# Your Orange SMS API key
API_KEY='your_api_key'
 
usage_message = """Usage: echo "" | sms.py 
  is read from stdin to allow piping to the script. Bear in mind text message will be truncated to 160 characters
  must be an international phone number without leading "+" and without any space or dash. Example: 33610203040"""
 
class UsageError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)
 
def sendsms(phone,text):
    urlbase = 'http://sms.beta.orange-api.net/sms/sendSMS.xml?'  # Orange SMS API base URL
    urlparam = urllib.urlencode([('id',API_KEY),('to',phone),('content',text)])
    response = ET.parse(urllib.urlopen(urlbase+urlparam)).getroot()
    return response.findtext('status/status_code')
 
def main(argv=None):
    if argv is None:
        argv = sys.argv
    try:
        # reads phone number (first argument on the command line)
        try:
            phone_number = sys.argv[1]
        except:
            raise UsageError("Missing phone number\n")
 
        # match phone number  against a very simple regex (10 to 14 digits allowed, no other signs)
        if not re.match("\d{10,14}$",phone_number):
            raise UsageError("Incorrect phone number\n")
 
        if not sys.stdin.isatty():
            text_message = sys.stdin.read() # Text message is read from standard input
            text_message = text_message[:159] # Truncate text message to 160 characters
        else:
            raise UsageError("Missing text message (empty stdin)\n")
 
        # sends sms and return response from Orange SMS API
        return sendsms(phone_number,text_message)
 
    except UsageError, errormsg:
        print >>sys.stderr, errormsg.value
        print >>sys.stderr, usage_message
        return 2
 
if __name__ == "__main__":
    sys.exit(main())

A ce stade, testez le script depuis la ligne de commande en tapant :

echo "Hello world" | ./sms.py 33610203040

Cela va envoyer "Hello World" au mobile n° 33610203040 (33 est l'indicatif pour la France, 610203040 est le numéro de mobile sans le 0 initial). Une réponse "200" signifie que le SMS a bien été envoyé. Pour la signification des autres codes d'erreurs, consultez la documentation de l'API Orange sur leur site.

Etape 3 : vérification du numéro de téléphone associé au contact recevant les notifications

Vérifiez que vos définitions de contacts dans Nagios contiennent bien un champ pager avec un numéro de téléphone au format international (sans le signe "+", sans espace ni tiret). Rajoutez les commandes de notification notify-service-by-sms et notify-host-by-sms comme dans l'exemple ci-dessous.

define contact{
contact_name                    hleroy
alias                           Root
service_notification_period     24x7
host_notification_period        24x7
service_notification_options    w,u,c,r
host_notification_options       d,r
service_notification_commands   notify-service-by-email,notify-service-by-sms
host_notification_commands      notify-host-by-email,notify-host-by-sms
email                           email@domain.com
pager                           33610203040
}

Etape 4 :ajout des commandes d'envoi de SMS

Editez votre configuration Nagios pour rajouter les commandes suivantes (pensez à personnaliser le chemin d'installation de sms.py) :

# 'notify-service-by-sms' command definition
define command{
        command_name    notify-service-by-sms
        command_line    /usr/bin/printf "%b" "$NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" | /home/hleroy/scripts/misc/sms.py $CONTACTPAGER$
        }

# 'notify-host-by-sms' command definition
define command{
        command_name    notify-host-by-sms
        command_line /usr/bin/printf "%b" "Host $HOSTSTATE$ alert for $HOSTNAME$" | /home/hleroy/scripts/misc/sms.py $CONTACTPAGER$
        }

Etape 5 :testez !

Rechargez la configuration de Nagios (sudo /etc/init.d/nagios3 reload). Arrêtez un des services que vous supervisez avec Nagios et surveillez votre téléphone portable. Si vous recevez l'email de notification, mais pas le SMS, vérifiez les étapes 3 et 4.

Attention : lors de la création du compte Orange Partner, vous avez 200 crédits d'offerts (ce qui correspond à l'envoi de 20 SMS). Pensez à alimenter votre compte régulièrement si vos services tombent en panne ;-)

Bonne supervision !