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 )
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)
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)