示例#1
0
class cmResetTelnet(process):
    cm_uptime = ".1.3.6.1.2.1.1.3.0"
    timeOut = 300
    def __init__(self, ppi, iterations):
            print("cmResetTelnet CTOR")
            process.__init__(self, ppi)
            self.ResetCLIRep = Reporter(ppi)
            self.ResetCLIRep.set_testCaseTitle("CM Reset by CLI Record")
            self.individualResults = {}
            self.rawTimes= []
            self.resultsList = []
            self.overallResults = {}
            self.startReport()
            self.Pass_Ct = 0
            self.Fail_Ct = 0
            self.iterations = iterations
            

    def execute(self, pp):
        passed = False
        for int in range (self.iterations):
            if not ToolKit.isModemOnline(self.pp):
                # modem not online - log results and bail
                self.individualResults['msg'] = "Cable modem is not connected or not online"
                self.individualResults['error'] = 1
                self.individualResults['time'] = 0
                self.resultsList.append(self.individualResults)
                self.overallResults['Avg_Time'] = self.getAvg()
                self.overallResults['Fastest_Time']= min(self.rawTimes)
                self.overallResults['Slowest_Time']= max(self.rawTimes)
                self.overallResults['Attempts'] = int
                self.overallResults['Successful'] = self.Pass_Ct
                self.wrapUpReport(False, "CM is not online")
                print("Cable modem is not connected or not online")
                return

        
            print("Iteration #" + str(int + 1) + " of " + str(self.iterations))
            # Connect
            try:
                cmtsIP = self.pp.get_cmts['cmtsIp']
                tn = telnetlib.Telnet(cmtsIP,timeout=3)
                time.sleep(.5)
                self.lastResponse = tn.read_very_eager().decode("ascii").upper()
            except Exception as xcp:
                # Failed due to telnet rejection
                self.telnetFail('Telnet Rejected', 2)
                continue

            # sign-on
            rez = self.signOn(tn)
            if rez != 'OK':
                # Failed due to sign-on rejection
                rez = 'Failed Telnet Sign-On with the following response => ' + str(rez)
                self.telnetFail(rez, 3, tn)
                continue

            # enable
            rez = self.enable(tn)
            if rez != 'OK':
                # Failed on enable command
                rez = 'CM Rejected Enable Command with the following response =>' + str(rez)
                self.telnetFail(rez, 4, tn)
                continue

            # reset modem
            rez = self.reset(tn)
            if rez != 'OK':
                # Failed on reset command
                rez = "CM Rejected Reset Command with the following response => " + str(rez)
                self.telnet(rez, 5, tn)
                continue

            #StartTimer
            startTime = time.time()

            # verify modem is down
            time.sleep(1)
            rez = self.verifyModemDown(tn)
            if rez != 'OK':
                # Modem is still online
                rez = "CM Failed to Reset - Continues to reply to uptime MIB"
                self.telnetFail(rez, 6, tn)
                continue

            # wait for modem to return to service
            rez = self.waitForRecovery()
            if rez!= 'OK':
                # Modem didn't recover in 5 minutes
                rez = "CM waitForRecovery Timed Out"
                self.telnetFail(rez, 7, tn)
                continue

            # calculate time
            DeltaTime = time.time() - startTime

            # log success
            self.individualResults['msg'] = "successfully timed Reset via CMTS CLI command"
            self.individualResults['error'] = '0' # no error
            self.individualResults['time'] = DeltaTime
            self.resultsList.append(self.individualResults)
            self.rawTimes.append(DeltaTime)

            # increment counter
            self.Pass_Ct +=1
            print("Iteration succeeded")           
            
            # cycle telnet
            self.elegantShutdown(tn)
            time.sleep(.5)

        # compute timed results
        if len(self.rawTimes) > 0:
            avg = self.getAvg()
            self.overallResults['Avg_Time'] = round(avg,2)
            self.overallResults['Fastest_Time']= round(min(self.rawTimes),2)
            self.overallResults['Slowest_Time']= round(max(self.rawTimes),2)
            if self.Pass_Ct > self.iterations/2:
                passed = True
        finValue = "Average Time to Reset => " + str(avg)
        self.overallResults['Attempts'] = self.iterations
        self.overallResults['Successful'] = self.Pass_Ct
        self.wrapUpReport(passed, finValue )


    def getAvg(self):
        list(filter(lambda a: a != 0, self.rawTimes))
        try:
            return sum(self.rawTimes)/len(self.rawTimes)
        except Exception as xcp:
            return 0


    def snmpGetWrapper(self, oids):
        try:
            session = Session(hostname= self.pp.get_cmip, community="public", version=2, timeout=1, retries=1, )
            return session.get(oids)
        except Exception as xcp:
            print(xcp)
            # print traceback.print_exc()
            return {'error': 1, 'msg': str(xcp)}


    def elegantShutdown(self, telnt):
        try:
            telnt.write(b"enable\n")
            time.sleep(.5)
        except Exception as xcp:
            i=3
        try:
            telnt.close()
        except Exception as xcp:
            i=3

    
    def telnetFail(self, res, err, tel=None):
        print("Iteration failed with error code " + str(err) + " => " + res)
        # log failure
        self.individualResults['msg'] = res
        self.individualResults['error'] = err
        self.individualResults['time'] = 0
        self.resultsList.append(self.individualResults)
        # increment counter
        self.Fail_Ct += 1 
        # cycle telnet
        if not tel is None:
            self.elegantShutdown(tel)
            time.sleep(.5)

    def waitForRecovery(self):
        startTime = time.time()
        inc = 0
        time.sleep(.5)
        while True:
            try:
                response = self.snmpGetWrapper(cmResetTelnet.cm_uptime)
                if 'dict' not in str(type(response)) and 'snmp' in str(type(response)):
                    return 'OK'
            except Exception as xcp:
                time.sleep(1)
            if  time.time() - startTime > cmResetTelnet.timeOut:
                return "Modem Failed to Return to Service"
     

    def verifyModemDown(self, telnt):
        time.sleep(1)
        try:
            response = self.snmpGetWrapper(cmResetTelnet.cm_uptime)
            respType = type(response)
            if 'dict'  in str(type(response)) and 'snmp' not in str(type(response)):
                return 'OK'
        except Exception as xcp:
            return 'OK'
        return 'Failed to Reset Modem'
    
    def reset(self, telnt):
        mac = self.pp.get_cmmac
        msg = 'clear cable modem ' + mac + ' reset\n'
        b = msg.encode()
        try:
            telnt.write(b)
            return 'OK'
        except Exception as xcp:
            return str(xcp)
        return 'Unk Cause - Reset Failed'
         

    def enable(self, telnt):
        try:
            telnt.write(b"enable\n")
            time.sleep(.5)
            self.lastResponse  = telnt.read_very_eager().decode("ascii")  
            # send reset     
            if '#' in self.lastResponse:
                return 'OK'
        except Exception as xcp:
            return str(xcp)
        return 'Enable Failed'


    def signOn(self, telnt):
        # sign-on
        if 'username' in self.lastResponse.lower():
            try:
                telnt.write(b"engine\n")
                time.sleep(.5)
                self.lastResponse  = telnt.read_very_eager().decode("ascii")
            except Exception as xcp:
                return str(xcp)
        if 'password' in self.lastResponse.lower():
            try:
                telnt.write(b"g01ng2w0rk\n")
                time.sleep(.5)
                self.lastResponse = telnt.read_very_eager().decode("ascii")
                return 'OK'
            except Exception as xcp:
                return str(xcp)
        return 'failed unknown reason'


    def wrapUpReport(self, verdict, reportValue):
        self.overallResults['cmip'] = self.pp.get_cmip
        self.ResetCLIRep.set_endDate()
        self.ResetCLIRep.set_endTime()
        self.ResetCLIRep.logger.debug(self.overallResults)
        self.ResetCLIRep.addLogs(self.overallResults)
        if verdict == True:
            self.ResetCLIRep.CountSuccess()
        else:
            self.ResetCLIRep.CountFailure()
        self.ResetCLIRep.report["TestCase"]["CM_Reset_CLI"] = reportValue
        print(self.ResetCLIRep.generateReport())


    def startReport(self):
        self.ResetCLIRep.iterate()
        self.ResetCLIRep.set_testCaseTitle("CM Reset by CLI Flag")
        self.ResetCLIRep.set_startDate()
        self.ResetCLIRep.set_startTime()
        self.ResetCLIRep.logger.debug("resetCLI")
