Monitoring Nagios d’un compte SMS OVH
Introduction
Nous utilisons les SMS avec Nagios pour être notifié par téléphone en cas d’incident majeur sur notre infrastructure. De ce fait, notre crédit chez notre fournisseur s’amenuise petit à petit et nous devons le surveiller afin de ne jamais être à court de crédit.
Par le biais de cet article nous allons voir comment utiliser les API OVH afin de monitorer certains services associés à notre compte. Dans cet exemple, nous allons voir comment surveiller, via Nagios, où en est notre crédit SMS afin d’être avertis s’il atteint un seuil plancher préalablement paramétré.
Création des clés
La première étape consiste à créer les clés qui seront utilisées pour l’authentification lors de l’accès à l’API. Dans un premier temps, connectez vous à : https://eu.api.ovh.com/createApp/
Entrez les informations de connexion OVH, un nom puis une description pour l’application cible. Nous obtenons alors les éléments suivants :
De ces clés, il faudra, à l’étape suivante, dériver le token d’authentification utilisé par le script.
Récupération du token
Le token obtenu à cette étape permet de restreindre le périmètre d’utilisation du compte.
Dans notre cas, nous voulons monitorer le solde de SMS disponible sur le compte OVH afin de pouvoir le recharger avant d’être en rupture de stock. Nous avons donc besoin d’un accès en lecture seule sur l’API “/sms”. (La liste des API est disponible au lien [3])
Nous allons donc générer cette requête :
$ curl -XPOST -H"X-Ovh-Application: ywThTQ80T9VYz3UH" -H "Content-type: application/json" \ https://eu.api.ovh.com/1.0/auth/credential -d '{ "accessRules": [ { "method": "GET", "path": "/sms/*" } ], "redirection":"https://www.randco.fr/" }'
Et nous recevons alors en retour une réponse du type :
{"validationUrl":"https://eu.api.ovh.com/auth/?credentialToken=tKaOUlKN3FwXNsShPxJAvBPO0jhSQ82Di1bgWCCb8rbDxd2huUA3zTSSE5zUzwDC","consumerKey":"Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv","state":"pendingValidation"}
Cette réponse contient donc 2 éléments cruciaux :
- Un lien de validation du token (qui est toujours en attente de validation)
- Une nouvelle clé (la consumerKey)
Activation du token
A ce stade nous allons lier le token à un compte OVH.
C’est l’étape finale qui permet d’activer le token. Pour cela, il faut visiter la validationUrl et entrer le login et le mot de passe OVH du compte auquel nous voulons accéder. Nous pouvons également sélectionner la durée de validité du token.
Dans notre cas :
https://eu.api.ovh.com/auth/?credentialToken=tKaOUlKN3FwXNsShPxJAvBPO0jhSQ82Di1bgWCCb8rbDxd2huUA3zTSSE5zUzwDC
Une fois ce formulaire rempli, une redirection automatique s’effectue sur la page renseignée lors de la demande de token dans le champ redirection. Nous sommes alors en possession de tous les éléments afin d’effectuer un appel à l’API OVH.
Signer ses appels à l’API
Afin que notre appel à l’API soit authentifié, il faut le signer grâce à un hash.
C’est la partie la plus délicate de la procédure. OVH impose un calcul prenant en compte les clés fournies par OVH, la requête, la méthode et un timestamp, afin d’éviter les rejeux.
La formule est la suivante :
"$1$" + SHA1_HEX(AppSecret+CustKey+METHOD+QUERY+BODY+TSTAMP)
Pour le timestamp, OVH donne la possibilité de le récupérer ici : https://eu.api.ovh.com/1.0/auth/time
Il nous reste donc à définir les autres champs :
- AppSecret : mAZfP2QxeM6QaPCOP7sfhgQQCIcXel15
- CustKey : Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv
- Method : GET
- Query : https://eu.api.ovh.com/1.0/sms/[nom du service sms]
- Body : on le laissera vide car nous n’avons pas de données à envoyer
- Tstamp : le timestamp (la valeur récupérée sur le site de OVH par exemple)
Notre signature sera donc (avant hashage) :
mAZfP2QxeM6QaPCOP7sfhgQQCIcXel15+Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv+GET+https://eu.api.ovh.com/1.0/sms/sms-fcxxxxx-1++1419266551
Une fois la chaine générée nous pouvons la hasher grâce à une fonction SHA1, ce qui nous donne :
$ echo "mAZfP2QxeM6QaPCOP7sfhgQQCIcXel15+Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv+GET+https://eu.api.ovh.com/1.0/sms/sms-fcxxxxx-1++1419266551" | shasum 8ec6f118316f275cfda28fb2c1b601f4460202bd -
Il suffit donc d’ajouter le “$1$” devant pour obtenir la signature complète :
$1$8ec6f118316f275cfda28fb2c1b601f4460202bd
Maintenant que nous avons la signature, nous pouvons effectuer notre appel à l’API :
# curl -H 'X-Ovh-Application:ywThTQ80T9VYz3UH' \ -H 'X-Ovh-Timestamp:1419266551' \ -H 'X-Ovh-Signature:$1$8ec6f118316f275cfda28fb2c1b601f4460202bd' \ -H 'X-Ovh-Consumer:Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv' \ "https://eu.api.ovh.com/1.0/sms/sms-fcxxxxx-1/" {"smsResponse":{"text":"","cgiUrl":"","trackingOptions":[],"trackingDefaultSmsSender":"","responseType":"none"},"status":"enable","creditsLeft":150,"name":"sms-fcxxxxx-1","userQuantityWithQuota":0,"description":"","callBack":"","creditThresholdForAutomaticRecredit":0,"creditsHoldByQuota":0,"automaticRecreditAmount":null,"templates":{"customizedEmailMode":false,"emailBody":null,"customizedSmsMode":false,"emailSubject":null,"smsBody":null,"emailFrom":null}}
Le champ de la réponse qui nous intéresse est donc : “creditsLeft:150”
Réaliser un script pour Nagios
Maintenant que nos appels à l’API OVH fonctionne, nous allons faire un script Nagios (en bash) qui va faire les calculs du hash et les appels à notre place.
La première partie du script consistera au calcul du hash, la seconde partie à l’exécution de l’appel à l’API (avec le parsing de la réponse) et la dernière à comparaison de la valeur retournée avec le seuil et la détermination de la valeur de retour Nagios (0 : OK et 2 : CRITICAL).
#!/bin/bash # Premiere partie threshold="$1" serviceName="$2" timestamp=$(curl https://eu.api.ovh.com/1.0/auth/time 2>/dev/null) applicationKey="ywThTQ80T9VYz3UH'" consumerKey="Tsa4A9Ujzr7IbwA8qw13YJFHMTnc6mAv" applicationSecret="mAZfP2QxeM6QaPCOP7sfhgQQCIcXel15" apiUrl="https://eu.api.ovh.com/1.0/sms/$serviceName/" sha1=$(echo -n "$applicationSecret+$consumerKey+GET+$apiUrl++$timestamp" | sha1) # Seconde partie smsLeft=$(curl -H 'X-Ovh-Application:'$applicationKey \ -H 'X-Ovh-Timestamp:'$timestamp \ -H 'X-Ovh-Signature:$1$'$sha1 \ -H 'X-Ovh-Consumer:'$consumerKey \ "https://eu.api.ovh.com/1.0/sms/sms-fcxxxxx-1/" 2> /dev/null | cut -d ',' -f 7 | cut -d ':' -f 2 | cut -d '.' -f 1) # Troisieme partie if (test $# -eq 0); then echo "Usage: check_ovh_api_sms_credit.sh [threshold] [sms account]"; exit 2; fi if (test $smsLeft -gt $threshold); then echo "OK - $smsLeft left on account $serviceName" exit 0 else echo "CRITICAL - $smsLeft left on account $serviceName" exit 2 fi
Bibliographie
[1] https://www.ovh.com/fr/g934.premiers_pas_avec_lapi
[2] https://nagios-plugins.org/doc/guidelines.html
[3] https://api.ovh.com/console/
Twibow
Plop,
Nice ton script, mais plus d’actualité.
Je l’ai repris et légèrement modifié comme suit (nécessite l’installation du composant JQ :
#!/bin/bash
# Calcul du hash
threshold= »$1″
serviceName= »$2″
timestamp=$(curl https://eu.api.ovh.com/1.0/auth/time 2>/dev/null)
applicationKey= »xxxxAppKeyxxxx »
consumerKey= »xxxCONSUMERKEYxxx »
applicationSecret= »xxxSECRETKeyxxx »
apiUrl= »https://eu.api.ovh.com/1.0/sms/$serviceName/ »
sha1=$(echo -n « $applicationSecret+$consumerKey+GET+$apiUrl++$timestamp » | sha1sum | awk ‘{print $1}’)
# Execution de l’appel a l’API
smsLeft=$(curl -H ‘X-Ovh-Application:’$applicationKey \
-H ‘X-Ovh-Timestamp:’$timestamp \
-H ‘X-Ovh-Signature:$1$’$sha1 \
-H ‘X-Ovh-Consumer:’$consumerKey \
« https://eu.api.ovh.com/1.0/sms/$serviceName/ » 2> /dev/null | jq -r ‘.creditsLeft’ | cut -f1 -d ». »)
# Comparaison du result avec le seuil
if (test $# -eq 0); then echo « Usage: check_ovh_api_sms_credit.sh [threshold] [sms account] »; exit 2; fi
if (test $smsLeft -gt $threshold); then
echo « OK – $smsLeft left on account $serviceName »
exit 0
else
echo « CRITICAL – $smsLeft left on account $serviceName »
exit 2
fi