def setup_snmp(): """Configure SNMP server listener""" transport_dispatcher = AsynsockDispatcher() transport_dispatcher.registerRecvCbFun(snmp_trap_receiver) # UDP/IPv4 transport_dispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))) # UDP/IPv6 transport_dispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))) transport_dispatcher.jobStarted(1) try: # Dispatcher will never finish as job#1 never reaches zero transport_dispatcher.runDispatcher() except: transport_dispatcher.closeDispatcher() raise
def main(options, args): logname = 'summit_ups' logger = ssdlog.make_logger(logname, options) power_off = 'obcpPoff' power_off = os.path.join(options.dir, power_off) try: os.remove(power_off) except Exception as e: logger.warn('warn: is %s there?? %s' % (power_off, e)) snmp = SnmpTrap(power_off, logger) try: transportDispatcher = AsynsockDispatcher() transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode( ('%s' % options.mgrhost, 162))) transportDispatcher.registerRecvCbFun(snmp.trap_cb) transportDispatcher.jobStarted(1) # this job would never finish transportDispatcher.runDispatcher() except KeyboardInterrupt: logger.info('keyboard interrupting...') snmp.ev_quit.set() except Exception as e: logger.error('error: %s' % e) snmp.ev_quit.set() logger.error('error: snmp trap terminated..')
def runDispatcherFunction(): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode(('', 162)) # if test.py is running inside a container named "ra", the traps messages will be for exampleL: #snmptrap -v2c -c public ra:162 '' SNMPv2-MIB::coldStart.0 SNMPv2-MIB::sysContact.0 s 'trap testing number #7' ) # UDP/IPv6 #transportDispatcher.registerTransport( # udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162)) #) transportDispatcher.jobStarted(1) try: # Dispatcher will never finish as job#1 never reaches zero print('run dispatcher') transportDispatcher.runDispatcher() except: transportDispatcher.closeDispatcher() raise
def receive_trap(self): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbFun) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode(('192.168.115.187', 162)) ) # UDP/IPv6 transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162)) ) transportDispatcher.jobStarted(1) try: # Dispatcher will never finish as job#1 never reaches zero print('run dispatcher') transportDispatcher.runDispatcher() except: transportDispatcher.closeDispatcher() raise
def __init__(self, host, port): # Create SNMP engine instance self.snmpEngine = engine.SnmpEngine() # user: usr-sha-aes, auth: SHA, priv AES config.addV3User( self.snmpEngine, "usr-sha-aes128", config.usmHMACSHAAuthProtocol, "authkey1", config.usmAesCfb128Protocol, "privkey1", ) config.addTargetParams(self.snmpEngine, "my-creds", "usr-sha-aes128", "authPriv") # Setup transport endpoint and bind it with security settings yielding # a target name (choose one entry depending of the transport needed). # UDP/IPv4 config.addSocketTransport(self.snmpEngine, udp.domainName, udp.UdpSocketTransport().openClientMode()) config.addTargetAddr(self.snmpEngine, "my-router", udp.domainName, (host, port), "my-creds")
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 __one_time_init(self): self.listen_address = '0.0.0.0' # Set by TrapEngine self.listen_port = 162 # Set by TrapEngine self.owner = None # Set by TrapEngine self.trap_view = None # Set by TrapEngine self.trap_log = None # Set by TrapEngine self.socket_map = socketmap.SocketMap() self.snmpEngine = engine.SnmpEngine() transportDispatcher = dispatch.AsynsockDispatcher() transportDispatcher.setSocketMap(self.socket_map) self.snmpEngine.registerTransportDispatcher(transportDispatcher) # @note As of PySNMP 4.1.9a, receipt of a V3 notification with out # any registerred V3 users results in a traceback. self.addV3User('\0', config.usmNoAuthProtocol, '\0' * 8, config.usmNoPrivProtocol, '\0' * 8) def cbFun(snmpEngine, contextEngineId, contextName, varBinds, trap_thread): trap_thread._TrapThread__callback(contextEngineId, contextName, varBinds) return self.receiver = ntfrcv.NotificationReceiver(self.snmpEngine, cbFun, self) # Setup transport endpoint config.addSocketTransport( self.snmpEngine, udp.domainName, udp.UdpSocketTransport().openServerMode( (self.listen_address, self.listen_port))) return
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 _setup(self, agent, context, host, port): # TODO support changes to context etc and make a new connection??? if self.snmpEngine is None: self.snmpEngine = engine.SnmpEngine() else: return # already setup if isinstance(agent, UsmUserData): config.addV3User(self.snmpEngine, agent.securityName, agent.authProtocol, agent.authKey, agent.privProtocol, agent.privKey) config.addTargetParams(self.snmpEngine, 'myParams', agent.securityName, agent.securityLevel) else: config.addV1System(self.snmpEngine, agent, context) config.addTargetParams(self.snmpEngine, 'myParams', agent, 'noAuthNoPriv', 1) config.addTargetAddr(self.snmpEngine, 'myRouter', config.snmpUDPDomain, (host, port), 'myParams', timeout=900) config.addSocketTransport(self.snmpEngine, udp.domainName, udp.UdpSocketTransport().openClientMode())
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 test2(): from pysnmp.v4.proto.rfc1902 import ObjectName from pysnmp.entity import engine, config from pysnmp.carrier.asynsock.dgram import udp from pysnmp.entity.rfc3413 import cmdgen sysName = ObjectName("1.3.6.1.2.1.1.5.0") ip = "192.168.1.9" snmp_engine = engine.SnmpEngine() config.addV1System(snmp_engine, 'test-agent', "public") config.addTargetParams(snmp_engine, 'myParams', 'test-agent', 'noAuthNoPriv', 0) config.addTargetAddr( snmp_engine, 'myRouter', config.snmpUDPDomain, (ip, 161), 'myParams' ) config.addSocketTransport( snmp_engine, udp.domainName, udp.UdpSocketTransport().openClientMode() ) cb = {} def cbFun(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): cbCtx['errorIndication'] = errorIndication cbCtx['errorStatus'] = errorStatus cbCtx['errorIndex'] = errorIndex cbCtx['varBinds'] = varBinds cmdgen.GetCommandGenerator().sendReq(snmp_engine, 'myRouter', ((sysName, None),), cbFun, cb) lastmemusage = 0 lastrefs = None errors = 0 while (errors < 2): snmp_engine.transportDispatcher.runDispatcher() print cb['varBinds'][0][1] snmp_engine.transportDispatcher.closeDispatcher() #asynCommandGenerator.flushConfig() newmemusage = resource.getrusage(resource.RUSAGE_SELF)[2] memdiff = (newmemusage - lastmemusage) newrefs = get_refcounts() if memdiff > 0: print "Leaked %d Kb... printing refcount diff" % memdiff if lastrefs == None: print "No previous refcount, skipping" else: print_ref_diffs(lastrefs, newrefs) errors = errors + 1 gc.collect() lastrefs = newrefs lastmemusage = newmemusage #print resource.getrusage(resource.RUSAGE_SELF)[3] time.sleep(1)
def add_udp_endpoint( self, snmp_engine, snmp_timeout=SNMP_TIMEOUT, snmp_retry_count=SNMP_RETRIES_COUNT, ): if self._snmp_parameters.ip: try: agent_udp_endpoint = socket.getaddrinfo( self._snmp_parameters.ip, self._snmp_parameters.port, socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP, )[0][4][:2] except socket.gaierror: raise InitializeSNMPException( "Failed to validate {} hostname".format( self._snmp_parameters.ip), self._logger, ) else: raise InitializeSNMPException( "Failed to validate {} hostname".format( self._snmp_parameters.ip), self._logger, ) ip = ip_address(u"{}".format(self._snmp_parameters.ip)) if isinstance(ip, IPv6Address): config.addSocketTransport( snmp_engine, udp6.domainName, udp6.Udp6SocketTransport().openClientMode(), ) config.addTargetAddr( snmp_engine, "tgt", udp6.domainName, agent_udp_endpoint, "pms", snmp_timeout, snmp_retry_count, ) else: config.addSocketTransport( snmp_engine, udp.domainName, udp.UdpSocketTransport().openClientMode()) config.addTargetAddr( snmp_engine, "tgt", udp.domainName, agent_udp_endpoint, "pms", snmp_timeout, snmp_retry_count, )
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 start(): transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode( ('localhost', SNMP_TEST_AGENT_PORT))) transportDispatcher.registerRecvCbFun(cbFun) transportDispatcher.jobStarted(1) try: transportDispatcher.runDispatcher() except select.error: pass
def run(self): self._transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode(self._address)) getLogger().info("Now listening on %s:%s" % self._address) self._transportDispatcher.jobStarted(1) try: self._transportDispatcher.runDispatcher(timeout=1) except Exception as e: getLogger().error(u"Error while handling an SNMP message: %s" % unicode(e))
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): """Run the sensor on its own thread""" # Check for debug mode being activated/deactivated self._read_my_msgQ_noWait() try: self._log_debug("Start processing") # Create MIB loader to lookup oids sent in traps self._mib_builder() # Create an asynchronous dispatcher and register a callback method to handle incoming traps transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(self._trap_catcher) # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode( (self._bind_ip, self._bind_port))) # UDP/IPv6 transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openServerMode( ('::1', self._bind_port))) transportDispatcher.jobStarted(1) try: # Dispatcher will never finish as job #1 never reaches zero transportDispatcher.runDispatcher() except Exception as ae: self._log_debug("Exception: %r" % ae) transportDispatcher.closeDispatcher() self._log_debug("Finished processing, restarting SNMP listener") # Reset debug mode if persistence is not enabled self._disable_debug_if_persist_false() # Schedule the next time to run thread self._scheduler.enter(10, self._priority, self.run, ()) # Could not bind to IP:port, log it and exit out module except Exception as ae: self._log_debug( "Unable to process SNMP traps from this node, closing module.") self._log_debug( f"SNMP Traps sensor attempted to bind to {self._bind_ip}:{self._bind_port}" )
def __init__(self, ip, port): threading.Thread.__init__(self) #self.thread_stop = False self.notifyDispatcher = AsynsockDispatcherEX() self.notifyDispatcher.registerRecvCbFun(self.cbFun) # UDP/IPv4 try: self.notifyDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode((ip, port))) self.notifyDispatcher.jobStarted(1) except: print 'failed to create the socket'
def run(self): transport_dispatcher = AsynsockDispatcher() transport_dispatcher.registerRecvCbFun(self._callback) transport_dispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode((self.address, self.port))) transport_dispatcher.jobStarted(1) try: transport_dispatcher.runDispatcher() except Exception as exc: transport_dispatcher.closeDispatcher() raise exc
def snmp_trap_receiver(ifname, port=162): if_ip = get_ip_address(ifname) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbFun) transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode((if_ip, port))) transportDispatcher.jobStarted(1) print('SNMP Trap Receiver Started!!!') try: transportDispatcher.runDispatcher() except: transportDispatcher.closeDispatcher() raise
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 __init__(self): self.log.info("started (org)") # Use the default thread transaction manager. try: self.transaction_manager = transaction.manager self.interaction = ParanoidSecurityPolicy(SystemSnmpdParticipation()) self.transportDispatcher = AsynsockDispatcher() self.transportDispatcher.registerTransport( # udp.domainName, udp.UdpSocketTransport().openServerMode(('localhost', 162)) udp.domainName, udp.UdpSocketTransport().openServerMode(('', 11162)) ) self.transportDispatcher.registerRecvCbFun(self.cbFun) self.transportDispatcher.jobStarted(1) # this job would never finish except: # TODO: don't do this pass threading.Thread.__init__(self)
def main(): 'main program function' if os.path.isfile(CONFIG_FILE): filename = CONFIG_FILE elif os.path.isfile('/config/{0}'.format(CONFIG_FILE)): filename = '/config/{0}'.format(CONFIG_FILE) else: print 'Error: cannot find configuration file', CONFIG_FILE return processConfig(filename) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbFun) # UDP/IPv4 if gArgs.virtual_router: lookupVR(gArgs.virtual_router) # During startup, the IP address may not be ready yet. So we try a few times for retry in range(30): try: transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode( (gArgs.ip_address, 162))) break except Exception: time.sleep(5) # UDP/IPv6 transportDispatcher.registerTransport( udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))) transportDispatcher.jobStarted(1) try: # Dispatcher will never finish as job#1 never reaches zero transportDispatcher.runDispatcher() except Exception: transportDispatcher.closeDispatcher() raise
def snmp_trap_receiver(ifname, port=162): if_ip = get_ip_address(ifname) transportDispatcher = AsynsockDispatcher() # 创建实例 transportDispatcher.registerRecvCbFun(cbFun) # 调用处理Trap信息的函数 # UDP/IPv4 transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode((if_ip, port)) # 绑定到本地地址与UDP/162号端口 ) transportDispatcher.jobStarted(1) # 开始工作 print("SNMP Trap Receiver Started!!!") try: # Dispatcher will never finish as job#1 never reaches zero transportDispatcher.runDispatcher() # 运行 except: transportDispatcher.closeDispatcher() raise
def notif_Receiver(): def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg): transportDispatcher.jobFinished(1) return transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(cbFun) transportDispatcher.registerTransport( udp.domainName, udp.UdpSocketTransport().openServerMode((raspberry_ip, 1162))) transportDispatcher.jobStarted(1) try: transportDispatcher.runDispatcher() except: transportDispatcher.closeDispatcher() raise return
def __init__(self): self.snmpEngine = engine.SnmpEngine() config.addSocketTransport( self.snmpEngine, udp.domainName, udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))) config.addV1System(self.snmpEngine, 'test-agent', 'public') config.addV3User( self.snmpEngine, 'test-user', config.usmHMACMD5AuthProtocol, 'authkey1', config.usmDESPrivProtocol, 'privkey1' # '80004fb81c3dafe69' # ContextEngineID of Notification Originator ) # Apps registration ntfrcv.NotificationReceiver(self.snmpEngine, self.recvcallback) self.snmpEngine.transportDispatcher.jobStarted( 1) # this job would never finish self.snmpEngine.transportDispatcher.runDispatcher()
def __init__(self, community, ip, version=1): self.__community = community self.__ip = ip self.__version = version self.__errorIndication = None self.__errorStatus = None self.__errorIndex = None self.__varBinds = None #self.__lock = threading.Lock() self.__snmp_engine = engine.SnmpEngine() config.addV1System(self.__snmp_engine, 'test-agent', self.__community) config.addTargetParams(self.__snmp_engine, 'myParams', 'test-agent', 'noAuthNoPriv', self.__version) config.addTargetAddr(self.__snmp_engine, 'myRouter', config.snmpUDPDomain, (self.__ip, 161), 'myParams') config.addSocketTransport(self.__snmp_engine, udp.domainName, udp.UdpSocketTransport().openClientMode())
def _trap_receiver(trap_filter, host, port, timeout): started = time.time() def _trap_timer_cb(now): if now - started > timeout: raise AssertionError('No matching trap received in %s.' % robot.utils.secs_to_timestr(timeout)) def _trap_receiver_cb(transport, domain, sock, msg): if decodeMessageVersion(msg) != protoVersion2c: raise RuntimeError('Only SNMP v2c traps are supported.') req, msg = decoder.decode(msg, asn1Spec=v2c.Message()) pdu = v2c.apiMessage.getPDU(req) # ignore any non trap PDUs if not pdu.isSameTypeWith(v2c.TrapPDU()): return if trap_filter(domain, sock, pdu): raise StopListener() # Stop the receiver if the trap we are looking for was received. if False: raise StopListener() dispatcher = AsynsockDispatcher() dispatcher.registerRecvCbFun(_trap_receiver_cb) dispatcher.registerTimerCbFun(_trap_timer_cb) transport = udp.UdpSocketTransport().openServerMode((host, port)) dispatcher.registerTransport(udp.domainName, transport) # we'll never finish, except through an exception dispatcher.jobStarted(1) try: dispatcher.runDispatcher() except StopListener: pass finally: dispatcher.closeDispatcher()
def run(self): transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(trapCallback) if self.ipv6: transport = udp.Udp6SocketTransport() domainName = udp6.domainName else: transport = udp.UdpSocketTransport() domainName = udp.domainName try: transportDispatcher.registerTransport(domainName, transport.openServerMode((self.host, self.port))) transportDispatcher.jobStarted(1) # Dispatcher will never finish as job#1 never reaches zero transportDispatcher.runDispatcher() except: # catch *all* exceptions e = sys.exc_info()[1] transportDispatcher.closeDispatcher() logging.error("Failed to register transport and run dispatcher: %s" % str(e)) sys.exit(1)
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')