Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
 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"]))
Ejemplo n.º 3
0
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):
Ejemplo n.º 4
0
# 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, '')
Ejemplo n.º 5
0
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()