示例#2
0
class cmBPIState(process):
    docsBpi2CmAuthState = '.1.3.6.1.2.1.126.1.1.1.1.3.2'

    #docsBpi2CmAuthState ='.1.3.6.1.2.1.126.1.1.1.1.3.21'
    def __init__(self, ppi):
        process.__init__(self, ppi)
        print("cmBPIState CTOR")
        self.authvalue = ""
        self.BPIAuthRecRep = Reporter(ppi)
        #self.BPIAuthRecRep.set_testCaseTitle("CM BPI Authorization State Record")
        self.results = {}
        self.startReport()

    def snmpGetWrapper(self, host, oids):
        try:
            session = Session(hostname=host,
                              community="public",
                              version=2,
                              timeout=1,
                              retries=1)
            return session.get(oids)

        except Exception as xcp:
            print(xcp)
            return {'error': 1, 'msg': str(xcp)}

    #@timeout(0.4, use_signals=False)
    def execute(self):
        ret = {}
        if ToolKit.isModemOnline(self.pp):

            __ = self.snmpGetWrapper(cmBPIState.docsBpi2CmAuthState)

            if 'dict' not in str(type(__)) and 'snmp' in str(type(__)):
                try:
                    ret = __.value
                    if 'NOSUCHINSTANCE' in ret:
                        self.authvalue = "NOSUCHINSTANCE"
                        self.results['cmip'] = self.pp.get_cmip
                        self.results['error'] = 3
                        self.results[
                            'msg'] = "BPI Authorization Error => Unable to Identify MIB: {0}".format(
                                ret['msg'])
                        self.wrapUpReport(False, self.authvalue)
                    elif 'NOSUCHOBJECT' in ret:
                        self.authvalue = "NOSUCHOBJECT"
                        self.results['cmip'] = self.pp.get_cmip
                        self.results['error'] = 4
                        self.results[
                            'msg'] = "BPI Authorization Error => Unable to Identify CM: {0}".format(
                                ret['msg'])
                        self.wrapUpReport(False, self.authvalue)
                    else:  # Success
                        possible_values = {
                            1: 'start',
                            2: 'authWait',
                            3: 'authorized',
                            4: 'reauthWait',
                            5: 'authRejectWait',
                            6: 'silent'
                        }
                        self.authvalue = possible_values[int(ret)]
                        self.results['cmip'] = self.pp.get_cmip
                        self.results[
                            'msg'] = "BPI Authorization Successfully Read"
                        self.wrapUpReport(True, self.authvalue)

                except Exception as xcp:
                    print(xcp)
                    print(traceback.print_exc())
                    self.wrapUpReport(True, self.authvalue)
            else:
                self.authvalue = 'unk error'
                self.results['cmip'] = self.pp.get_cmip
                self.results['error'] = 1
                self.results[
                    'msg'] = "Error in get BPI Authorization State: {0}".format(
                        ret['msg'])
                self.wrapUpReport(False, self.authvalue)
        else:
            self.authvalue = 'cm not found'
            self.results['error'] = 1
            self.results[
                'msg'] = "Cable modem is not connected or not online, please check"
            self.wrapUpReport(False, self.authvalue)
            print(" MAC DOES NOT EXIST IN THE DB")
            print(self.results)

    def snmpGetWrapper(self, oids):
        try:
            session = Session(hostname=self.pp.get_cmip,
                              community="public",
                              version=2,
                              timeout=5,
                              retries=1)
            return session.get(oids)
        except Exception as xcp:
            print(xcp)
            return {'error': 1, 'msg': str(xcp)}

    def wrapUpReport(self, verdict, sysAuthValue):
        self.BPIAuthRecRep.set_endDate()
        self.BPIAuthRecRep.set_endTime()
        self.BPIAuthRecRep.logger.debug(self.results)
        self.BPIAuthRecRep.addLogs(self.results)
        if verdict == True:
            self.BPIAuthRecRep.CountSuccess()
        else:
            self.BPIAuthRecRep.CountFailure()
        self.BPIAuthRecRep.report["TestCase"]["BPIAuth_State"] = sysAuthValue
        print(self.BPIAuthRecRep.generateReport())

    def startReport(self):
        self.BPIAuthRecRep.iterate()
        self.BPIAuthRecRep.set_testCaseTitle("CM BPI Authorization Flag")
        self.BPIAuthRecRep.set_startDate()
        self.BPIAuthRecRep.set_startTime()
        self.BPIAuthRecRep.logger.debug("bpi")