dimanche 13 mai 2018

Recevoir automatiquement un e-mail lors d'un changement d'adresse IP publique


La pluie étant au rendez-vous en ce dimanche, nous nous satisferons d'une escapade linuxienne plutôt que d'une sortie bucolique. Mais quelle escapade ! Nous allons en effet mettre au point une tâche planifiée qui nous avertira par mail du changement de notre adresse IP publique. Certains d'entre vous ont la chance d'avoir une adresse statique mais ce n'est pas mon cas et mon fournisseur d'accès facture la prestation à un tarif exorbitant de 18 € par mois (soit un coût avoisinant celui de mon abonnement à internet mais aussi l'équivalent du prix de quatre-vingt dix carambars). J'ai donc préféré le système D (avec un « D » comme Debian, bien sûr) !

Je tiens d'abord à préciser que mon niveau en programmation n'est pas bien haut mais en persévérant, j'ai réussi à obtenir un système simple et fonctionnel. Il pourra probablement être amélioré mais pour le moment il me convient. Nous allons diviser le billet en trois quatre (vive la relecture !) parties :

  • les prérequis ;
  • la configuration ;
  • la préparation du script ;
  • l'automatisation de la tâche.

Commençons sans plus attendre !



Les prérequis

Comme on a pu le deviner, tout se passe sur une distribution Linux. J'ai un netbook qui dispose justement d'un système Debian Jessie opérationnel. Avant d'aller plus loin j'ai dû installer quelques paquets, à savoir mailutils, sharutils, curl et ssmtp. J'ai aussi créé une adresse électronique dédiée à cette tâche. L'adresse en question est chez GMail. J'avais commencé à faire des essais sur MSN, mais je ne suis arrivé à rien. Aucun souci en revanche avec le service de la firme de Mountain View.

Pour l'installation des paquets, rien de bien sorcier sous Debian :

sudo apt-get install mailutils sharutils curl ssmtp 

(à taper dans l'invite de commande et le tour est joué).



La configuration

Elle concerne notamment sSMTP, que nous devons adapter à GMail. Comme bien souvent sur Linux, tout va se passer dans un fichier dédié. Il s'agit de /etc/ssmtp/ssmtp.conf, dont voici le contenu :

root=lenomdelamachinelocale
mailhub=smtp.gmail.com:587
AuthUser=courriel@gmail.com
AuthPass=lemotdepasseducomptegmail
UseTLS=YES
UseSTARTTLS=YES
AuthMethod=LOGIN
rewriteDomain=gmail.com
FromLineOverride=YES
hostname=lenomdelamachinelocale



La préparation du script

Pour faciliter les choses, il sera intéressant de créer un dossier dans lequel prendront place tous les fichiers du projet. Dans ce dossier nouvellement créé, il suffira de créer un nouveau fichier qui va accueillir notre script et le nommer (sous Debian et pour l'intégrer par la suite à une tâche planifiée, le nom sera sans extension). Pour l'édition du script, j'utilise Pluma, mais cela peut aussi se faire avec Leafpad ou encore GEdit. Nous avons l'embarras du choix ! :)

Le script que j'ai conçu est le suivant :


#!/bin/bash -l
# Récupération de l'adresse IP
curl icanhazip.com > IP.txt

# Routine de comparaison. Envoi du mail si l'adresse a changé, sortie du script si l'adresse est toujours la même
if diff IP.txt OLDIP.txt >/dev/null ; then
echo "L'adresse est la même."
else
echo "L'adresse IP a changé, voir en pièce jointe." | mail -a /chemin/du/projet/IP.txt -s "Info IP" adressemail@fournisseur.com
fi

# La nouvelle adresse IP devient l'ancienne pour la prochaine exécution
cat IP.txt > OLDIP.txt

# Suppression du fichier contenant l'adresse vérifiée
rm IP.txt

exit


Pour être honnête ça n'a pas été une mince affaire car, avant de me lancer, je ne connaissais rien aux scripts avec bash. J'ai notamment bloqué sur la gestion des variables et j'ai été amené à mettre en place des solutions de contournement. Ainsi, malgré de nombreux essais, j'ai bloqué sur l'envoi de l'adresse IP dans une variable. À partir de là, il était impossible de faire s'afficher l'adresse directement dans le corps de mon mail. J'ai donc décidé d'envoyer le fichier contenant l'adresse IP en pièce jointe à mon mail (d'où le commutateur -a associé à la commande mail, qui a nécessité l'installation du paquet sharutils). Le script se chargeant d'annoncer un changement d'adresse IP il fallait donc conserver la trace de l'adresse vérifiée précédemment (qui vient se placer dans le fichier OLDIP.txt) mais, encore une fois, j'ai bloqué sur les variables. Il a donc fallu comparer les fichiers eux-mêmes et j'ai ainsi dû apprivoiser la commande diff. Quant à l'instruction cURL que j'utilise au début, elle m'a vraiment simplifié le travail de récupération de l'adresse IP, parce qu'elle est justement prévue pour cela.

Une fois le fichier enregistré, il faut le rendre exécutable et cela se fait aussi en ligne de commande après s'être placé, bien sûr, dans le répertoire où le fichier a été enregistré :
chmod +x monscript



L'automatisation de la tâche

Nous touchons au but ! Une fois la tâche planifiée nous aurons terminé. Pour cela nous allons utiliser un système nommé cron. Le listage des tâches, leur édition et leur suppression peut se faire grâce à la commande crontab. Une nouvelle fois, cela se passe dans l'invite de commande. La tâche que je vais créer se lancera toutes les cinq minutes. Nous serons ainsi très rapidement prévenus après un changement d'adresse :

On va d'abord lancer l'éditeur de tâches :

crontab -u nomutilisateur -e

nomutilisateur peut être le nom de l'utilisateur courant ou l'administrateur (root) mais pour créer une tâche root en étant utilisateur normal, il faudra passer par un terminal administrateur.


Après avoir validé, l'éditeur Nano apparaît (il n'est pas très engageant, mais nous n'aurons pas grand chose à y faire). Comme souvent dans les fichiers, il peut y avoir des commentaires qui sont introduits par des signes dièse (#). Toutes ces lignes peuvent être retirées si vous le souhaitez. Il faut savoir également qu'une tâche planifiée par défaut envoie un mail à l'utilisateur local pour l'avertir, notamment en cas d'erreur. Si vous ne souhaitez pas que ce mail soit envoyé, il suffit de commencer l'édition par MAILTO="".

Puis sur la ligne qui suit, nous entrons la commande suivante :

*/5 * * * * bash -l /chemin/du/projet/monscript

Il nous faut désormais quitter l'éditeur. Pour cela on appuie sur <Ctrl>+<X>, on valide puis l'éditeur nous propose de modifier l'emplacement et le nom du fichier (le chemin proposé est un dossier temporaire). Aussi étrange que cela puisse paraître, on ne modifie rien et on valide le choix proposé.

Retour à l'invite où un message nous informe que la tâche a bien été créée ! :)

Par sécurité, l'on veillera à redémarrer cron. Pour cela, taper la commande /etc/init.d/cron reload puis valider.

Si vous souhaitez voir où la tâche est stockée il est possible de naviguer (avec les droits administrateur) dans le dossier /var/spool/cron/crontabs. La commande crontab -l la fera également apparaître.

En conclusion, j'aurais cru qu'il serait beaucoup plus long et difficile de rédiger ce billet. Avec le recul, les choses ne sont pas si compliquées, mais il aura bien fallu faire des recherches chronophages, sachant que je partais littéralement de zéro.



Aucun commentaire:

Enregistrer un commentaire