예제 #1
0
class CommandResponder(cmdrsp.CommandResponderBase):
    cmdGenMap = { 
        v2c.GetRequestPDU.tagSet: cmdgen.GetCommandGenerator(),
        v2c.SetRequestPDU.tagSet: cmdgen.SetCommandGenerator(),
        v2c.GetNextRequestPDU.tagSet: cmdgen.NextCommandGeneratorSingleRun(),
        v2c.GetBulkRequestPDU.tagSet: cmdgen.BulkCommandGeneratorSingleRun() 
    }
    pduTypes = cmdGenMap.keys()  # This app will handle these PDUs

    # SNMP request relay
    def handleMgmtOperation(self, snmpEngine, stateReference, contextName,
                            PDU, acInfo):
        cbCtx = snmpEngine, stateReference
        varBinds = v2c.apiPDU.getVarBinds(PDU)
        try:
            if PDU.tagSet == v2c.GetBulkRequestPDU.tagSet:
                self.cmdGenMap[PDU.tagSet].sendReq(
                    snmpEngine, 'distant-agent', 
                    v2c.apiBulkPDU.getNonRepeaters(PDU),
                    v2c.apiBulkPDU.getMaxRepetitions(PDU),
                    varBinds,
                    self.handleResponse, cbCtx
                )
            elif PDU.tagSet in self.cmdGenMap:
                self.cmdGenMap[PDU.tagSet].sendReq(
                    snmpEngine, 'distant-agent', varBinds,
                    self.handleResponse, cbCtx
                )
        except error.PySnmpError:
            self.handleResponse(
                stateReference,  'error', 0, 0, varBinds, cbCtx
            )

    # SNMP response relay
    def handleResponse(self, sendRequestHandle, errorIndication, 
                       errorStatus, errorIndex, varBinds, cbCtx):
        if errorIndication:
            errorStatus = 5
            errorIndex = 0
            varBinds = ()

        snmpEngine, stateReference = cbCtx

        self.sendRsp(
            snmpEngine, stateReference,  errorStatus, errorIndex, varBinds
        )
예제 #2
0
class CommandResponder(cmdrsp.CommandResponderBase):
    CMDGEN_MAP = {
        v2c.GetRequestPDU.tagSet: cmdgen.GetCommandGenerator(),
        v2c.SetRequestPDU.tagSet: cmdgen.SetCommandGenerator(),
        v2c.GetNextRequestPDU.tagSet: cmdgen.NextCommandGeneratorSingleRun(),
        v2c.GetBulkRequestPDU.tagSet: cmdgen.BulkCommandGeneratorSingleRun()
    }
    SUPPORTED_PDU_TYPES = tuple(CMDGEN_MAP)  # This app will handle these PDUs

    # SNMP request relay
    def handleMgmtOperation(self, snmpEngine, stateReference, contextName,
                            PDU, acInfo):
        cbCtx = stateReference, PDU
        contextEngineId = None  # address authoritative SNMP Engine
        try:
            self.CMDGEN_MAP[PDU.tagSet].sendPdu(
                snmpEngine, 'distant-agent',
                contextEngineId, contextName,
                PDU,
                self.handleResponsePdu, cbCtx
            )

        except error.PySnmpError:
            self.handleResponsePdu(
                snmpEngine, stateReference, 'error', None, cbCtx
            )

    # SNMP response relay
    # noinspection PyUnusedLocal
    def handleResponsePdu(self, snmpEngine, sendRequestHandle,
                          errorIndication, PDU, cbCtx):
        stateReference, reqPDU = cbCtx

        if errorIndication:
            PDU = v2c.apiPDU.getResponse(reqPDU)
            PDU.setErrorStatus(PDU, 5)

        self.sendPdu(
            snmpEngine, stateReference, PDU
        )

        self.releaseStateInformation(stateReference)
예제 #3
0
class CommandResponder(cmdrsp.CommandResponderBase):
    cmdGenMap = {
        v2c.GetRequestPDU.tagSet: cmdgen.GetCommandGenerator(),
        v2c.SetRequestPDU.tagSet: cmdgen.SetCommandGenerator(),
        v2c.GetNextRequestPDU.tagSet: cmdgen.NextCommandGeneratorSingleRun(),
        v2c.GetBulkRequestPDU.tagSet: cmdgen.BulkCommandGeneratorSingleRun()
    }
    pduTypes = cmdGenMap.keys()  # This app will handle these PDUs

    # SNMP request relay
    def handleMgmtOperation(self, snmpEngine, stateReference, contextName, PDU,
                            acInfo):
        cbCtx = snmpEngine, stateReference
        varBinds = v2c.apiPDU.getVarBinds(PDU)
        print "Begin of handleMgmtOperation"

        try:
            if contextName not in agentMap:
                raise PySnmpError('Unknown context name %s' % contextName)

            # Select backend Agent ID by contextName arrived with request
            targetName, targetAddress = agentMap[contextName]
            isCached = 1
            indice = 0
            print "Beginning to check all of cache"
            for oid in varBinds:
                k, v = oid
                key = targetAddress + "-" + str(oid[0])
                print "Checking cache for oid: " + str(oid[0])
                if r.exists(key) == True:
                    v = r.get(key)
                    varBinds[indice] = (k, v)
                    indice = indice + 1
                    print "Key Cached: " + str(k)
                    #self.sendRsp(snmpEngine, stateReference,  0, 0, varBinds)
                else:
                    isCached = 0
                    print "Not all entries cached: " + str(k)
                    #break

            if isCached == 1:
                print "All cached - sending cached response"
                self.sendRsp(snmpEngine, stateReference, 0, 0, varBinds)
            elif isCached == 0:
                print "Not all cached - sending request"
                if PDU.tagSet == v2c.GetBulkRequestPDU.tagSet:
                    self.cmdGenMap[PDU.tagSet].sendReq(
                        snmpEngine, targetName,
                        v2c.apiBulkPDU.getNonRepeaters(PDU),
                        v2c.apiBulkPDU.getMaxRepetitions(PDU), varBinds,
                        self.handleResponse, cbCtx)
                elif PDU.tagSet in self.cmdGenMap:
                    self.cmdGenMap[PDU.tagSet].sendReq(snmpEngine, targetName,
                                                       varBinds,
                                                       self.handleResponse,
                                                       cbCtx)
        except error.PySnmpError:
            print sys.exc_info()[1]
            self.handleResponse(stateReference, 'error', 0, 0, varBinds, cbCtx)

    # SNMP response relay
    def handleResponse(self, sendRequestHandle, errorIndication, errorStatus,
                       errorIndex, varBinds, cbCtx):
        if errorIndication:
            errorStatus = 5
            errorIndex = 0
            varBinds = ()

        snmpEngine, stateReference = cbCtx
        hosts = snmpEngine.cache['getTargetAddr']['nameToTargetMap']
        host = ""
        for key in hosts.items():
            k, v = key
            host = v[1][0]
        for a in varBinds:
            key = str(host) + "-" + str(a[0])
            print "Caching Key: " + key
            r.setex(key, 120, a[1])
        print "Sending uncached response to client"
        self.sendRsp(snmpEngine, stateReference, errorStatus, errorIndex,
                     varBinds)