1"""
2Multiple SNMP USM users
3+++++++++++++++++++++++
4
5Receive SNMP TRAP/INFORM messages with the following options:
6
7* SNMPv3
8* with USM users:
9    * 'usr-md5-des', auth: MD5, priv DES, ContextEngineId: 8000000001020304
10    * 'usr-md5-none', auth: MD5, priv NONE, ContextEngineId: 8000000001020304
11    * 'usr-sha-aes128', auth: SHA, priv AES, ContextEngineId: 8000000001020304
12* over IPv4/UDP, listening at 127.0.0.1:162
13* using Twisted framework for network transport
14* print received data on stdout
15
16Either of the following Net-SNMP commands will send notifications to this
17receiver:
18
19| $ snmptrap -v3 -u usr-md5-des -l authPriv -A authkey1 -X privkey1 -e 8000000001020304 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1
20| $ snmptrap -v3 -u usr-md5-none -l authNoPriv -A authkey1 -e 8000000001020304 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1
21| $ snmpinform -v3 -u usr-sha-aes128 -l authPriv -a SHA -A authkey1 -x AES -X privkey1 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1
22
23"""#
24from twisted.internet import reactor
25from pysnmp.entity import engine, config
26from pysnmp.carrier.twisted.dgram import udp
27from pysnmp.entity.rfc3413 import ntfrcv
28from pysnmp.proto import rfc1902
29
30# Create SNMP engine with autogenernated engineID and pre-bound
31# to socket transport dispatcher
32snmpEngine = engine.SnmpEngine()
33
34# Transport setup
35
36# UDP over IPv4
37config.addTransport(
38    snmpEngine,
39    udp.domainName,
40    udp.UdpTwistedTransport().openServerMode(('127.0.0.1', 162))
41)
42
43# -- begin of SNMPv3/USM setup
44
45# user: usr-md5-des, auth: MD5, priv DES
46config.addV3User(
47    snmpEngine, 'usr-md5-des',
48    config.usmHMACMD5AuthProtocol, 'authkey1',
49    config.usmDESPrivProtocol, 'privkey1'
50)
51
52# user: usr-md5-des, auth: MD5, priv DES, securityEngineId: 8000000001020304
53# this USM entry is used for TRAP receiving purposes
54config.addV3User(
55    snmpEngine, 'usr-md5-des',
56    config.usmHMACMD5AuthProtocol, 'authkey1',
57    config.usmDESPrivProtocol, 'privkey1',
58    securityEngineId=rfc1902.OctetString(hexValue='8000000001020304')
59)
60
61# user: usr-md5-none, auth: MD5, priv NONE
62config.addV3User(
63    snmpEngine, 'usr-md5-none',
64    config.usmHMACMD5AuthProtocol, 'authkey1'
65)
66
67# user: usr-md5-none, auth: MD5, priv NONE, securityEngineId: 8000000001020304
68# this USM entry is used for TRAP receiving purposes
69config.addV3User(
70    snmpEngine, 'usr-md5-none',
71    config.usmHMACMD5AuthProtocol, 'authkey1',
72    securityEngineId=rfc1902.OctetString(hexValue='8000000001020304')
73)
74
75# user: usr-sha-aes128, auth: SHA, priv AES
76config.addV3User(
77    snmpEngine, 'usr-sha-aes128',
78    config.usmHMACSHAAuthProtocol, 'authkey1',
79    config.usmAesCfb128Protocol, 'privkey1'
80)
81
82# user: usr-sha-aes128, auth: SHA, priv AES, securityEngineId: 8000000001020304
83# this USM entry is used for TRAP receiving purposes
84config.addV3User(
85    snmpEngine, 'usr-sha-aes128',
86    config.usmHMACSHAAuthProtocol, 'authkey1',
87    config.usmAesCfb128Protocol, 'privkey1',
88    securityEngineId=rfc1902.OctetString(hexValue='8000000001020304')
89)
90
91
92# -- end of SNMPv3/USM setup
93
94# Callback function for receiving notifications
95# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
96def cbFun(snmpEngine, stateReference, contextEngineId, contextName,
97          varBinds, cbCtx):
98    print('Notification from ContextEngineId "%s", ContextName "%s"' % (contextEngineId.prettyPrint(),
99                                                                        contextName.prettyPrint()))
100    for name, val in varBinds:
101        print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
102
103
104# Register SNMP Application at the SNMP engine
105ntfrcv.NotificationReceiver(snmpEngine, cbFun)
106
107# Run Twisted main loop
108reactor.run()
109