etingof / pysnmp

Python SNMP library
http://snmplabs.com/pysnmp/
BSD 2-Clause "Simplified" License
576 stars 193 forks source link

How to add snmpv3 user in following code snippet for SNMP Trap Receiver. #396

Open rkumar1991 opened 3 years ago

rkumar1991 commented 3 years ago

Hi, I am new to SNMP and want to create a SNMP Trap Receiver.

I found following code for Trap Receiver but not sure where and how to add snmpv3 user in following code snippet. kindly help. code found: https://pysnmp.readthedocs.io/en/latest/examples/v1arch/asyncore/manager/ntfrcv/transport-tweaks.html#listen-for-notifications-at-ipv4-ipv6-interfaces

from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher from pysnmp.carrier.asyncore.dgram import udp, udp6 from pyasn1.codec.ber import decoder from pysnmp.proto import api

noinspection PyUnusedLocal

def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):

while wholeMsg:
    msgVer = int(api.decodeMessageVersion(wholeMsg))
    if msgVer in api.PROTOCOL_MODULES:
        pMod = api.PROTOCOL_MODULES[msgVer]

    else:
        print('Unsupported SNMP version %s' % msgVer)
        return

    reqMsg, wholeMsg = decoder.decode(
        wholeMsg, asn1Spec=pMod.Message(),
    )

    print('Notification message from %s:%s: ' % (transportDomain,
                                                 transportAddress))

    reqPDU = pMod.apiMessage.getPDU(reqMsg)
    if reqPDU.isSameTypeWith(pMod.TrapPDU()):
        if msgVer == api.SNMP_VERSION_1:
            print('Enterprise: %s' % (pMod.apiTrapPDU.getEnterprise(reqPDU).prettyPrint()))
            print('Agent Address: %s' % (pMod.apiTrapPDU.getAgentAddr(reqPDU).prettyPrint()))
            print('Generic Trap: %s' % (pMod.apiTrapPDU.getGenericTrap(reqPDU).prettyPrint()))
            print('Specific Trap: %s' % (pMod.apiTrapPDU.getSpecificTrap(reqPDU).prettyPrint()))
            print('Uptime: %s' % (pMod.apiTrapPDU.getTimeStamp(reqPDU).prettyPrint()))
            varBinds = pMod.apiTrapPDU.getVarBinds(reqPDU)

        else:
            varBinds = pMod.apiPDU.getVarBinds(reqPDU)

        print('Var-binds:')

        for oid, val in varBinds:
            print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))

return wholeMsg

transportDispatcher = AsyncoreDispatcher()

transportDispatcher.registerRecvCbFun(cbFun)

UDP/IPv4

transportDispatcher.registerTransport( udp.DOMAIN_NAME, udp.UdpSocketTransport().openServerMode(('localhost', 162)) )

UDP/IPv6

transportDispatcher.registerTransport( udp6.DOMAIN_NAME, udp6.Udp6SocketTransport().openServerMode(('::1', 162)) )

transportDispatcher.jobStarted(1)

try:

Dispatcher will never finish as job#1 never reaches zero

transportDispatcher.runDispatcher()

finally: transportDispatcher.closeDispatcher()

lextm commented 7 months ago

You can find a more recent sample here,

https://github.com/lextudio/pysnmp/blob/v5.0.35/examples/v3arch/asyncio/agent/cmdrsp/multiple-snmp-communities.py#L40

To add v3 users, simply use config.addV3User method, which works similar to config.addV1System but requires more parameters.