Script qui détecte l'état d'une connexion internet

xunil2003 Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai fait un script pour tester l'état de la connexion d'internet par l'ip public tous les x temps. si pas de connexion, il l'inscrit dans un fichier txt, si la connexion est fonctionnelle, ne rien faire.
Ce script je l'ai j'ajouté dans mes services /etc/init.d/eci.sh .

L'avantage d'utiliser le stop et start et de stopper le service pour changer le temps entre chaque test de connexion et de le démarrer. Cela me permet d'écrire à mon FAI et de lui indiquer les dates et heures auquel je n'avais pas de connexion internet.

1er script
#!/bin/bash    

#---------- Configuration ----------#    
ip="78.xxx.xx.xxx"     
annee=$(date +%Y) # année    
temps=900 #Indiquer le temps en secondes    
# 5 minutes : 60 x 5 = 300    
# 15 minutes : 60 x 15 = 900    
# 30 minutes : 60 x 15 = 1800    
# 45 minutes : 60 x 15 = 2700    
# 1 heure : 60 x 15 = 3600    

#---------- Script ----------#    
while [ 1 ]; do     
sleep $temps    
date=$(date +%d/%m/%Y) #jouur    
heure=$(date +%H:%M:%S) #heure    
ping -c 1 "$ip" > /dev/null    
if [ 'echo $?' -eq 0 ]; then     
 #echo "$date $heure : Connexion internet accessible."    
 echo ""    
 else    
 #echo "$date $heure : Pas de connexion internet disponible, contacter votre FAI."    
 #echo "$date $heure : Operateur : $FAI, téléphone : $telephone, identifiant : $identifiant, code : $code"    
 echo "$date $heure : Pas de connexion internet disponible." >> /home/serveur/Rapports/$annee-etat-connxion-internet.txt    
fi    
done;     


Mais il y a un problème qui se pose :

Il est vrai que si mon script détecté l'état de la connexion par lip public, le problème reste que si la box est débranchée ou redémarrée, le script va croire qu'il n'y a plus internet. Or il y aura toujours internet.

Donc j'ai modifié le script pour qu'il teste aussi l'adresse DNS de la box.

Donc si l'adresse privée est pas détecté affiche rien et pour le non affiche un message et test immédiatement après l'adresse dns de la box est affiche un message si oui ou non.

2ème script
#!/bin/bash    

#---------- Configuration ----------#     
ip="78.xxx.xx.xxx"     
dns=192.168.0.251    
annee=$(date +%Y) # année    
temps=60 # 5 minutes    
# 5 minutes : 60 x 5 = 300    
# 15 minutes : 60 x 15 = 900    
# 30 minutes : 60 x 15 = 1800    
# 45 minutes : 60 x 15 = 2700    
# 1 heure : 60 x 15 = 3600    

#---------- Script ----------#    
while [ 1 ]; do     
#sleep $temps    
date=$(date +%d/%m/%Y) #jouur    
heure=$(date +%H:%M:%S) #heure    
while [ 1 ]; do     
sleep $temps    

ping -c 1 "$ip" > /dev/null    
if [  $? -eq 0 ];    
then    
    echo "La connexion internet est accessible"    
    #net="La connexion internet est accessible sur l'ip $ip"    
else    
    #echo "pas de connexion internet disponible !"    
    net="Pas de connexion internet disponible sur l'ip $ip !"    
fi    
ping -c 1 "$dns" > /dev/null    
if [ $? -eq 0 ];    
then    
    #echo "La box est disponible sur le réseau"    
    local=". La box est disponible sur le réseau a l'adresse dns $dns"    
else    
    #echo "La box n'est pas disponible sur le réseau"    
    local=". La box n'est pas disponible sur le réseau a l'adresse dns $dns"    
fi    
echo "$date $heure : $net $local"    
echo "$date $heure : $net $local." >> /home/serveur/Rapports/$annee-etat-connxion-internet.txt    
exit 0    


Quand pensez vous ?
Mais je voudrais savoir si il est possible de faire mieux ?
Car il me faut un script fiable pour pouvoir y communiquer à mon FAI.

Merci.

3 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Le truc c'est que tu peux avoir un DNS attribué sans pour autant avoir de connectivité. En effet c'est le serveur DHCP de ta box qui te l'attribue, donc elle peut te dire "ton DNS est 192.168.1.1" sans pour autant que tu puisses faire une résolution DNS.

D'autant que là tu pingues une adresse de ton réseau local !

C'est pourquoi à ta place si le but est de tester la disponibilité du DNS, je ferai explicitement une résolution DNS (en admettant que tu utilises le DNS de ton FAI) par exemple avec la commande nslookup puis je contrôlerais sa valeur de retour (stockée dans $? en shell). En effet un ping n'est pas suffisant en soi (ne serait-ce que parce que la machine en question peut répondre au ping sans répondre à une requête DNS, par exemple si le serveur DNS est stoppé).

Après si l'idée c'est de tester ta connectivité grâce à ping, tu peux faire beaucoup plus simple et pinguer une destination arbitraire, par exemple 8.8.8.8 ou www.google.fr et regarder ce qu'elle retourne.

Bonne chance
1
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Un exemple :

(mando@silk) (~) $ nslookup www.google.fr  
Server:         127.0.0.1  
Address:        127.0.0.1#53  

Non-authoritative answer:  
Name:   www.google.fr  
Address: 173.194.78.94  

(mando@silk) (~) $ echo $?  
0


Comme indiqué dans le man nslookup renvoie 0 si tout va bien. Supposons maintenant que je coupe mon DNS et que je relance cette commande :

(mando@silk) (~) $ nslookup www.google.fr 
;; connection timed out; no servers could be reached 

(mando@silk) (~) $ echo $? 
1


Si on suppose que ce DNS est le DNS du FAI le fait que nslookup ne retourne pas 0 signifie que soit on n'est pas parvenu à router le DNS, soit cette machine ne répond pas au serveur DNS. Dans les deux cas une résolution DNS n'est plus possible.

Maintenant le fait de ne pas avoir de DNS ne signifie pas ne pas avoir de connectivité vers l'Internet. Par exemple, bien que mon DNS soit ici coupé, je peux tout à fait pinger des destinations Internet (par exemple 173.194.78.94) :

(mando@silk) (~) $ ping -c2 173.194.78.94 
PING 173.194.78.94 (173.194.78.94) 56(84) bytes of data. 
64 bytes from 173.194.78.94: icmp_req=1 ttl=44 time=29.7 ms 
64 bytes from 173.194.78.94: icmp_req=2 ttl=44 time=29.7 ms 

--- 173.194.78.94 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 29.711/29.720/29.730/0.172 ms 


Ici on voit donc que la connectivité vers l'Internet est assurée et que la panne est au niveau des DNS. La question qui se pose c'est qu'est ce que ton script diagnostique et qu'est ce qu'on appelle la "disponibilité" d'un FAI. S'agit-il du fait qu'il peut router tes paquets, résoudre et router, etc...

Bonne chance
1
xunil2003 Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   14
 
Bonjour,


Je n'ai pas très bien compris, vous voulez dire comme ceci :
dns="192.168.0.254" #dns de la box 
nslookup -sil "$dns" > /dev/null 
if [  $? ]; 
then 
    echo "$date $heure : La connexion internet est accessible" 
else 
    echo "$date $heure : pas de connexion internet disponible !" 
fi


Résultat :
serveur@debian:~$ bash /home/serveur/bash/demarrage/etat-connexion-internet.sh
Server:         212.27.40.240
Address:        212.27.40.240#53

** server can't find 254.0.168.192.in-addr.arpa.: NXDOMAIN

25/04/2013 12:35:08 : La connexion internet est accessible
serveur@debian:~$ 


Quand vous dite "tester la disponibilité du DNS" vous voulez dire l' adresse dns de la box ou le dns 1 et dns2 du fai ?

Merci.
0