13 sept. 2009 15:10
Envoyer des SMS depuis Nagios en utilisant l'API SMS d'Orange
Catégories : Développement - un commentaire - aucun rétrolien - une annexe
Ce tutoriel explique comment configurer Nagios pour utiliser l'API d'envoi de SMS d'Orange. En pré-requis, je suppose que Nagios est déjà installé et que vous connaissez le fonctionnement des fichiers de configuration de Nagios (je ne détaille pas les chemins vers les fichiers de configuration car ils dépendent de votre distribution et de votre personnalisation).
Etape 1 : création d'un compte Orange Partner et récupération de votre "API key"
Tout est expliqué sur le site Orange Partner à 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 !

Commentaires
Bonjour Hervé,
avez-vous déjà testé AlarmTILT pour Nagios? Au-delà d'un envoi de SMS, vous pouvez mettre en place des méthodes d'appels en cascade jusqu'à acquittement d'appel, en mélangeant les médias (email, sms, vocal text-to-speech).
AlarmTILT fonctionne en mode SaaS et CaaS (Software and Connectivity as a Service). La bi-directionnalité du système permet d'inclure des collègues dans les procédures d'alertes, lorsque l'un d'entre eux acquitte un appel ou SMS, les autres sont automatiquement informés.
Pas de script, juste un agent Java à télécharger. Cet agent transmet les événements Nagios (les downs et les ups) via connexion IP sécurisée et encryptée. L' agent est lui-même supervisé à distance via méthode "signe de vie", vous serez alerté selon vos procédures en cas de non-réceptuion du signe de vie.
C'est gratuit (à part les communications), merci de tester et de me revenir avec votre retour d'expérience.
Alex
M-PLIFY, créateur AlarmTILT