#!/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"
    
    
