def listen( address=DEFAULT_ADDRESSS, port=DEFAULT_PORT, community=DEFAULT_COMMUNITY, mibs=DEFAULT_MIBS, ): """Listen to and SNMP trap and print events.""" # Based on pySNMP example code. mib_builder = builder.MibBuilder() compiler.addMibCompiler(mib_builder) mib_builder.loadModules(*mibs) global _view_controller _view_controller = view.MibViewController(mib_builder) loop = asyncio.get_event_loop() snmp_engine = engine.SnmpEngine() print(f"Agent is listening SNMP Trap on {address}, Port: {port}") if port < 1024: print( "WARNING: Port < 1024. Root priviledges or authbind required on *nix systems." ) print("-" * 79) config.addTransport( snmp_engine, udp.domainName + (1, ), udp.UdpTransport().openServerMode((address, port)), ) config.addV1System(snmp_engine, community, community) ntfrcv.NotificationReceiver(snmp_engine, _listen_callback) print("Press CTRL-C to quit.") loop.run_forever()
def _enable_transport_ipv4(self): servermode = udp.UdpTransport().openServerMode( (self._config["traps"]["transport"]["ipv4"]["listen"], int(self._config["traps"]["transport"]["ipv4"]["port"]))) self.transports["[UDP]ipv4"] = servermode pysnmp.entity.config.addTransport(self._engine, udp.domainName, servermode) log.info("Init UDP[ipv4] transport on {listen}:{port}".format( listen=self._config["traps"]["transport"]["ipv4"]["listen"], port=self._config["traps"]["transport"]["ipv4"]["port"]))
from pysnmp.carrier.asyncio.dgram import udp from pysnmp.entity.rfc3413 import ntfrcv import asyncio # Get the event loop for this thread loop = asyncio.get_event_loop() # Create SNMP engine with autogenernated engineID and pre-bound # to socket transport dispatcher snmpEngine = engine.SnmpEngine() # Transport setup # UDP over IPv4, first listening interface/port config.addTransport(snmpEngine, udp.domainName + (1, ), udp.UdpTransport().openServerMode(('127.0.0.1', 162))) # UDP over IPv4, second listening interface/port config.addTransport(snmpEngine, udp.domainName + (2, ), udp.UdpTransport().openServerMode(('127.0.0.1', 2162))) # SNMPv1/2c setup # SecurityName <-> CommunityName mapping config.addV1System(snmpEngine, 'my-area', 'public') # Callback function for receiving notifications # noinspection PyUnusedLocal def cbFun(snmpEngine, stateReference, contextEngineId, contextName, varBinds, cbCtx):
# SecurityName <-> CommunityName mapping config.addV1System(snmpEngine, 'my-area', 'public') # Specify security settings per SecurityName (SNMPv1 -> 0) config.addTargetParams(snmpEngine, 'my-creds', 'my-area', 'noAuthNoPriv', 0) # Transport setup # # Setup transport endpoint and bind it with security settings yielding # a target name. Since Notifications could be sent to multiple Managers # at once, more than one target entry may be configured (and tagged). # # UDP/IPv4 config.addTransport(snmpEngine, udp.domainName, udp.UdpTransport().openClientMode()) config.addTargetAddr(snmpEngine, 'my-nms-1', udp.domainName, ('127.0.0.1', 162), 'my-creds', tagList='all-my-managers') # Specify what kind of notification should be sent (TRAP or INFORM), # to what targets (chosen by tag) and what filter should apply to # the set of targets (selected by tag) config.addNotificationTarget(snmpEngine, 'my-notification', 'my-filter', 'all-my-managers', 'trap') # Allow NOTIFY access to Agent's MIB by this SNMP model (1), securityLevel # and SecurityName config.addContext(snmpEngine, '')
def main(): # Get the event loop for this thread loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) # Create SNMP engine with autogenernated engineID and pre-bound # to socket transport dispatcher snmpEngine = engine.SnmpEngine() # UDP over IPv4, first listening interface/port config.addTransport( snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(("0.0.0.0", 2162)), ) with open(CONFIG_PATH, encoding="utf-8") as file: config_base = yaml.safe_load(file) idx = 0 if "communities" in config_base: if "2c" in config_base["communities"]: for community in config_base["communities"]["2c"]: idx += 1 config.addV1System(snmpEngine, idx, community) if "usernameSecrets" in config_base: for secret in config_base["usernameSecrets"]: location = os.path.join("secrets/snmpv3", secret) userName = get_secret_value(location, "userName", required=True, default=None) authKey = get_secret_value(location, "authKey", required=False) privKey = get_secret_value(location, "privKey", required=False) authProtocol = get_secret_value(location, "authProtocol", required=False) logging.debug(f"authProtocol: {authProtocol}") authProtocol = AuthProtocolMap.get(authProtocol.upper(), "NONE") privProtocol = get_secret_value(location, "privProtocol", required=False, default="NONE") logging.debug(f"privProtocol: {privProtocol}") privProtocol = PrivProtocolMap.get(privProtocol.upper(), "NONE") config.addV3User( snmpEngine, userName=userName, authProtocol=authProtocol, authKey=authKey, privProtocol=privProtocol, privKey=privKey, securityEngineId=v2c.OctetString(hexValue=SECURITY_ENGINE_ID), ) logging.debug( f"V3 users: {userName} auth {authProtocol} authkey {authKey} privprotocol {privProtocol} " f"privkey {privKey} securityEngineId {SECURITY_ENGINE_ID}") # Register SNMP Application at the SNMP engine ntfrcv.NotificationReceiver(snmpEngine, cbFun) # Run asyncio main loop loop.run_forever()