Que faire quand son routeur ou sa box s'arrête de temps en temps de fonctionner ? Dans ce billet un peu technique, je vous propose de découvrir ma solution à base d'une prise connectée et d'un peu de hacking.
Le Spot Bouygues est un lieu sur le campus de l'EPITECH où étudiants et collaborateurs de Bouygues viennent se poser pour travailler sur des projets communs. L'infrastructure du lieu est très limitée: en gros il y a juste un routeur qui diffuse un accès WiFi et permet l'accès à Internet.
C'est tout à fait suffisant mais, de temps en temps, ce routeur se met à ne plus fonctionner: s'il y a des utilisateurs connectés il restent connectés mais perdent l'accès à Internet et les nouveaux arrivant ne peuvent plus se connecter au réseau. Rien de grave, j'imagine que vous avez ça de temps en temps sur votre box ou sur votre routeur ? Il suffit de redémarrer le routeur (juste le débrancher et le rebrancher…) et tout rentre de l'ordre en quelques minutes. La seule particularité est que pour des raisons de sécurité, au Spot, ce routeur est dans un caisson fermé à clé. Il faut donc avoir la clé pour réaliser l'opération.
Ce dysfonctionnement se produit de "temps en temps" une à deux fois par mois. Évidemment, cela se produit TOUJOURS au plus mauvais moment, c’est-à-dire quand je ne suis pas là. Les occupants n'ont alors pas d'autres choix que de m'appeler pour que je leur dise où est cachée la fameuse clé (sous le paillasson ;-) afin qu'ils redémarrent le routeur. C'est également ennuyeux parce que le Spot contient des équipements de sécurité (caméras, détecteurs, …) qu'il est embêtant de ne pas pouvoir consulter à distance à tout moment.
Ce problème dure depuis des mois, à l'occasion j'ai essayé de faire de faire des recherches pour identifier les causes possibles et j'ai fait régulièrement les mises à jours du firmware du routeur mais hélas sans résoudre le problème jusqu'à présent. D'ailleurs si vous avez des suggestions, je suis preneur !
Il y a quelques mois je tombe sur un article de Gizmodo qui parle d'une prise magique capable de régler le problème: le "ResetPlug". Le ResetPlug s'intercale entre l'alimentation de votre box/routeur et la prise de courant. Il fonctionne comme un client WiFi qui écoute en permanence votre connexion Internet. Dès qu'il ne détecte plus Internet, il coupe l'alimentation quelques secondes ce qui a pour effet de redémarrer votre box/routeur.
Cool. C'est exactement ce qu'il me faut !
Seul problème: ce gadget est vendu exclusivement aux US pour 60$. La prise supportée est d'ailleurs une prise au format US. Le site laisse supposer qu'une version pour des prises Européennes pourrait être disponible mais en fait après plusieurs mois d'attentes il n'en est rien :-(
L'été approche donc une période de vacances où le problème risque d'être encore plus visible car évidemment dans ces périodes je ne suis pas présent tout le temps au Spot. Il me fallait une solution.
En lisant attentivement la FAQ de la ResetPlug, je tombe sur une question qui éveille ma curiosité:
Q: Isn't this a Kankun smart plug? They look the same?
A: No, this is not the same as the Kankun smart plug. We both use the same plug hardware (outside) from iKonke, but the software (inside) is very different. The ResetPlug detects an Internet outage and cycles power automatically. The Kankun plug is meant to turn on or off the outlet from an app while on the same WiFi network.
Le ResetPlug utiliserait donc le même hardware qu'une mystérieuse prise intelligente "Kankun" mais y ajoute un logiciel spécifique. Hmmm. N'y aurait-il pas moyen de faire la même chose ?
Quelques recherches sur Internet me font tomber sur cette fameuse prise Kankun vendue par Amazon US pour 30$. C'est une prise contrôlable via son smartphone Android/iOS. Ce n'est pas exactement mon besoin mais c'est intéressant. Accessoirement, la Kankun est vendue moitié prix de la ResetPlug: le prix à payer pour le logiciel ajouté par ResetPlug ?
En cherchant un peu plus, je tombe sur un article de blog de Kenneth Burgener qui explique comment "hacker" la Kankun. L'article explique que la prise Kankun est en fait sous OpenWRT. Mes souvenirs de visiteur régulier du /tmp/lab (un des premiers hacker space en France) me reviennent à l'esprit: OpenWRT est une mini-distribution Linux qui équipe de nombreux équipement réseaux. Et si c'est une distribution Linux, il doit être facile d'y ajouter l'intelligence nécessaire au pilotage de la prise. En effet, l'article de Kenneth explique comment il est possible de se connecter à la prise en SSH et même y installer un mini-serveur HTTP pour la piloter à distance: cool, voilà la solution !
Je me lance donc dans l'achat de cette fameuse prise. Comme conseillé dans l'article, je la commande à 16,99$ sur Aliexpress, qui est moins cher qu'Amazon (j'ai encore gagné 50% !), qui y ajoute un adaptateur pour les prises EU et qui livre en France. Après quelques semaines (ça vient de Chine), l'objet arrive finalement au Spot.
La prise en main n'est pas facile au début. Naïvement, j'essai d'installer l'appli Android pour configurer la prise mais depuis l'article de Kenneth qui date de 2015, l'application n'est plus disponible qu'en Chinois et honnêtement, même pour s'y connecter, c'est compliqué quand on ne comprends pas un mot (pas même un caractère !) de chinois.
Bref, je me retourne finalement vers la configuration via SSH. Une fois compris comment on réinitialise la prise (un petit bouton sur le côté) et qu'il faut quelques minutes pour qu'elle expose son WiFi de configuration ("0K_SP3"), j'arrive finalement à me connecter à la console.
BusyBox v1.19.4 (2014-03-27 17:39:06 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_ _ _ _
| | _-_| _____ _____ | | _-_| _____ ____
| -_- | || || -_- | || |
| |-_ | - || | || |-_ | -__|| _|
| _ -_ |_____||__|__|| _ -_ |_____||__|
|_| -__| S M A L L |_| -__| S M A R T
-----------------------------------------------------
KONKE Technology Co., Ltd. All rights reserved.
-----------------------------------------------------
* www.konke.com All other products and
* QQ:27412237 company names mentioned
* 400-871-3766 may be the trademarks of
* fae@konke.com their respective owners.
-----------------------------------------------------
root@koven:~#
Je commence par configurer l'accès de la prise au WiFi du Spot. C'est expliqué dans l'article de Kenneth: il suffit de modifier deux fichiers de configurations Linux "/etc/config/wireless" et "/etc/config/network" pour y indiquer les informations de connexion au WiFi. Au redémarrage suivant, la prise est donc désormais connectée au WiFi du Spot.
Reste à rajouter l'intelligence pour tester la connexion au WiFi et arrêter la prise si la connexion échoue.
L'article de Kenneth et assez détaillé et il existe un groupe Google+ (pas très actif néanmoins) qui propose quelques astuces et programmes pour jouer avec la prise. J'apprends ainsi que pour couper l'alimentation de la prise il suffit d'écrire un 0 dans un endroit très précis du filesystem, ce qui se fait en une commande shell très simple:
echo 0 > /sys/class/leds/tp-link:blue:relay/brightness
Et pour remettre l'alimentation, il suffit d'écrire 1 au même endroit:
echo 1 > /sys/class/leds/tp-link:blue:relay/brightness
On ne peut pas faire plus simple ! J'ai donc de quoi piloter la prise pour pouvoir redémarrer le routeur une fois qu'il y sera branché.
Il faut maintenant tester la connexion. La prise étant connectée en WiFi au réseau du Spot, il suffit de tester l'accès à Internet pour vérifier que le routeur fonctionne. Il y a plusieurs méthodes pour faire ça mais comme OpenWRT n'intègre qu'un sous-ensemble des commandes Linux habituelles, j'opte pour une solution simple en utilisant la commande "wget" qui permet de lancer une requête HTTP sur une URL. Si l'URL répond la commande retourne 0, si elle ne répond pas elle retournera autre chose. Voilà donc mon test de connexion:
wget -q -s http://google.com
if [[ $? -eq 0 ]]; then
echo 'Il y a internet'
else
echo 'Il n'y a pas internet'
fi
Comme vous le voyez, je teste l'accès à Google. Si Google tombe, on peut considérer qu'il y a un problème de connexion :-)
Bon il n'y a plus qu'à assembler les morceaux: s'il n'y a pas Internet, je coupe l'alimentation et je la remets. Dans la réalité c'est un peu plus compliqué, j'y rajoute un peu d'intelligence:
Bref, voici ce que donne le script final qui constitue "l'intelligence" de ma prise.
# checkinternet
while true
do
wget -q -s http://google.com
if [[ $? -eq 0 ]]; then
echo $(date) was: online
else
echo $(date) was: OFFLINE, retry in 30 seconds
/root/sendtolametric "Internet issue, retrying in 30s" > /dev/null
sleep 30
wget -q -s http://google.com
if [[ $? -eq 0 ]]; then
echo $(date) was: now online
else
echo $(date) was: still OFFLINE, reboot in 10s
/root/sendtolametric "Reboot in 10s" i2633 knock-knock critical > /dev/null
sleep 10
echo 0 > /sys/class/leds/tp-link:blue:relay/brightness
sleep 3
echo 1 > /sys/class/leds/tp-link:blue:relay/brightness
sleep 600
fi
fi
sleep 300
done
En gros c'est un script qui teste toutes les 5 minutes ("sleep 300") la connexion (commande "wget"). Si elle échoue il attend 30 secondes ("sleep 30") puis refait le test. Si elle échoue à nouveau il prévient les utilisateurs (appel "sendtolametric" pour piloter l'afficheur digital), attend 10 secondes puis coupe la prise pendant 3 secondes puis la redémarre. Il attend ensuite bien sagement 10 minutes que le réseau refonctionne et relance son cycle de test.
Avant de brancher ma prise ainsi configurée sur le routeur du Spot, j'ai d'abord fait tourner le script "à vide" quelques jours pour vérifier que tout allait bien. J'ai pu ainsi constater qu'il détectait correctement les coupures réseau. J'en ai profité pour le modifier en intégrant quelques temps d'attentes que vous voyez dans le script final ci-dessus. Il faut noter aussi que le script "loggue" chacune de ses actions ce qui me permet de voir à postériori ce qu'il a fait.
Finalement la prise est branchée au routeur du Spot depuis 3 semaines. Et j'ai eut la joie de constater qu'elle a déjà "corrigé" deux coupures réseau. Voici par exemple une de ses actions il y a quelques jours:
Mon Jul 17 03:18:45 CST 2017 was: online
Mon Jul 17 03:22:52 CST 2017 was: OFFLINE, retry in 30 seconds
Mon Jul 17 03:23:22 CST 2017 was: still OFFLINE, reboot in 10s
Mon Jul 17 03:36:55 CST 2017 was: online
Mon Jul 17 03:41:55 CST 2017 was: online
Je suis donc plus serein en me disant que, même en mon absence et même à 3h du matin, ma prise connectée veille à ce que le réseau du Spot soit toujours actif !
Amusant non ?
N'hésitez pas à laisser vos remarques ou suggestions en commentaire.
[Mise à jour novembre 2020]
Vu la difficulté à trouver une prise Kankun aujourd'hui, j'ai fait évoluer ce mécanisme avec une nouvelle prise connectée. Voir le nouvel article Comment rebooter automatiquement son routeur ? (le retour).