Python Script to Reboot the LinkSys EA3500 router
this is followup of How to SSH on LINKSYS ROUTER with USB Port, I shall now detail the Python Script which is running on my Synology NAS 712 connected to the LINKSYS EA3500 router.
pls read the post Rebooting the ADSL Router when it cannot Access Internet to ready the NAS for running the python script. module required is “pexpect”.
# python script to reboot the devices using SSH
import sys
import os
import socket
import logging
import re
import pexpect
# import getpass
pathname = os.path.dirname(sys.argv[0])
# print 'path =', pathname
# print 'full path =', os.path.abspath(pathname)
fullpath = os.path.abspath(pathname)
logging.basicConfig(filename= fullpath + '/mxHomeEA3500.log',level=logging.DEBUG, format='%(asctime)s %(message)s', datefmt='%d/%m/%Y %I:%M:%S %p')
PROMPT = "$|%|>|#" # add the prompt with |prompt
# check if google is reachable
def net_test():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.google.com", 80))
return True
except socket.error:
return False
# connect to Router via SSH
class SSH:
def __init__(self, user, password, host):
#print "test ssh" # uncomment to debug
self.child = pexpect.spawn("ssh %s@%s"%(user, host))
i = self.child.expect(['assword:', r"yes/no"], timeout=120)
if i==0:
#print "0" # uncomment to debug
logging.info('-EA3500 SHH Key Accepted')
self.child.sendline(password)
#response = self.child.before
elif i==1:
#print "1" # uncomment to debug
logging.info('-EA3500 SHH Key not yet Accepted')
self.child.sendline("yes")
self.child.expect("assword:", timeout=120)
self.child.sendline(password)
self.child.expect(PROMPT)
#print self.child.before
def command(self, command):
"""send a command and return the response"""
self.child.sendline(command)
self.child.expect('Connection to 192.168.1.1 closed.')
# waiting for PROMPT returns error in pexpect after command reboot
#self.child.expect(PROMPT)
#response = self.child.before
#return response
return 'Connection to 192.168.1.1 closed.' # this is response from EA3500
def close(self):
"""close the connection"""
self.child.close()
if __name__=="__main__":
network = net_test() # Testing network connection.
#print network # uncomment to debug
if network == True: # Used for Debug
# if network == False: # this the true test, when google is not available reboot the router
logging.error('-EA3500 192.168.1.1 Reboot due to hang') #print "Rebooting it!"
# adsl_reboot() # Rebooting the modem. # check my post of PEXPECT module of Python
#password = getpass.getpass("Password: ")
password = "kamath17@"
ssh = SSH("root", password, "192.168.1.1")
# print ssh.command("pwd") # uncomment to debug ie check if other command work
#print ssh.command("dir") # uncomment to debug ie check if other command work
logging.info(ssh.command("reboot")) # comment to debug ie check if other command work
ssh.close()
save the script in /volume1/myScripts/rebootEA.py a share folder and make a log file /volume1/myScripts/mxHomeEA3500.log. Now we can configure the NAS to Run the Python Script
Step 1: go to Control panel > Task Scheduler

Step 2: Create a new Task Scheduler > user script

Step 3: Follow the Step on Image

Step 4:Ensure you select the schedule as per the requirement; in this case a test every Hrs look reasonable and the reboot is initiated only if the google website is not reachable

Step 5: to Test the script by clicking RUN

If not working or error, ie you do not see the EA3500 rebooting, Follow the following Step
Step 6: SSH to the NAS as root and run the script from prompt
> ssh root@ipAddrNas > Password: admin password nas> cd /volume1/myScripts/ nas> python rebootEA.py
check the outputs on the terminal for Error; maybe you should uncomment lines in script to make the debug easy.


Reblogged this on Sutoprise Avenue, A SutoCom Source.