Utiliser l’API sms de Free

Si vous avez un forfait Free (il est probablement proposé la même chose chez les autres FAI ?), vous avez accès à l’option Notification par SMS (gratuitement pour le moment) dans votre espace client.

Celui-ci permet de s’auto-envoyer un sms via une simple requête POST ou GET. Pour quoi faire ? Les usages sont multiples :

  • s’envoyer un relevé régulier de la température du logement (en couplant la chose avec un petit RaspberryPi par exemple)
  • s’envoyer des rappels réguliers des choses à ne pas oublier
  • recevoir des notifications en cas de problème sur un serveur si l’ont est administrateur système
  • n’importe quoi d’autre.

Me concernant, j’ai été intéressé par la troisième option : je gère plusieurs machines sans avoir nécessairement d’accès au réseau pour pouvoir les surveiller.

J’ai donc rédigé un script m’envoyant un sms pour m’avertir lors de la défaillance de certains services. Il est en bash, c’ets relativement compréhensible :

#!/bin/bash
# Script to send sms using Free API
# Example : monit notifications, backups, alerts...

## VARIABLES

CURL=/usr/bin/curl
URL=https://smsapi.free-mobile.fr/sendmsg

PASS=La_Clé_Fournie
USER=Login_Free

MESSAGE=""
TYPE=""

# FUNCTIONS
help() {
    echo "=================================== Help :"
    echo "sh sms.sh SERVER SERVICE_NAME [Parameter]"
    echo "Send a sms using the following pattern :"
    echo ""
    echo "Server SERVER service SERVICE_NAME alert [: Parameter]."
    echo ""
    echo "The sms is sent to the phone number corresponding to the USER variable."
    exit 1
}
test_params() {
    if [ ! $1 = "" ] && [ ! $2 = "" ]
    then
            SERVER=$1
            SERVICE_NAME=$2

            if test -n $3
            then
                    TYPE=$3
            fi

    else
            help
            exit 1
    fi
}

main() {
    test_params $1 $2 $3
    if [ ! $TYPE = "" ]
    then
            MESSAGE="Server : $SERVER Alert $SERVICE_NAME : $TYPE"
    else
            MESSAGE="Server $SERVER Alert $SERVICE_NAME"
    fi

    $CURL -k -X POST "https://smsapi.free-mobile.fr/sendmsg?user=$USER&pass=$PASS&msg=$MESSAGE"
}


# MAIN PROG

main $*
exit 0

Le script prend donc deux paramètres obligatoires :

  • Le nom de la machine concernée
  • Le service concerné

Un troisième paramètres est facultatif, et permet d’ajouter des précisions quant à la défaillance.

J’utilise une requête POST afin de ne pas avoir à me préoccuper du formatage du message.

Comme je le disais précédemment, mon intérêt est ici d’être averti en cas de défaillance d’un service sur une machine.

Sur chacune d’entre elles Monit est installé. Par conséquent, il suffit d’intégrer le script dans le monitrc de cette façon :

if failed unixsocket /var/run/php5-fpm.sock then exec "/bin/sh /etc/sms.sh main php-fpm.sock fail"

Ce qui aura donc comme effet d’envoyer un sms de la forme :

Server main service php-fpm.sock alert : fail

Il est alors aisé de l’adapter aux autres services selon vos besoins.

N’hésitez pas à partager vos propres implémentations et à m’envoyer vos suggestions :)