Alertes par SMS en Bash (via Google Calendar)

La remontée d’alerte par SMS (« Short Message Service ») est un plus non négligeable dans le monitoring de systèmes d’informations critiques.

Les services gratuit permettant d’utiliser les SMS depuis le système restent rare.

Depuis plusieurs années déjà, « Google Agenda » propose à ses clients des rappels de rendez-vous par SMS.
Rapidement, ce service Google fût détourné pour être utilisé comme source de remontée d’alertes (exemple : « SmsAlert : Envoyer des sms gratuitement depuis ses serveurs » sur le site Macsim’s Mind qui utilisait le script PHP d’ Alexander Skakunov pour remonter des alertes par SMS).

Bien que très efficaces, la plupart de ces détournement sont implémentés en PHP qui n’est pas installé sur tous les serveurs.

L’idée de cet article et d’utiliser la même technique mais implémentée en BASH.

Principe de fonctionnement

Le principe est de créer un événement dans un agenda Google Calendar débutant dans 5 minutes et X secondes et d’avertir l’administrateur par SMS 5 minutes avant le début de l’événement. Le SMS sera donc envoyé après X secondes.

L’objectif du script « googalert » (disponible sur sourceforge) est de n’utiliser que des commandes classiques du shell, de pouvoir choisir l’agenda dans lesquels seront stockés les alertes et d’être parfaitement conforme à l’API Google (http://www.udel.edu/CIS/software/dist/google/calendar/java.client/gdata/doc/calendar.html voir Add an event).

Mise en place

Préparer Google Calendar

Puisque le script ajoute des événements dans un agenda Google, il faut disposer d’un compte « Google Calendar ». Si vous n’avez pas de comptes de ce type, rendez vous sur la page d’accès au service d’agenda (http://www.google.com/calendar) et inscrivez vous (bouton « INSCRIPTION » en haut à droite).

Une fois connecté, à l’agenda, créer un nouvel agenda :

Lui donner un nom et (pourquoi pas) une description avant de valider par « Créer l’agenda » :

Puisqu’il s’agit de recevoir des notifications par SMS, la notion de numéro de téléphone semble inévitable … Si vous n’avez pas encore fourni cette information à Google, vous pourrez y accéder via le menu « Rappels et notifications » du nouvel agenda :

En bas de page vous trouverez un joli lien vous permettant de fournir le précieux renseignement :

Enfin, activer la notification par SMS des événements pour terminer la configuration :

Récupérer les informations Google Calendar

Si vous ne souhaitez pas utiliser l’agenda par défaut pour consigner les alertes, récupérez l’ID de l’agenda ciblé dans les « Paramètres de l’agenda » :

Dans la section « Adresse URL de l’agenda » copier la valeur de l’ID (ici ef00qo0reirlsncva3qo7vgb10@group.calendar.google.com) :

Mise en place du script « googalert »

Télécharger le script « googalert » sur sourceforge (http://sourceforge.net/projects/googalert/) et l’extraire :

fhh@mafalda ~ $ mkdir alertbysms && cd !$
mkdir alertbysms && cd alertbysms
fhh@mafalda ~/alertbysms $ wget -q http://downloads.sourceforge.net/project/googalert/googalert-0.1.tar.bz2
fhh@mafalda ~/alertbysms $ tar xvf googalert-0.1.tar.bz2 
googalert-0.1/
googalert-0.1/googalert
fhh@mafalda ~/alertbysms $ cd googalert-0.1

Sans arguments, le script retourne un menu d’aide.

Créer un fichier de configuration

L’option « -g » génère un typon de fichier de configuration.

fhh@mafalda ~/alertbysms/googalert-0.1 $ ./googalert -g > googalert.conf

Éditez le fichier généré pour y renseigner vos identifiants, l’ID de l’agenda dans lequel vous souhaitez ajouter vos modifications, etc :

fhh@mafalda ~/alertbysms/googalert-0.1 $ grep '^[[:blank:]]*[[:alpha:]]' googalert.conf
AGENDA="ef00qo0reirlsncva3qo7vgb10@group.calendar.google.com" ;
LOGIN="fhh@gmail.com" ;
PASSWORD="mot_de_passe_gmail" ;

Une fois le fichier de configuration renseigné, vous pouvez soit le déplacer à la racine de votre compte en le faisant précéder par un « . » (exemple : mv googalert.conf ~/.googalert.conf) soit le placer dans « /etc/googalert.conf » si vous êtes administrateur de la machine, soit utiliser l’option « -c » du script.

Quel que soit votre choix pensez à adapter les droits sur le fichier !!!

fhh@mafalda ~/alertbysms/googalert-0.1 $ chmod 600 googalert.conf

Note : Vous pouvez préciser les logins mots de passe et agenda à utiliser directement depuis la ligne de commande via les options « -l », « -p » et « -a ».

Utilisation du script

A minima, vous devez préciser au script un texte pour l’événement à ajouter dans votre agenda, mais le champ le plus intéressant est le titre de l’événement car il sera repris dans le SMS d’alerte que vous recevrez :

fhh@mafalda ~/alertbysms/googalert-0.1 $ ./googalert -c googalert.conf "Titre de l'évènement" "Texte de l'alerte consignée dans l'agenda..."
fhh@mafalda ~/alertbysms/googalert-0.1 $ echo $?
0

Note : l’option « -v » détaille les différentes actions effectuées par le script.

L’événement est alors ajouté à l’agenda désiré :

20121217122834

et dans les 30 secondes suivant l’insertion, vous recevrez une notification par SMS :

sms de : 36665"
date="1355743717554"
type="1"
body="Rappel : Titre de l'évènement - lun. 17 déc. 12:33 - 12:43
lieu?: mafalda (Alertes)"

Par défaut, le script retourne une alerte dans les 30 secondes suivant l’ajout de l’événement à l’agenda. Cette valeur peut être modifiée via l’option « -t ».

Limites du script

Le script utilisant un service web gratuit, sa fiabilité est liée à différents facteurs tels que :

  • la synchronisation du temps : la machine émettant les alertes doit être parfaitement à l’heure sous peine d’ajouter des événements dans le passé ou trop loin dans le futur (ce qui n’a plus d’intérêt) ;
  • l’accès au web : la remontée d’alertes passe par l’accès à une application web. Si l’accès internet de la machine est coupé, il devient impossible d’accéder au service Google calendar et les notifications tombent dans le néant …
  • la fiabilité de Google Calendar : Google Calendar est un service gratuit dont la fiabilité n’est pas absolue…

Malgré tous, le script fournis un sympathique complément aux systèmes traditionnels de remontées d’alertes.

Références

Google Calendar : http://www.google.com/calendar
L’API Google : http://www.udel.edu/CIS/software/dist/google/calendar/java.client/gdata/doc/calendar.html
« googalert » sur sourceforge : http://sourceforge.net/projects/googalert/
« Envoyer des sms gratuitement depuis ses serveurs » sur Macsim’s Mind : http://macsim.labolinux.net/2008/07/137-smsalert-envoyer-des-sms-gratuitement-depuis-ses-serveurs/

47 réflexions au sujet de « Alertes par SMS en Bash (via Google Calendar) »

    1. En simplifié, Google demande parfois une confirmation pour l’ajout d’un évènement dans l’agenda. La confirmation consiste en une connexion sur une page précisée en réponse à la demande d’ajout. Apparemment, le champs de transmission de la page de confirmation a changé… Je m’en occupe dès que possible (de ça et de l’ajout de connexion via un proxy).

        1. De la remontée par rapport à cette erreur ?
          Pour info j’essaie ce script via un VPS. peut être google n’aime t’il pas les IP’s venant de chez OVH ou autres hebergeur

          1. Ce site est hébergé sur chez OVH et utilise googalert… j’ai un peu de mal a dégager du temps pour traiter ça, mais promis, je n’oublie pas…

            1. Merci à toi 🙂 t’as déjà fait du super boulot.
              Je vais faire un tour plus approfondi sur ce site. Si tous les posts sont du même niveau que celui-ci je risque de bien m’y plaire

                  1. Salut, j’avais toujours le problème lors de la demande de confirmation.
                    J’ai pu régler le problème en modifiant une ligne.
                    remplacer la ligne 274 par
                    confirm_url=$(echo $result | grep "Location: .*\?t=.*" | sed -e 's/.*Location:[[:blank:]]\([^ ]*\)[[:blank:]].*/\1/') ;

  1. Bonjour

    Comment faire pour utiliser le script quand on passe par un proxy avec le port 8080 par exemple et qui demande un login et un mot de passe ?

    Merci

  2. Bonjour,
    pour ma part, je ne parviens pas à me connecter en entrant manuellement login/password avec -l -p.
    Je ne parviens pas non plus A tiliser le fichier de config généré que j’ai édité.
    Si quelqu’un a une solution je suis tout ouïe.
    Merci à vous.

    1. Mettez vos login et mots de passe entre quotes : googalert -l adresse@gmail.com -p ‘monpass’ …
      Pour ce qui est du fichier généré, spécifiez au script qu’il faut l’utiliser via l’option « -c ».
      Après, sans plus de renseignements (trace d’exécution via « -D »), je ne peux pas faire grand chose a part conseiller d’utiliser la dernière version du script.

  3. Bonjour,
    moi non plus je n’arrivais pas à m’authentifier et j’y suis arrivé finalement en virant les caracteres speciaux de mon mot de passe. J’espere que cela servira à quelqu’un.
    Enjoyez

    1. Là je manque un peu d’informations.
      Utilisez vous la dernière version du script ? (0.2.1)
      Si oui, envoyez moi par mail le résultat du script lancé avec l’option de debogage (-D), de là, je pourrais étudier votre problème…

  4. Bonjour,

    J’ai un problème lorsque j’exécute ce programme sur un ordinateur au boulot (j’ai copié de le résultat du mode debug en dessous). A noté que pour le même fichier de configuration ce programme fonctionne sur mon ordinateur personnel.

    Debug :
    + VERBOSE=true

    + ‘[‘ -z  » ‘]’
    + die ‘> Failed to create event.’
    + enable_output
    + true
    + echo ‘> Failed to create event.’
    > Failed to create event.
    + exit 1

  5. Je viens de faire un test avec -v et j’obtiens ceci :

    Password google : Not displayed

    J’ai pourtant bien renseigné le mdp.

    Il y a un caraectère special dedans : @

    Est-ce que ca peut expliquer le problème ?

  6. Je n’arrive pas à utiliser le script, j’obtiens à chaque fois : > Authentification failed ! Check your login and password.

    J’ai essayé avec le fichier de conf et avec les options -l -p et j’obtiens le même résultat.

    J’utilise les même paramètres pour le connecter sur mon compte google et la par contre aucun soucis.

    Une idée ?

  7. Bonjour,

    je ne comprend pas très bien le script, comment associer le script à google agenda ? Car actuellement aucun lien entre les deux.
    merci

    1. Le script est fait pour « google agenda ». Les urls d’accès sont donc dans le script. La seule chose sur laquelle vous pouvez intervenir est l’agenda dans lequel les événements sont consignés. Pour ça utilisez le fichier de configuration.

  8. Une nouvelle version du script est disponible prenant en compte les différents commentaires :
    – test des prérequis quand c’est possible
    – possibilité d’ajouter la notification par mail
    – amélioration du code
    – suppression du test des certificats pour les ditribs sans paquets type « ca-certificates »

    1. Merci pour le retour, comme je le disais précédemment, il faut que j’ajoute une série de check en début de script… Dès que j’ai un moment, je m’y colle.

  9. Chez moi ça ne fonctionne pas…
    > Failed to create event.

    pourtant il crée bien l’évenement mais juste avec le titre, le détail est perdu. Et je reçois bien le SMS

    1. Si vous pouviez m’envoyer (par mail) le résultat d’un appel au script avec l’option de débogage « -D » pour que je puisse diagnostiquer tous ça …
      Quoi qu’il en soit, merci à tous pour les retours …

  10. Merci

    Ça marche impec sous raspberry pi mais “Authentification failed ! Check your login and password.” sous Puppy Lucid.

    1. Merci pour ce retour. Je vais ajouter une série de checks dans le script pour stabiliser ça.

      En attendant, vous pouvez m’envoyer une trace par mail en invoquant le script avec l’option de débogage « -D » (pensez à retirer votre mot de passe qui, en mode débug, doit apparaître en clair). Avec ça je dois pouvoir identifier le problème.

      1. voici la debug trace et merci encor:

        # /usr/local/bin/googalert -D "Text"
        + VERBOSE=true
        ...
        ++ timeout 3 wget -S -q -O - '--post-data=Email=xxxxxxxxxxxxx@gmail.com&Passwd=xxxxxxxxx&source=lkj11&service=cl' https://www.google.com/accounts/ClientLogin
        + AUTH=
        ...
        > Authentification failed ! Check your login and password.
        + exit 1

  11. Salut,

    Très bon script mais après l’avoir essayé avec succès sur mon micro sous ubuntu 12.04, je l’ai placé à la racine de mon compte sur deux autres pc dont un raspberry pi sous raspbian et avec le même fichier de conf, les mêmes commandes retournent un « Authentification failed ! Check your login and password. » Dommage, ça m’aurait ouvert des possibilités en domotique.

    Merci

    1. Idem pour moi.

      De toutes manières c’est systématiquement comme cela. Des qu’on trouve une astuce pour utiliser les SMS en ligne de commande, tout est fait alors pour stopper cette possibilité.

      1. Bonjour, le script à été fait pour fonctionner sous linux donc il doit fonctionner sous raspberry pi… Je n’en ai pas sous la main, mais dès que j’en coince une, je vois ce que je peux faire pour arranger ça. Le script est basé sur l’API Google et n’utilise que des fonctions très simples type « wget », donc ça DOIT marcher en nécessitant un minimum de modifications …
        Je fais les modifs dès que possible …

        1. Bonjour, ça fonctionne après avoir passé le timeout à 8, désolé d’avoir douté de ce script et encore merci de le partager.

          1. Promis, si je met un truc en ligne sur ce site, c’est que je l’ai testé. Les tests sont généralement effectués sur plusieurs des distribs parmis : Arch Linux, Debian (Squeeze et Wheezy), Ubuntu, et Fedora. N’hésitez pas à proposer ou à implémenter des améliorations 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *