2016-07-05 2 views
1

J'ai un script pour le routeur telnet et s'il ne peut pas ping 8.8.8.8 pour redémarrer le routeur, mais je ne veux pas qu'il redémarre le routeur plus de trois fois de suite. S'il ne parvient pas à pinger le 8.8.8.8 après trois fois, je veux qu'il continue de faire un ping jusqu'à 8.8.8.8 jusqu'à ce qu'il revienne et recommence tout recommencer.Python: Comment faire en sorte que l'instruction else s'exécute x fois?

import subprocess 
output = subprocess.call('ping 8.8.8.8', shell=True) 
while output == 0: 
output = subprocess.call('ping 8.8.8.8', shell=True) 
else: 
import telnetlib 
import datetime 

now = datetime.datetime.now() 

host = "912.168.1.1" # your router ip 
username = "name" # the username 
password = "password" 
filename_prefix = "cisco-backup" 

tn = telnetlib.Telnet(host) 
tn.read_until("Username:") 
tn.write(username+"\n") 
tn.read_until("Password:") 
tn.write(password+"\n") 
tn.write("reload"+"\n") 
tn.write("y"+"\n") 
enter code here 

Je suis seulement nouveau à cela et je ne sais pas comment obtenir l'instruction else à répéter seulement trois fois de suite.

+0

Vous avez besoin d'une boucle après le 'else'. Cependant, il est inutile d'avoir un 'else' sur une boucle' while' si vous n'avez pas 'break'. Le 'else' est redondant. – cdarke

Répondre

0

Il vous manque des indentations, alors j'espère avoir trouvé votre logique, de toute façon les choses suivantes devraient faire ce que vous voulez.

Dans votre cas, il est inutile d'utiliser l'instruction else car cela ne vous mettra que dans une position où vous devrez créer une autre boucle while. Une autre difficulté est de déplacer la ligne output = subprocess.call... à la fin de la boucle while, après que le routeur a été réinitialisé (si vous avez entré la boucle, il est clair que le routeur ne répond pas, aucune raison d'essayer à nouveau avant le redémarrage).

J'ai ajouté la variable retries pour garder une trace du nombre de réinitialisations du routeur et l'ajouter comme condition à la boucle while. Si les tentatives dépassent 3 fois la boucle se cassera.

import subprocess 
retries = 0 
output = subprocess.call('ping 8.8.8.8', shell=True) 
while (output == 0 and retries < 3): 
    import telnetlib 
    import datetime 

    now = datetime.datetime.now() 

    host = "912.168.1.1" # your router ip 
    username = "name" # the username 
    password = "password" 
    filename_prefix = "cisco-backup" 

    tn = telnetlib.Telnet(host) 
    tn.read_until("Username:") 
    tn.write(username+"\n") 
    tn.read_until("Password:") 
    tn.write(password+"\n") 
    tn.write("reload"+"\n") 
    tn.write("y"+"\n") 
    output = subprocess.call('ping 8.8.8.8', shell=True) 
    retries += 1 

if (retries == 3): 
    print ("Couldnt restore router") 
0

vous pouvez essayer de faire cela:

si je comprends bien, ce que vous essayez de faire est de faire un script le essayera continuellement ping 8.8.8.8 et si elle échoue, il redémarre la routeur (au plus 3 fois) si le redémarrage n'a pas aidé le script devrait ping sur 8.8.8.8 jusqu'à ce qu'il réussisse. après cela, le script va recommencer .

import subprocess 
output = 0 
while output == 0: 
    output = subprocess.call('ping 8.8.8.8', shell=True) 

    for i in xrange(3): #will restart the router until ping works OR at most 3 times 

     if output == 0: # if the ping succeeded don't restart the router 
      break 

     import telnetlib 
     import datetime 

     now = datetime.datetime.now() 

     host = "912.168.1.1" # your router ip 
     username = "name" # the username 
     password = "password" 
     filename_prefix = "cisco-backup" 

     tn = telnetlib.Telnet(host) 
     tn.read_until("Username:") 
     tn.write(username+"\n") 
     tn.read_until("Password:") 
     tn.write(password+"\n") 
     tn.write("reload"+"\n") 
     tn.write("y"+"\n") 

     output = subprocess.call('ping 8.8.8.8', shell=True) #after restarting the router check the ping again 

    #after the loop 
    while output != 0: output = subprocess.call('ping 8.8.8.8', shell=True) #will ping until the ping work