Monitoring Nagios d’un compte SMS OVH

février 27, 2015  |   Actualités,Blog   |     |   0 commentaire

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/

ovh1Entrez les informations de connexion OVH, un nom puis une description pour l’application cible. Nous obtenons alors les éléments suivants :

ovh2

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

ovh3

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/