def testtrapv2(self): '''testtrapv2''' # Traps have quite different semantics among proto versions if verID == api.protoVersion2c: var = [] oid = (1, 3, 6, 1, 4, 1, 2011, 2, 235, 1, 1, 4, 1, 0) # 1.3.6.1.4.1.2011.2.235.1.1.15.50.1.5(cpuClockRate).0 # 1.3.6.1.4.1.2011.2.235.1.1.4.1.0 trapEnable val = pMod.Integer(1) var.append((oid, val)) pMod.apiTrapPDU.setVarBinds(trapPDU, var) # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, community) pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) # 本机测试使用localhost,应为对应trap server 的IP地址。 transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, (trapdip, 162)) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() self.assertTrue(True)
def send(self, host, community, oid, value): self.pMod.apiPDU.setDefaults(self.reqPDU) self.pMod.apiPDU.setVarBinds( self.reqPDU, ((oid, self.pMod.OctetString(value)), ) ) # Build message reqMsg = self.pMod.Message() self.pMod.apiMessage.setDefaults(reqMsg) self.pMod.apiMessage.setCommunity(reqMsg, community) self.pMod.apiMessage.setPDU(reqMsg, self.reqPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(self.cbRecvFun) transportDispatcher.registerTimerCbFun(self.cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, (host, 161) ) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def query(self, oidCountersDict): resultsDict = dict() # SNMP protocol version to use pMod = api.protoModules[api.protoVersion1] # Build PDU reqPDU = pMod.GetRequestPDU() pMod.apiPDU.setDefaults(reqPDU) # Create a tuple of OIDs tuples oidList = list() for oid in oidCountersDict.values(): oidList.append((oid, pMod.Null())) OIDs = tuple(oidList) pMod.apiPDU.setVarBinds(reqPDU, (OIDs)) # Build message reqMsg = pMod.Message() pMod.apiMessage.setDefaults(reqMsg) pMod.apiMessage.setCommunity(reqMsg, 'public') pMod.apiMessage.setPDU(reqMsg, reqPDU) def cbTimerFun(timeNow, startedAt=time()): if timeNow - startedAt > self.snmpTimeout: transportDispatcher.jobFinished(1) raise SNMPTimeOutError("The host %s has not responded in the specified timeout of %ss!" % (self.host, self.snmpTimeout)) def cbRecvFun(transportDispatcher, transportDomain, transportAddress, wholeMsg, reqPDU=reqPDU): while wholeMsg: rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message()) rspPDU = pMod.apiMessage.getPDU(rspMsg) # Match response to request if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: print errorStatus.prettyPrint() raise SNMPoIDNotSupported("%s: An requested OID is not supported by this device!" % errorStatus.prettyPrint()) else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): #print '%s = %s' % (oid.prettyPrint(), val) resultsDict[str(oid)] = str(val) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (self.host, int(self.port))) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() return resultsDict
def Send_GetSystemPDUName(reqMsg, hostname, port=161): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (hostname, 161)) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def sendSNMPMessage(self, reqMsg): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.registerRecvCbFun(self.cbRecvFun) transportDispatcher.registerTimerCbFun(self.cbTimerFun) transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (self.host, self.port)) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def Send_GetSystemPDUName(reqMsg, hostname, port=161): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (hostname, 161)) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def run(self): # Build PDU reqPDU = pMod.GetRequestPDU() pMod.apiPDU.setDefaults(reqPDU) pduList = [] if self._CbLastChange != None: pduList.append(((1,3,6,1,2,1,2,2,1,9,self.SNMPIndex), pMod.Null())) if self._CbInOctets != None: pduList.append(((1,3,6,1,2,1,2,2,1,10,self.SNMPIndex), pMod.Null())) if self._CbInUnicastPkts != None: pduList.append(((1,3,6,1,2,1,2,2,1,11,self.SNMPIndex), pMod.Null())) if self._CbInNUnicastPkts != None: pduList.append(((1,3,6,1,2,1,2,2,1,12,self.SNMPIndex), pMod.Null())) if self._CbInDiscard != None: pduList.append(((1,3,6,1,2,1,2,2,1,13,self.SNMPIndex), pMod.Null())) if self._CbInErrors != None: pduList.append(((1,3,6,1,2,1,2,2,1,14,self.SNMPIndex), pMod.Null())) if self._CbInUnknownProtos != None: pduList.append(((1,3,6,1,2,1,2,2,1,15,self.SNMPIndex), pMod.Null())) if self._CbOutOctets != None: pduList.append(((1,3,6,1,2,1,2,2,1,16,self.SNMPIndex), pMod.Null())) if self._CbOutUnicastPkts != None: pduList.append(((1,3,6,1,2,1,2,2,1,17,self.SNMPIndex), pMod.Null())) if self._CbOutNUnicastPkts != None: pduList.append(((1,3,6,1,2,1,2,2,1,18,self.SNMPIndex), pMod.Null())) if self._CbOutDiscard != None: pduList.append(((1,3,6,1,2,1,2,2,1,19,self.SNMPIndex), pMod.Null())) if self._CbOutErrors != None: pduList.append(((1,3,6,1,2,1,2,2,1,20,self.SNMPIndex), pMod.Null())) pMod.apiPDU.setVarBinds(reqPDU, pduList) self._reqPDU = reqPDU # Build message reqMsg = pMod.Message() pMod.apiMessage.setDefaults(reqMsg) pMod.apiMessage.setCommunity(reqMsg, self._agent) pMod.apiMessage.setPDU(reqMsg, reqPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) transportDispatcher.registerRecvCbFun(self._cbRecvFun) while not self._IsStopped(): if not transportDispatcher.transportsAreWorking(): transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (self._host, self._port)) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() sleep(self._interval)
def sent_snmp_trap(product, level, regionId, instanceName, name): # Protocol version to use verID = api.protoVersion2c pMod = api.protoModules[verID] # Build PDU trapPDU = pMod.TrapPDU() pMod.apiTrapPDU.setDefaults(trapPDU) # Traps have quite different semantics among proto versions if verID == api.protoVersion2c: var = [] oid = (1, 3, 6, 1, 4, 1, 12149, 1) val = pMod.OctetString('product:%s' % product) var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 12149, 2) val = pMod.OctetString('level:%s' % level) var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 12149, 3) val = pMod.OctetString('regionId:%s' % regionId) var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 12149, 4) val = pMod.OctetString('instanceName:%s' % instanceName) var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 12149, 5) val = pMod.OctetString('name:%s' % name) var.append((oid, val)) pMod.apiTrapPDU.setVarBinds(trapPDU, var) print(var) save_log(str(var)) # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'public') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, ('localhost', 162)) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def snmp_msg_send(): try: verID = api.protoVersion2c pMod = api.protoModules[verID] trapPDU = pMod.TrapPDU() pMod.apiTrapPDU.setDefaults(trapPDU) now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # Traps have quite different semantics among proto versions if verID == api.protoVersion2c: var = [] oid = (1, 3, 6, 1, 4, 1, 3902, 2, 2, 4) val = pMod.OctetString("2001") var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 3902, 2, 2, 5) val = pMod.OctetString("60") var.append((oid, val)) oid = (1, 3, 6, 1, 4, 1, 3902, 2, 2, 6) val = pMod.OctetString(now_time) var.append((oid, val)) pMod.apiTrapPDU.setVarBinds(trapPDU, var) trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'Beijing JiaoTong University') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, (ntp_ip2, 162)) # 为对应trapserver的IP地址。 transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() except: logging.debug('snmp send fail!') print('snmp send fail')
def update(self): """Called by the processing thread to trigger an update of the data""" ip = self._ip hostname = self._hostname # Grab the lock lock = self.lock lock.acquire() try: # Retrieve locally available information self.activeRevision = getActiveRevision(hostname) self.generatedRevision = getGeneratedRevision(self._hostname) # Check that the host is reachable if not isHostUp(ip): self.reachable = False self.lastCheckedAt = time.time() self.attempt+=1 return self.reachable = True # Retrieve host status information pMod = api.protoModules[api.protoVersion1] reqPDU = pMod.GetRequestPDU() pMod.apiPDU.setDefaults(reqPDU) pMod.apiPDU.setVarBinds( reqPDU, ((CCS_REVISION_OID, pMod.Null()), (LOAD_AVG1_OID, pMod.Null()), (LOAD_AVG5_OID, pMod.Null()), (LOAD_AVG15_OID, pMod.Null()), (UPTIME_OID, pMod.Null()) ) ) # Build message reqMsg = pMod.Message() pMod.apiMessage.setDefaults(reqMsg) pMod.apiMessage.setCommunity(reqMsg, 'public') pMod.apiMessage.setPDU(reqMsg, reqPDU) # Dispatch Request transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) startedAt = time.time() def cbTimerFun(timeNow): if timeNow - startedAt > 3: transportDispatcher.jobFinished(1) transportDispatcher.closeDispatcher() self.attempt+=1 log_warn("Timeout fetching status from %s. Attempt #%s" % (hostname, self.attempt)) def cbRecvFun(transportDispatcher, transportDomain, \ transportAddress, wholeMsg, reqPDU=reqPDU): while wholeMsg: rspMsg, wholeMsg = decoder.decode(wholeMsg, \ asn1Spec=pMod.Message()) rspPDU = pMod.apiMessage.getPDU(rspMsg) # Match response to request if pMod.apiPDU.getRequestID(reqPDU) == \ pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: transportDispatcher.jobFinished(1) transportDispatcher.closeDispatcher() raise ccs_status_error(errorStatus.prettyPrint()) else: la1 = 0 la5 = 0 la15 = 0 for oid, val in pMod.apiPDU.getVarBinds(rspPDU): if oid == CCS_REVISION_OID: self.operatingRevision = str(val) self._parseOperatingRevision() elif oid == LOAD_AVG1_OID: la1 = val elif oid == LOAD_AVG5_OID: la5 = val elif oid == LOAD_AVG15_OID: la15 = val elif oid == UPTIME_OID: self.uptime = val self.currentLoad = (la1, la5, la15) transportDispatcher.jobFinished(1) self.attempt = 0 return wholeMsg transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, (ip, 161) ) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() # Record that the details were updated self.infoUpdatedAt = time.time() self.lastCheckedAt = time.time() finally: lock.release()
pMod.apiTrapPDU.setEnterprise(trapPDU, (1, 3, 6, 1, 1, 2, 3, 4, 1)) pMod.apiTrapPDU.setGenericTrap(trapPDU, 'coldStart') # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'public') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, ('localhost', 162)) # UDP/IPv6 transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp6.domainName, ('::1', 162)) ## Local domain socket #transportDispatcher.registerTransport( # unix.domainName, unix.UnixSocketTransport().openClientMode() #) #transportDispatcher.sendMessage( # encoder.encode(trapMsg), unix.domainName, '/tmp/snmp-manager' #)
if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: print(errorStatus.prettyPrint()) else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('172.30.128.16', 161) ) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
def pollFn(): #Check the heater status errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData('public',mpModel=0), UdpTransportTarget(('localhost', 1162)), ContextData(), ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))) ) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % ( errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex)-1][0] or '?' ) ) else: for varBind in varBinds: print(' = '.join([ x.prettyPrint() for x in varBind ])) # Get the temperature errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData('public',mpModel=0), UdpTransportTarget(('localhost', 1161)), ContextData(), ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))) ) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % ( errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex)-1][0] or '?' ) ) else: #for varBind in varBinds: # print(' = '.join([ x.prettyPrint() for x in varBind ])) #SET Command #Check if the temperature is less than 10 for oid, val in varBinds: print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) returnedVal = int(val) if (returnedVal < 10): print returnedVal # Protocol version to use #pMod = api.protoModules[api.protoVersion1] pMod = api.protoModules[api.protoVersion2c] # Build PDU reqPDU = pMod.SetRequestPDU() pMod.apiPDU.setDefaults(reqPDU) pMod.apiPDU.setVarBinds( reqPDU, # Change the heater status to ON ( ('1.3.6.1.2.1.1.1.0', pMod.OctetString('ON')), # ('1.3.6.1.2.1.1.3.0', pMod.TimeTicks(12)) ) ) # Build message reqMsg = pMod.Message() pMod.apiMessage.setDefaults(reqMsg) pMod.apiMessage.setCommunity(reqMsg, 'public') pMod.apiMessage.setPDU(reqMsg, reqPDU) startedAt = time() def cbTimerFun(timeNow): if timeNow - startedAt > 3: raise Exception("Request timed out") def cbRecvFun(transportDispatcher, transportDomain, transportAddress, wholeMsg, reqPDU=reqPDU): while wholeMsg: rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message()) rspPDU = pMod.apiMessage.getPDU(rspMsg) # Match response to request if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: print(errorStatus.prettyPrint()) else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('localhost', 1162) ) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() else: print "value greater than 10"
else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 udpSocketTransport = udp.UdpSocketTransport().openClientMode().enableBroadcast() transportDispatcher.registerTransport(udp.domainName, udpSocketTransport) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('255.255.255.255', 161) ) # wait for a maximum of 10 responses or time out transportDispatcher.jobStarted(1, maxNumberResponses) # Dispatcher will finish as all jobs counter reaches zero try: transportDispatcher.runDispatcher() except StopWaiting: transportDispatcher.closeDispatcher() else: raise
return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('10.43.211.62', 161) ) transportDispatcher.jobStarted(1) # # UDP/IPv6 (second copy of the same PDU will be sent) transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp6.domainName, ('::1', 161) ) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero
for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 udpSocketTransport = udp.UdpSocketTransport().openClientMode().enableBroadcast( ) transportDispatcher.registerTransport(udp.domainName, udpSocketTransport) # Pass message to dispatcher transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, ('255.255.255.255', 161)) # wait for a maximum of 10 responses or time out transportDispatcher.jobStarted(1, maxNumberResponses) # Dispatcher will finish as all jobs counter reaches zero try: transportDispatcher.runDispatcher() except StopWaiting: transportDispatcher.closeDispatcher() else: raise
class SNMPProcess(threading_tools.process_obj): def __init__(self, name, conf_dict, **kwargs): self.__snmp_name = name self.__log_name, self.__log_destination = ( conf_dict["LOG_NAME"], conf_dict["LOG_DESTINATION"], ) self.__verbose = conf_dict.get("VERBOSE", False) self.debug_zmq = conf_dict.get("DEBUG_ZMQ", False) threading_tools.process_obj.__init__(self, name, busy_loop=True) if kwargs.get("ignore_signals", False): signal.signal(signal.SIGTERM, signal.SIG_IGN) def process_init(self): self.__log_template = logging_tools.get_logger( self.__log_name, self.__log_destination, zmq=True, context=self.zmq_context) self.__return_proc_name = None self.register_func("fetch_snmp", self._fetch_snmp) self.register_func("register_return", self._register_return) self.register_func("trigger_timeout", self._trigger_timeout) self._init_dispatcher() self.__job_dict = {} self.__envelope_dict = {} self.__req_id_lut = {} def log(self, what, log_level=logging_tools.LOG_LEVEL_OK): self.__log_template.log(log_level, what) def _init_dispatcher(self): self.log("init snmp_session object") self.__disp = AsynsockDispatcher() self.__disp.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) self.__disp.registerRecvCbFun(self._recv_func) self.__disp.registerTimerCbFun(self._timer_func) self.v1_decoder = api.protoModules[api.protoVersion1] self.v2c_decoder = api.protoModules[api.protoVersion2c] def register_batch(self, cur_batch): if self.__verbose > 3: self.log("registered new batch {:d}".format(cur_batch.key)) self.__job_dict[cur_batch.key] = cur_batch self.__disp.jobStarted(cur_batch.key) def unregister_batch(self, cur_batch): # ids we will no longer handle because of finish to_keys = [ key for key, value in self.__req_id_lut.iteritems() if value == cur_batch ] if to_keys: for to_key in to_keys: del self.__req_id_lut[to_key] if self.__verbose > 3: cur_batch.log( "removed {} for batch {}".format( logging_tools.get_plural("request ID", len(to_keys)), cur_batch, ), ) del self.__job_dict[cur_batch.key] del self.__envelope_dict[cur_batch.envelope] self.__disp.jobFinished(cur_batch.key) def loop(self): try: while self["run_flag"]: self.__disp.runDispatcher() self.step(blocking=self["run_flag"]) except ValueConstraintError: self.log("caught ValueConstraintError, terminating process", logging_tools.LOG_LEVEL_CRITICAL) _term_cause = "ValueConstraintError" except: exc_info = process_tools.exception_info() self.log("exception in dispatcher, terminating process", logging_tools.LOG_LEVEL_CRITICAL) for log_line in exc_info.log_lines: self.log(" - {}".format(log_line), logging_tools.LOG_LEVEL_CRITICAL) _term_cause = "internal error" else: self.log("no more jobs running") _term_cause = "" self.log("jobs pending: {:d}".format(len(self.__job_dict))) # close all jobs if _term_cause: self._terminate_jobs(error="{}, check logs".format(_term_cause)) else: self._terminate_jobs() self.__disp.closeDispatcher() def _inject(self, cur_batch): try: next_tuple = cur_batch.iterator.next() except StopIteration: cur_batch.finish() else: self.send_next(cur_batch, next_tuple) def send_next(self, cur_batch, next_tuple): self.__req_id_lut[cur_batch.request_id] = cur_batch self.__disp.sendMessage(*next_tuple) def _register_return(self, proc_name, **kwargs): self.__return_proc_name = proc_name self.send_pool_message("hellox", "hello2", "hello3", target=self.__return_proc_name) def _fetch_snmp(self, *scheme_data, **kwargs): new_batch = SNMPBatch(self, *scheme_data, verbose=self.__verbose, **kwargs) self.__envelope_dict[new_batch.envelope] = new_batch self._inject(new_batch) def _trigger_timeout(self, *args, **kwargs): batch_id = args[0] if batch_id in self.__envelope_dict: self.log("triggering timeout for batch_id {}".format(batch_id), logging_tools.LOG_LEVEL_WARN) self.__envelope_dict[batch_id].trigger_timeout() else: self.log("unknown batch_id {}".format(batch_id), logging_tools.LOG_LEVEL_ERROR) def _timer_func(self, act_time): timed_out = [ key for key, cur_job in self.__job_dict.iteritems() if cur_job.timer_func(act_time) ] for to_key in timed_out: self.__job_dict[to_key].finish() self.step() if self["exit_requested"]: self._terminate_jobs(error="exit requested") def _terminate_jobs(self, **kwargs): _stop_keys = set(self.__job_dict.keys()) for _key in _stop_keys: if "error" in kwargs: self.__job_dict[_key].add_error(kwargs["error"]) self.__job_dict[_key].finish() def _recv_func(self, disp, domain, address, whole_msg): while whole_msg: # rsp_msg, whole_msg = decoder.decode(whole_msg, asn1Spec=self.__p_mod.Message()) try: rsp_msg, whole_msg = decoder.decode( whole_msg, asn1Spec=self.v2c_decoder.Message()) except: self.log( "error decoding message from {}: {}".format( address, process_tools.get_except_info()), logging_tools.LOG_LEVEL_CRITICAL) # send meaningfull error message to client ? TODO, FIXME whole_msg = None else: # rsp_pdu = self.__p_mod.apiMessage.getPDU(rsp_msg) rsp_pdu = self.v2c_decoder.apiMessage.getPDU(rsp_msg) cur_id = self.v2c_decoder.apiPDU.getRequestID(rsp_pdu) if cur_id in self.__req_id_lut: self.__req_id_lut[cur_id].feed_pdu(disp, domain, address, rsp_pdu) else: self.log("id {} in response not known".format(cur_id)) if cur_id in self.__req_id_lut: del self.__req_id_lut[cur_id] return whole_msg def loop_post(self): self.__log_template.close() def send_return(self, envelope, error_list, received, snmp): self.send_pool_message("snmp_finished", envelope, error_list, received, snmp, target=self.__return_proc_name or DEFAULT_RETURN_NAME)
''' Created on 2012-9-9 @author: zongzong ''' # Notification Originator Application (TRAP) from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher from pysnmp.carrier.asynsock.dgram import udp from pyasn1.codec.ber import encoder from pysnmp.proto import api # Protocol version to use verID = api.protoVersion1 pMod = api.protoModules[verID] # Build PDU trapPDU = pMod.TrapPDU() pMod.apiTrapPDU.setDefaults(trapPDU) # Traps have quite different semantics among proto versions if verID == api.protoVersion1: pMod.apiTrapPDU.setEnterprise(trapPDU, (1, 3, 6, 1, 6, 3, 1, 1, 5, 1)) pMod.apiTrapPDU.setGenericTrap(trapPDU, 'coldStart') # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'public') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) transportDispatcher.sendMessage( encoder.encode(trapMsg), udp.domainName, ('10.8.80.108', 162)
from pysnmp.proto import api # Protocol version to use verID = api.protoVersion1 pMod = api.protoModules[verID] # Build PDU trapPDU = pMod.TrapPDU() pMod.apiTrapPDU.setDefaults(trapPDU) # Traps have quite different semantics among proto versions if verID == api.protoVersion1: pMod.apiTrapPDU.setEnterprise(trapPDU, (1,3,6,1,1,2,3,4,1)) pMod.apiTrapPDU.setGenericTrap(trapPDU, 'coldStart') # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'public') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) transportDispatcher.sendMessage( encoder.encode(trapMsg), udp.domainName, ('localhost', 162) ) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, ('demo.snmplabs.com', 162)) transportDispatcher.jobStarted(1) # UDP/IPv6 # transportDispatcher.registerTransport( # udp6.domainName, udp6.Udp6SocketTransport().openClientMode() # ) # transportDispatcher.sendMessage( # encoder.encode(trapMsg), udp6.domainName, ('::1', 162) # ) # transportDispatcher.jobStarted(1) # Dispatcher will finish as all scheduled messages are sent transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
''' Created on 2012-9-9 @author: zongzong ''' # Notification Originator Application (TRAP) from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher from pysnmp.carrier.asynsock.dgram import udp from pyasn1.codec.ber import encoder from pysnmp.proto import api # Protocol version to use verID = api.protoVersion1 pMod = api.protoModules[verID] # Build PDU trapPDU = pMod.TrapPDU() pMod.apiTrapPDU.setDefaults(trapPDU) # Traps have quite different semantics among proto versions if verID == api.protoVersion1: pMod.apiTrapPDU.setEnterprise(trapPDU, (1, 3, 6, 1, 6, 3, 1, 1, 5, 1)) pMod.apiTrapPDU.setGenericTrap(trapPDU, 'coldStart') # Build message trapMsg = pMod.Message() pMod.apiMessage.setDefaults(trapMsg) pMod.apiMessage.setCommunity(trapMsg, 'public') pMod.apiMessage.setPDU(trapMsg, trapPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(trapMsg), udp.domainName, ('10.8.80.108', 162))
for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' % (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) transportDispatcher.sendMessage( encoder.encode(trapMsg), udp.domainName, ('demo.snmplabs.com', 162) ) transportDispatcher.jobStarted(1) # UDP/IPv6 #transportDispatcher.registerTransport( # udp6.domainName, udp6.Udp6SocketTransport().openClientMode() #) #transportDispatcher.sendMessage( # encoder.encode(trapMsg), udp6.domainName, ('::1', 162) #) #transportDispatcher.jobStarted(1) # Dispatcher will finish as all scheduled messages are sent transportDispatcher.runDispatcher()
# Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: print(errorStatus.prettyPrint()) else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode()) # Pass message to dispatcher transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, ('localhost', 161)) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('demo.snmplabs.com', 161) ) transportDispatcher.jobStarted(1) ## UDP/IPv6 (second copy of the same PDU will be sent) transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp6.domainName, ('::1', 161) ) transportDispatcher.jobStarted(1) ## Local domain socket
if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: print(errorStatus.prettyPrint()) else: for oid, val in pMod.apiPDU.getVarBinds(rspPDU): print('%s = %s' (oid.prettyPrint(), val.prettyPrint())) transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('localhost', 1161) ) transportDispatcher.jobStarted(1) # Dispatcher will finish as job#1 counter reaches zero transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher()
transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # Initialize UDP/IPv4 transport udpSocketTransport = udp.UdpSocketTransport().openClientMode() # Use sendmsg()/recvmsg() for socket communication (required for # IP source spoofing functionality) udpSocketTransport.enablePktInfo() # Enable IP source spoofing (requires root privileges) udpSocketTransport.enableTransparent() transportDispatcher.registerTransport(udp.domainName, udpSocketTransport) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, transportAddress ) # We might never receive any response as we sent request with fake source IP transportDispatcher.jobStarted(1) # Dispatcher will finish as all jobs counter reaches zero try: transportDispatcher.runDispatcher() except StopWaiting: transportDispatcher.closeDispatcher() else: raise
transportDispatcher.jobFinished(1) return wholeMsg transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbRecvFun) transportDispatcher.registerTimerCbFun(cbTimerFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp.domainName, ('192.168.22.241', 161) ) transportDispatcher.jobStarted(1) ''' ## UDP/IPv6 (second copy of the same PDU will be sent) transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openClientMode() ) # Pass message to dispatcher transportDispatcher.sendMessage( encoder.encode(reqMsg), udp6.domainName, ('::1', 161) ) transportDispatcher.jobStarted(1) '''
self.reqMsg = v2c.Message() v2c.apiMessage.setDefaults(self.reqMsg) v2c.apiMessage.setCommunity(self.reqMsg, self.community) v2c.apiMessage.setPDU(self.reqMsg, self.reqPDU) # Save the time when snmp request start self.snmp_request_start_time = time.time() # Prepare SNMP Request transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.registerRecvCbFun(self.callback) transportDispatcher.registerTimerCbFun(self.callback_timer) transportDispatcher.sendMessage(encoder.encode(self.reqMsg), udp.domainName, (self.hostname, 161)) transportDispatcher.jobStarted(1) try: # launch SNMP Request transportDispatcher.runDispatcher() except Exception, e: logger.error('[SnmpBooster] SNMP Request error 1: %s' % str(e)) self.set_exit("SNMP Request error 1: " + str(e), rc=3) # LOCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK try: self.obj = self.memcached.get(self.obj_key) except ValueError, e: self.set_exit("Memcached error: `%s'"