adding TestON
diff --git a/TestON/bin/generatedriver.py b/TestON/bin/generatedriver.py
new file mode 100644
index 0000000..f8e3422
--- /dev/null
+++ b/TestON/bin/generatedriver.py
@@ -0,0 +1,317 @@
+#!/usr/bin/env python
+'''
+Created on 11-Oct-2012
+
+@authors: Anil Kumar (anilkumar.s@paxterrasolutions.com),
+
+ TestON is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ TestON is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TestON. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+'''
+import pexpect
+import struct, fcntl, os, sys, signal
+import sys
+import re
+sys.path.append("../")
+from core import xmldict
+
+class GenerateDriver():
+ '''
+ This will
+ '''
+ def __init__(self):
+ self.default = ''
+ self.prompt = '>'
+ self.LASTRSP =''
+ self.command_dictionary = {}
+ self.config_details = {}
+ self.last_sub_command = None
+ self.commnads_ordered_list = []
+ filePath = "generatedriver.cfg"
+ self.configFile = filePath
+ try :
+ xml = open(filePath).read()
+ self.config_details = xmldict.xml_to_dict(xml)
+ except :
+ print "Error : Config file " + self.configFile + " not defined properly or file path error"
+ sys.exit()
+ print self.config_details
+ self.device_name = ''
+
+ def connect(self,**connectargs):
+ '''
+ Connection will establish to the remote host using ssh.
+ It will take user_name ,ip_address and password as arguments<br>
+ and will return the handle.
+ '''
+ for key in connectargs:
+ vars(self)[key] = connectargs[key]
+
+ ssh_newkey = 'Are you sure you want to continue connecting'
+ refused = "ssh: connect to host "+self.ip_address+" port 22: Connection refused"
+ if self.port:
+ self.handle =pexpect.spawn('ssh -p '+self.port+' '+self.user_name+'@'+self.ip_address,maxread=50000)
+ else :
+ self.handle =pexpect.spawn('ssh '+self.user_name+'@'+self.ip_address,maxread=50000)
+
+ self.logfile_handler = open(os.getcwd()+"/GenerateDriver.log","w+")
+ self.handle.logfile = self.logfile_handler
+ i=self.handle.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT,refused],10)
+
+ if i==0:
+ self.handle.sendline('yes')
+ i=self.handle.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT])
+ return self.handle
+ if i==1:
+ self.handle.sendline(self.pwd)
+ self.handle.expect('>|#|$')
+ return self.handle
+ elif i==2:
+ print "ssh: connect to host "+self.ip_address+": Error"
+ return False
+ elif i==3: #timeout
+
+ print "ssh: connect to host "+self.ip_address+": Connection timed out"
+ return False
+ elif i==4:
+ print "ssh: connect to host "+self.ip_address+": Connection refused"
+ return False
+
+ self.handle.sendline("\r")
+ return self.handle
+
+ def execute(self, **execparams):
+ '''
+ This method will execute the command and will check for the expected prompt.
+ '''
+ self.LASTRSP = ''
+ defaultPrompt = '.*[\$>\#]'
+ for key in execparams:
+ vars(self)[key] = execparams[key]
+
+ self.handle.sendline(self.cmd)
+ timeoutVar = self.timeout if self.timeout else 10
+
+ index = self.handle.expect([self.prompt, "byte\s\d+", 'Command not found.', pexpect.TIMEOUT,"\n:",pexpect.EOF], timeout = timeoutVar)
+ if index == 0:
+ self.LASTRSP = self.LASTRSP + self.handle.before
+ #print "Expected Prompt Found"
+ elif index == 1:
+ self.LASTRSP = self.LASTRSP + self.handle.before
+ self.handle.send("\r")
+ print("Found More screen to go , Sending a key to proceed")
+ indexMore = self.handle.expect(["byte\s\d+", self.prompt], timeout = timeoutVar)
+ while indexMore == 0:
+ print "Found another More screen to go , Sending a key to proceed"
+ self.handle.send("\r")
+ indexMore = self.handle.expect(["byte\s\d+", self.prompt,pexpect.EOF,pexpect.TIMEOUT], timeout = timeoutVar)
+ self.LASTRSP = self.LASTRSP + self.handle.before
+ #print self.LASTRSP
+ elif index ==2:
+ print "Command not found"
+ self.LASTRSP = self.LASTRSP + self.handle.before
+ elif index ==3:
+ print "Expected Prompt not found , Time Out!!"
+ return False
+ elif index == 4:
+
+ self.LASTRSP = self.LASTRSP + self.handle.before
+ self.handle.sendcontrol("D")
+ #print "AA"*89
+ indexMore = self.handle.expect(["\n:", self.prompt,pexpect.EOF,pexpect.TIMEOUT], timeout = timeoutVar)
+ while indexMore == 0:
+ self.handle.sendcontrol("D")
+
+ indexMore = self.handle.expect(["\n:", self.prompt,".*",pexpect.EOF,pexpect.TIMEOUT], timeout = timeoutVar)
+ self.LASTRSP = self.LASTRSP + self.handle.before
+
+ return self.LASTRSP
+
+ def configure(self):
+ '''
+ Will start the Configure mode of the device.
+ '''
+ config_result = self.execute(cmd="configure",prompt='\#',timeout=10)
+ return config_result
+
+ def get_command_help(self,command):
+ '''
+ Will get the help of the Command
+ '''
+
+ self.handle.setecho(False)
+ help_keyword = self.config_details['device'][self.device_name]['help_keyword']
+ interrupt_key = self.config_details['device'][self.device_name]['interrupt_key']
+ command_details = self.execute(cmd=command+" "+help_keyword,prompt='\#',timeout=2)
+ #command_details = self.execute(cmd=command+" "+help_keyword,prompt='\#',timeout=2)
+ self.handle.sendcontrol(interrupt_key)
+ #print command_details
+ return command_details
+
+ def get_command_details(self,command):
+ '''
+ Will Update the command_dictionary with the available commands details
+ '''
+
+ temp_dictionary = {}
+ command_resulut = self.get_command_help(command)
+ try :
+ words = command_resulut.split("\n")
+ except AttributeError,e:
+ print e
+ return
+ lines = command_resulut.split("\n")
+ options_list = []
+ for line in lines :
+ value_match = re.search('[\s|\>|\+|\-|\<]{3}(\<(\w+))\s*',line)
+ if value_match:
+ print " Enter Value for "+value_match.group(2)
+ #self.handle.interact()
+ else:
+ match = re.search(r"\s\s[\w|-]+\s\s",line)
+ if match :
+ match_command = match.group(0)
+ print match_command
+ options_list.append(match_command)
+
+ temp_dictionary[command] = options_list
+ self.command_dictionary[command] = options_list
+ self.print_details(self.command_dictionary)
+ print "temp dir: --------"
+ print temp_dictionary
+ print "-------------"
+ return temp_dictionary
+
+ def print_details(self,command_dictionary):
+ '''
+ Will print the details in Tree Format
+ '''
+ self.commnads_ordered_list = command_dictionary.keys()
+ # Sorting the output based on the length of the command string
+ length = len(self.commnads_ordered_list ) - 1
+ sorted = False
+
+ while not sorted:
+ sorted = True
+ for i in range(length):
+ if len(self.commnads_ordered_list[i]) > len(self.commnads_ordered_list[i+1]):
+ sorted = False
+ self.commnads_ordered_list[i], self.commnads_ordered_list[i+1] = self.commnads_ordered_list[i+1], self.commnads_ordered_list[i]
+
+ for key in self.commnads_ordered_list:
+ print key +"\t "+str(command_dictionary[key])
+ print "\n\n"
+
+
+ def get_details_recursive(self,main_comand):
+ try :
+ self.last_sub_command = main_comand.split()[len(main_comand.split())-1]
+ except :
+ self.last_sub_command = ''
+ main_result_dcitionary = self.get_command_details(main_comand)
+ if main_result_dcitionary :
+ for key in main_result_dcitionary.keys():
+ for index, each_option in enumerate(main_result_dcitionary[key]) :
+
+ if re.search(self.config_details['device'][self.device_name]['end_pattern']+"|^\.|^\d",str(main_result_dcitionary[key][index])):
+ print "Reached the last argument for this "+main_comand+" "+str(each_option)+"\n"
+ main_result_dcitionary[key].remove(each_option)
+ return
+ elif self.last_sub_command == str(main_result_dcitionary[key][index]):
+ print "Same command repeating, So Exiting "+main_comand+" "+str(each_option)+"\n"
+ main_result_dcitionary[key].remove(each_option)
+ break
+ result_dcitionary = self.get_details_recursive(main_comand+" "+str(each_option))
+
+ return
+ def create_driver(self):
+ name = self.device_name
+ driver_file_data = 'class '+name +":\n"
+ driver_file_data = driver_file_data + " def __init__( self ):\n"
+ driver_file_data = driver_file_data + " self.prompt = '(.*)'\n self.timeout = 60 \n\n"
+
+ for index,command in enumerate(self.commnads_ordered_list) :
+ api_data = ' def '
+ command_as_api = re.sub(" ","_" , command, 0)
+ command_as_api = re.sub("\.|\-|\\|\/|\/","" , command_as_api, 0)
+ current_letter = 0
+ underscore_count = 0
+ command_temp = ""
+ for c in command_as_api:
+ current_letter = current_letter + 1
+ if c == "_":
+ underscore_count = underscore_count+1
+ else:
+ underscore_count = 0
+ if underscore_count > 1:
+ command_temp = command_temp + ""
+ else:
+ command_temp = command_temp + c
+ if command_temp[len(command_temp)-1] == "_":
+ command_temp = command_temp[0:len(command_temp)-1]
+ command_as_api = command_temp
+ #options = ''
+ #for option in self.command_dictionary[command]:
+ #options = options+',' + option
+
+ #options = re.sub("^\s*,|,$","" , options, 0)
+ api_data = api_data + command_as_api+"(self, *options, **def_args ):\n"
+ api_data = api_data + " '''Possible Options :"+str(self.command_dictionary[command])+"'''\n"
+ api_data = api_data + " arguments= ''\n"
+ api_data = api_data + " for option in options:\n"
+ api_data = api_data + " arguments = arguments + option +' ' \n"
+ api_data = api_data + " prompt = def_args.setdefault('prompt',self.prompt)\n"
+ api_data = api_data + " timeout = def_args.setdefault('timeout',self.timeout)\n"
+
+ api_data = api_data + " self.execute( cmd= \""+ command + " \"+ arguments, prompt = prompt, timeout = timeout ) \n"
+ api_data = api_data + " return main.TRUE\n"
+
+ driver_file_data = driver_file_data + api_data +"\n"
+ driver_file = open(os.getcwd()+"/"+name.lower()+".py", 'w')
+ driver_file.write(driver_file_data)
+ print driver_file_data
+
+ def disconnect(self):
+ result = True
+ return result
+
+ import pexpect
+
+if __name__ == "__main__":
+
+ generate = GenerateDriver()
+ import sys
+ device_name = sys.argv[1]
+ generate.device_name = device_name
+ ip_address = generate.config_details['device'][device_name]['ip_address']
+ user_name = generate.config_details['device'][device_name]['user_name']
+ password = generate.config_details['device'][device_name]['password']
+ command = generate.config_details['device'][device_name]['command']
+ commandlist = re.sub("(\[|\])", "", command)
+ commandlist = list(eval(command+','))
+ connect_handle = generate.connect(user_name = user_name ,ip_address = ip_address, pwd = password , port = None)
+ if connect_handle :
+ # generate.configure()
+
+ for root_command in commandlist :
+ generate.get_details_recursive(root_command)
+
+ generate.create_driver()
+ generate.disconnect()
+ #generate.get_command_details(main_command)
+ else :
+ print "Connection Failed to the host"
+
+