Script pour reboot le routeur
Script pour reboot le routeur
Bonjour à tous,
J'utilise un raspberry pi 3 sur lequel tourne Domoticz.
Il est connecté via ethernet à un routeur 4G (modèle TP LINK MR6400).
De temps en temps, le routeur n'a plus accès à internet.
Souvent il s'agit de micro coupure (< 30 sec) et ce n'est pas gênant.
Mais parfois (comme hier soir), c'est plein de coupure à la suite ( > 3 min)...
Je peux le constater depuis le ping (8.8.8.8 google) que j'ai sous Domoticz (refresh toutes les 5 sec):
Pour résoudre ça, j'éteins manuellement le routeur et le rallume.
Je voudrais mettre en place un script (soit sur le raspberry, soit via les événements de Domoticz) qui ferait ça:
- surveille le device ping Google
- si OFF plus de 3 minutes en continu
- alors reboot du routeur TP-Link via le réseau
Pour ce qui est du routeur, j'ai vu que par telnet sous Windows j'ai accès à une commande "dev reboot".
Ma question, est ce qu'on peut faire quelque chose d'équivalent sous raspbian ?
Merci d'avance pour votre aide.
Je vais continuer à chercher de mon côté aussi.
J'utilise un raspberry pi 3 sur lequel tourne Domoticz.
Il est connecté via ethernet à un routeur 4G (modèle TP LINK MR6400).
De temps en temps, le routeur n'a plus accès à internet.
Souvent il s'agit de micro coupure (< 30 sec) et ce n'est pas gênant.
Mais parfois (comme hier soir), c'est plein de coupure à la suite ( > 3 min)...
Je peux le constater depuis le ping (8.8.8.8 google) que j'ai sous Domoticz (refresh toutes les 5 sec):
Pour résoudre ça, j'éteins manuellement le routeur et le rallume.
Je voudrais mettre en place un script (soit sur le raspberry, soit via les événements de Domoticz) qui ferait ça:
- surveille le device ping Google
- si OFF plus de 3 minutes en continu
- alors reboot du routeur TP-Link via le réseau
Pour ce qui est du routeur, j'ai vu que par telnet sous Windows j'ai accès à une commande "dev reboot".
Ma question, est ce qu'on peut faire quelque chose d'équivalent sous raspbian ?
Merci d'avance pour votre aide.
Je vais continuer à chercher de mon côté aussi.
Dernière modification par bartras le 22 mars 2023, 12:54, modifié 2 fois.
Re: Script pour reboot le routeur
Comme je le vois :
un script lancé par cron toutes les minutes
- test si connexion sur 8.8.8.8 (attention a tester aussi un autre serveur, j'ai un script qui test ce genre de chose et je me connecte sur 2 serveurs pour etre sur)
si ko, faire un touch sur un fichier dans /tmp (si ce fichier n'existe pas) sinon, tester la date de ce fichier et si date > 3 mn, lancer la commande de reboot
si ok, supprimer ce fichier
voila comme je le vois
tu veux un exemple de script ou ca te suffit ?
un script lancé par cron toutes les minutes
- test si connexion sur 8.8.8.8 (attention a tester aussi un autre serveur, j'ai un script qui test ce genre de chose et je me connecte sur 2 serveurs pour etre sur)
si ko, faire un touch sur un fichier dans /tmp (si ce fichier n'existe pas) sinon, tester la date de ce fichier et si date > 3 mn, lancer la commande de reboot
si ok, supprimer ce fichier
voila comme je le vois
tu veux un exemple de script ou ca te suffit ?
Re: Script pour reboot le routeur
Merci pour ton retour rapide.
Pour l'instant j'en suis là :
Existe t il une adresse DNS dont le ping échoue volontairement pour que je teste le cas où ça ne marche pas ? (ma question peut paraitre bête je m'en excuse) ?
Et je continue de plancher pour me connecter en ssh à mon routeur pour le redémarrer.
Pour l'instant j'en suis là :
Code : Tout sélectionner
#!/bin/bash
# Ping les adresses 8.8.8.8 et 1.1.1.1
ping -c 1 8.8.8.8 > /dev/null
ping1=$?
ping -c 1 1.1.1.1 > /dev/null
ping2=$?
if [ $ping1 -ne 0 ] && [ $ping2 -ne 0 ] && [ ! -f "ping_nok" ]; then
sudo touch ping_nok
elif [ $ping1 -ne 0 ] && [ $ping2 -ne 0 ] && [ -f "ping_nok" ] && [ $(find ping_nok -mmin +3) ]; then
echo "reboot routeur"
else
sudo rm -f ping_nok
fiEt je continue de plancher pour me connecter en ssh à mon routeur pour le redémarrer.
Re: Script pour reboot le routeur
- pour ta question sur le ping, si ton reseau local est en 192.168.1.x par exemple, tu peux pinguer 192.168.2.1, ca devrait planter
- sinon, j'utilises plutot nc pour tester une connexion : des fois, le dns 8.8.8.8 ne repond pas aux ping alors qu'il est toujours actif
- si tu as le choix entre telnet et ssh, prefere telnet (pas securisé mais en reseau local ...), plus facile a utiliser. sinon, faudra regarder sur les clés ssh ou sur un truc genre ssh-askpass
et comme je vois que tu sais ecrire un shell, un peu de code pour t'inspirer
c'est une adaptation de plusieurs scripts perso, j'ai pas testé...
- sinon, j'utilises plutot nc pour tester une connexion : des fois, le dns 8.8.8.8 ne repond pas aux ping alors qu'il est toujours actif
- si tu as le choix entre telnet et ssh, prefere telnet (pas securisé mais en reseau local ...), plus facile a utiliser. sinon, faudra regarder sur les clés ssh ou sur un truc genre ssh-askpass
et comme je vois que tu sais ecrire un shell, un peu de code pour t'inspirer
Code : Tout sélectionner
#!/bin/sh
#180 = 3 mn
NB_SECONDES_ATTENTE=180
IP_ROUTER="192.168.1.1"
telnet_adsl_restart(){
#commandes a passer (a adapter)
echo "open "$IP_ROUTER
sleep 1
echo "dev reboot"
sleep 1
echo "exit"
}
#un fichier lock pour ne pas avoir deux process en meme temps
if [ -f /var/run/surv_rezo.lock ]
then
exit 3
fi
touch /var/run/surv_rezo.lock
#on test plusieurs fois une connexion sur google puis sur free
compteur=0
while [ $compteur -lt 5 ]
do
#test www.goole.com
nc -w 1 -z www.google.com 443
resultat=$?
if [ $resultat -eq 0 ]
then
compteur=5
else
compteur=$(expr $compteur + 1)
fi
sleep 1
done
if [ $resultat != 0 ]
then
compteur=0
while [ $compteur -lt 5 ]
do
#test www.free.fr
nc -w 1 -z www.free.fr 443
resultat=$?
if [ $resultat -eq 0 ]
then
compteur=5
else
compteur=$(expr $compteur + 1)
fi
done
sleep 1
fi
#pas de connexion
if [ $resultat = 1 ]
then
#pas de fichier de date
if [ -f /tmp/testdate.txt ]
then
date +%s > /tmp/testdate.txt
else
#le fichier existe deja, on regarde depuis combien de temps il est la
NB_SEC_CREATE=$(stat /tmp/testdate.txt -c %X)
NB_SEC_ACTUELLE=$(date +%s)
nb_sec=$(expr $NB_SEC_ACTUELLE - $NB_SEC_CREATE)
if [ $nb_sec > $NB_SECONDES_ATTENTE ]
then
#on depasse le temps d'attente, on relance
telnet_adsl_restart | telnet
rm -f /tmp/testdate.txt
fi
fi
else
rm -f /tmp/testdate.txt
fi
rm /var/run/surv_rezo.lock
Re: Script pour reboot le routeur
sinon, pas con ton utilisation du find, j'y ai pas pensé... j'ai fait un truc plus compliqué 
Re: Script pour reboot le routeur
Alors j'ai pu tester en ping et avec nc.
Le script final donne ça:
Ce que je fais, je désactive le mobiledata de mon routeur 4G, comme ça plus d'internet.
Quand le lance le script j'ai ça :
(Pour le find, je dis merci à chatGPT... j'avoue ne pas toucher grand chose à la syntaxe donc je tente pas mal de truc en m'aide de l'AI
)
Le script final donne ça:
Code : Tout sélectionner
#!/bin/bash
nc -w 5 -z www.google.com 443
nc1=$?
nc -w 5 -z www.free.fr 443
nc2=$?
if [ $nc1 -ne 0 ] && [ $nc2 -ne 0 ] && [ ! -f "ping_nok" ]; then
sudo touch ping_nok
elif [ $nc1 -ne 0 ] && [ $nc2 -ne 0 ] && [ -f "ping_nok" ] && [ $(find ping_nok -mmin +1) ]; then
echo "reboot routeur"
else
sudo rm -f ping_nok
echo "le fichier ping_nok n'existe pas"
fiQuand le lance le script j'ai ça :
Et pas de fichier ping_nok...nc: getaddrinfo for host "www.google.com" port 443: Temporary failure in name resolution
nc: getaddrinfo for host "www.free.fr" port 443: Temporary failure in name resolution
(Pour le find, je dis merci à chatGPT... j'avoue ne pas toucher grand chose à la syntaxe donc je tente pas mal de truc en m'aide de l'AI
Re: Script pour reboot le routeur
Ca y est ça fonctionne avec le ping par contre.
J'ai pu tout tester.
Il me reste la partie reboot du routeur 
J'ai pu tout tester.
Code : Tout sélectionner
#!/bin/bash
# Ping les adresses 8.8.8.8 et 1.1.1.1
ping -c 1 8.8.8.8 > /dev/null
ping1=$?
ping -c 1 1.1.1.1 > /dev/null
ping2=$?
if [ $ping1 -ne 0 ] && [ $ping2 -ne 0 ] && [ ! -f "ping_nok" ]; then
sudo touch ping_nok
echo "creation fichier ping_ok"
elif [ $ping1 -ne 0 ] && [ $ping2 -ne 0 ] && [ -f "ping_nok" ] && [ $(find ping_nok -mmin +1) ]; then
echo "reboot routeur"
elif [ $ping1 -ne 1 ] && [ $ping2 -ne 1 ] && [ -f "ping_nok" ]; then
sudo rm -f ping_nok
echo "suppression fichier ping_ok"
fiRe: Script pour reboot le routeur
Bon je bloque là...
J'ai installé telnet sur le raspberry.
J'arrive à me connecter au routeur grâce à telnet (via la liaison ssh).
Il me demande mon mot de passe après la connexion.
Seulement je ne trouve pas la syntaxe pour écrire la ligne de code qui inclut le mot de passe dans mon script.
J'ai installé telnet sur le raspberry.
J'arrive à me connecter au routeur grâce à telnet (via la liaison ssh).
Il me demande mon mot de passe après la connexion.
Seulement je ne trouve pas la syntaxe pour écrire la ligne de code qui inclut le mot de passe dans mon script.
Re: Script pour reboot le routeur
Donc j'ai écris le script suivant:
Mais quand je le lance, je suis en attente pour rentrer le password.
Quand je quitte (ctrl+C), là il m'affiche motdepasse.
EDIT: Désolé Keros, je ne connaissais pas cette fonction. Je tâcherai de m'en souvenir.
Mais quand je le lance, je suis en attente pour rentrer le password.
Quand je quitte (ctrl+C), là il m'affiche motdepasse.
EDIT: Désolé Keros, je ne connaissais pas cette fonction. Je tâcherai de m'en souvenir.
Dernière modification par bartras le 22 mars 2023, 12:53, modifié 2 fois.
Modération
batras, dans ton message précédent, tu as mis une image hébergée à l'extérieur du forum. Il y a de fort risques qu'elles ne soient plus disponibles dans quelque temps comme ici, là ou encore là. Est-ce que tu peux éditer ton message et utiliser l'onglet Fichiers joints en dessous de la zone d'écriture des messages pour enregistrer les éléments sur le serveur du forum. Merci