(modifié le 8 avril 2018 à 3:41)

Si vous auto-hébergez certaines de vos données sur un serveur ou un NAS à la maison, alors l'état de la connexion internet devient important.

notification-sms

Pourquoi ne pas être notifié à chaque coupure de connexion internet, au moment où la connexion web revient ?

Pré-requis

J'utilise un routeur open source avec le firmware Tomato, mais cette procédure peut facilement s'adapter à du pfSense ou à du dd-wrt. Mon fournisseur internet est Numericable sur lequel il est possible d'envoyer des emails sans authentification, je vais laisser vérifier sur votre FAI il me semble que chez Free ça marche aussi.

L'appel du script

Rendez-vous sur l'interface de votre routeur dans le menu Administration > Scripts > onglet WAN up :

tomato-scripts-wanup

J'ai stocké le script sur une clé USB qui est branchée en permanence au routeur, d'où le chemin. Si vous n'avez pas de clé vous pouvez stocker le script sur /jffs s'il vous reste assez de place.

On pourrait aussi imaginer que le script soit stocké sur un serveur web, un wget le récupérerait pour l'exécuter ensuite. Un peu tordu, mais ça devrait fonctionner.

Le script telnet

Nous allons créer un script shell que nous appelons wanUp.sh, il va :

  • envoyer un email de notification (via telnet)
  • envoyer un SMS de notification (API Free)

Voici le contenu du script :

#!/bin/sh
# wanUp.sh
# Auteur: Xhark pour https://blogmotion.fr
# Creative Commons BY-ND 4.0
# v2015.06.19

DATETIME=$(date +"%d-%m-%Y %H:%M:%S")
MAILERNAME="mailer"
MAILERVERSION="1.0"
DELAY=2
DOMAINRECEIVED="numericable.fr"
SMTPSERVER="smtp.numericable.fr"
PORT=25
FROM="routeur@home.fr"
TO="votre@email.tld"
EMAIL="Bonne nouvelle, la connexion internet Numericable est de retour :)"
OBJET="[Tomato] WAN UP !"
SMSURL="http://votre-site.fr/rep-secret/wan-sms.php"

logger -t "smtp_auto_message" "Connexion Internet (WAN) rétablie ! on va envoyer le sms et le mail de notification (wanUp.sh by xhark)"

# envoi du SMS via API Free
wget $SMSURL -O /dev/null >/dev/null 2>&1

if (
 sleep $DELAY
 echo "HELO $DOMAINRECEIVED"
 sleep $DELAY
 echo "MAIL FROM:<$FROM>"
 sleep $DELAY
 echo "RCPT TO:<$TO>"
 sleep $DELAY
 echo "DATA"
 sleep $DELAY
 echo "Date: $DATETIME"
 echo "From: $FROM"
 echo "To: $TO"
 echo "Subject: $OBJET"
 echo "X-Mailer: $MAILERNAME $MAILERVERSION"
 echo "X-hark: good-joke!"
 echo ""
 echo "$EMAIL"
 echo ""
 echo $DATETIME
 echo "."
 sleep $DELAY
 echo "QUIT"
 sleep $DELAY
 ) | telnet $SMTPSERVER $PORT; then
 :
else
 logger -t "smtp_auto_message" "WARNING: impossible d'envoyer le mail de notification via telnet (wanUp.sh by xhark)"
 exit 0
fi
exit 0

doc sur les sessions SMTP

Je n'avais pas beaucoup de solutions pour envoyer un email avec mon routeur car les outils embarqués sont assez light, et j'avoue que je trouvais la solution telnet était assez fun.

Testé avec smtp.numericable.fr et smtp.sfr.fr (code modifié le 08/04/2018 pour éviter l'erreur "501 5.1.7 Bad sender address syntax"). N'utilisez pas un domaine sur lequel vous avez un SPF restrictif car le serveur destinataire risque de rejeter (à juste titre) votre email. En cas de souci prenez un nom de domaine farfelu qui n'existe pas ou un sous-domaine sur lequel vous laissez un SPF non restrictif.

SMS

Pour le SMS je m'appuie sur l'API gratuite de Free. Problème : elle impose l'utilisation d'une URL en HTTPS, hors la version embarquée de wget sur mon routeur ne le supporte pas. Voilà pourquoi je fais un appel à un script PHP hébergé sur un serveur web, dont voici le contenu :

<?php
# wan-sms.php
function rawenc($v) {
	return trim(rawurlencode($v));
}

$api_url='https://smsapi.free-mobile.fr/sendmsg';
$api_user='11223344';
$api_pass='xxxxxxxxxxxxx';

$message = rawenc("[WAN UP!] La connexion internet Numericable est de retour depuis le ". date('d/m/Y') ." vers ". date('H:i:s') );
$url = $api_url .'?user='. $api_user .'&pass='. $api_pass .'&msg='. $message;
file_get_contents($url);

?>

Les champs $api_user et $api_pass sont disponibles dans votre espace free mobile. Vous ne pourrez pas envoyer de notification sur un autre numéro que le votre.

Je vous conseille vivement de protéger l'accès à cette page :

  • si votre IP change rarement (tous les 6 mois environ avec Numericable) et que vous utilisez un DNS dynamique suivez ce tutoriel
  • si vous avez une IP fixe utilisez un .htaccess (allow from votre_ip)
  • si votre IP change à chaque connexion vous pouvez utiliser un nom de script+répertoire exotique, ou protéger l'accès avec un htaccess (utilisateur+mdp) ou un champ GET dans votre page PHP

Si vous utilisez un DNS dynamique et que votre IP change à chaque synchronisation internet alors le contrôle ne fonctionnera pas car le dyndns n'aura pas eu le temps de se mettre à jour avant l'exécution du script sur le routeur. Dans ce cas vous pouvez temporiser le script shell avec la variable DELAY, tout dépend de la fréquence d'actualisation de votre DNS dynamique. Si vous êtes sous Tomato la synchronisation se fait à chaque reconnexion, donc 60 secondes devraient suffirent.

Conclusion

Nous avons un petit système sympa qui envoie une notification quand la connexion web revient. Particulièrement pratique si j'ai besoin de prendre le contrôle à distance d'un ordinateur à la maison, même s'il est éteint.

notification-email

Je sais que vous allez me dire dans les commentaires que j'aurai pu tout créer en PHP, et c'est vrai. Mais j'avais déjà créé le code de notification email avant de penser à la notification SMS, donc j'ai laissé le code avec telnet, une méthode de barbu qui a le mérite de fonctionne au top.

Notez que l'évènement est consigné au passage dans le log du routeur avec la commande logger, ceux qui utilisent un serveur syslog seront ravis.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter