From 9f6230113ecd60c40d9739bf43799f9eac306a32 Mon Sep 17 00:00:00 2001 From: Ilya Etingof Date: Mon, 6 Nov 2017 14:32:00 +0100 Subject: encode IPv6 requirement into example scripts names (#102) --- ...ltiple-concurrent-queries-over-ipv4-and-ipv6.py | 54 +++++++ .../manager/cmdgen/multiple-concurrent-queries.py | 54 ------- ...ltiple-concurrent-queries-over-ipv4-and-ipv6.py | 80 ++++++++++ .../manager/cmdgen/multiple-concurrent-queries.py | 80 ---------- ...m-multiple-agents-at-once-over-ipv4-and-ipv6.py | 73 +++++++++ .../pull-mibs-from-multiple-agents-at-once.py | 73 --------- ...ery-multiple-snmp-engines-over-ipv4-and-ipv6.py | 95 ++++++++++++ .../manager/cmdgen/query-multiple-snmp-engines.py | 95 ------------ ...k-fetch-scalar-and-table-variables-over-ipv6.py | 42 ++++++ .../getbulk-fetch-scalar-and-table-variables.py | 42 ------ .../sync/manager/cmdgen/preload-pysnmp-mibs.py | 8 +- ...nts-from-multuple-threads-over-ipv4-and-ipv6.py | 124 ++++++++++++++++ .../cmdgen/query-agents-from-multuple-threads.py | 124 ---------------- ...enting-scalar-mib-objects-over-ipv4-and-ipv6.py | 165 +++++++++++++++++++++ .../cmdrsp/implementing-scalar-mib-objects.py | 165 --------------------- ...ltiple-network-transports-incl-ipv4-and-ipv6.py | 71 +++++++++ .../manager/ntfrcv/multiple-network-transports.py | 71 --------- ...bserve-request-processing-over-ipv4-and-ipv6.py | 97 ++++++++++++ .../manager/ntfrcv/observe-request-processing.py | 97 ------------ .../proxy/command/ipv6-to-ipv4-conversion.py | 144 ++++++++++++++++++ .../proxy/command/udp6-to-udp4-conversion.py | 144 ------------------ 21 files changed, 949 insertions(+), 949 deletions(-) create mode 100644 examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py delete mode 100644 examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries.py create mode 100644 examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py delete mode 100644 examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries.py create mode 100644 examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once-over-ipv4-and-ipv6.py delete mode 100644 examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once.py create mode 100644 examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines-over-ipv4-and-ipv6.py delete mode 100644 examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines.py create mode 100644 examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables-over-ipv6.py delete mode 100644 examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables.py create mode 100644 examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads-over-ipv4-and-ipv6.py delete mode 100644 examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py create mode 100644 examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects-over-ipv4-and-ipv6.py delete mode 100644 examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects.py create mode 100644 examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports-incl-ipv4-and-ipv6.py delete mode 100644 examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports.py create mode 100644 examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing-over-ipv4-and-ipv6.py delete mode 100644 examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing.py create mode 100644 examples/v3arch/asyncore/proxy/command/ipv6-to-ipv4-conversion.py delete mode 100644 examples/v3arch/asyncore/proxy/command/udp6-to-udp4-conversion.py (limited to 'examples') diff --git a/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py b/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..ad9c441b --- /dev/null +++ b/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py @@ -0,0 +1,54 @@ +""" +Concurrent queries +++++++++++++++++++ + +Send multiple SNMP GET requests at once using the following options: + +* with SNMPv2c, community 'public' +* over IPv4/UDP +* to multiple Agents at demo.snmplabs.com +* for instance of SNMPv2-MIB::sysDescr.0 MIB object +* based on asyncio I/O framework + +Functionally similar to: + +| $ snmpget -v2c -c public demo.snmplabs.com:1161 SNMPv2-MIB::sysDescr.0 +| $ snmpget -v2c -c public demo.snmplabs.com:2161 SNMPv2-MIB::sysDescr.0 +| $ snmpget -v2c -c public demo.snmplabs.com:3161 SNMPv2-MIB::sysDescr.0 + +"""# +import asyncio +from pysnmp.hlapi.asyncio import * + + +@asyncio.coroutine +def getone(snmpEngine, hostname): + errorIndication, errorStatus, errorIndex, varBinds = yield from getCmd( + snmpEngine, + CommunityData('public'), + UdpTransportTarget(hostname), + ContextData(), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)) + ) + + if errorIndication: + print(errorIndication) + elif errorStatus: + print('%s at %s' % ( + errorStatus.prettyPrint(), + errorIndex and varBinds[int(errorIndex) - 1][0] or '?' + ) + ) + else: + for varBind in varBinds: + print(' = '.join([x.prettyPrint() for x in varBind])) + + +snmpEngine = SnmpEngine() + +loop = asyncio.get_event_loop() +loop.run_until_complete( + asyncio.wait([getone(snmpEngine, ('demo.snmplabs.com', 1161)), + getone(snmpEngine, ('demo.snmplabs.com', 2161)), + getone(snmpEngine, ('demo.snmplabs.com', 3161))]) +) diff --git a/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries.py b/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries.py deleted file mode 100644 index ad9c441b..00000000 --- a/examples/hlapi/asyncio/manager/cmdgen/multiple-concurrent-queries.py +++ /dev/null @@ -1,54 +0,0 @@ -""" -Concurrent queries -++++++++++++++++++ - -Send multiple SNMP GET requests at once using the following options: - -* with SNMPv2c, community 'public' -* over IPv4/UDP -* to multiple Agents at demo.snmplabs.com -* for instance of SNMPv2-MIB::sysDescr.0 MIB object -* based on asyncio I/O framework - -Functionally similar to: - -| $ snmpget -v2c -c public demo.snmplabs.com:1161 SNMPv2-MIB::sysDescr.0 -| $ snmpget -v2c -c public demo.snmplabs.com:2161 SNMPv2-MIB::sysDescr.0 -| $ snmpget -v2c -c public demo.snmplabs.com:3161 SNMPv2-MIB::sysDescr.0 - -"""# -import asyncio -from pysnmp.hlapi.asyncio import * - - -@asyncio.coroutine -def getone(snmpEngine, hostname): - errorIndication, errorStatus, errorIndex, varBinds = yield from getCmd( - snmpEngine, - CommunityData('public'), - UdpTransportTarget(hostname), - ContextData(), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)) - ) - - if errorIndication: - print(errorIndication) - elif errorStatus: - print('%s at %s' % ( - errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or '?' - ) - ) - else: - for varBind in varBinds: - print(' = '.join([x.prettyPrint() for x in varBind])) - - -snmpEngine = SnmpEngine() - -loop = asyncio.get_event_loop() -loop.run_until_complete( - asyncio.wait([getone(snmpEngine, ('demo.snmplabs.com', 1161)), - getone(snmpEngine, ('demo.snmplabs.com', 2161)), - getone(snmpEngine, ('demo.snmplabs.com', 3161))]) -) diff --git a/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py b/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..2b4b0eb3 --- /dev/null +++ b/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries-over-ipv4-and-ipv6.py @@ -0,0 +1,80 @@ +""" +Multiple concurrent queries ++++++++++++++++++++++++++++ + +Send a bunch of different SNMP GET requests to different peers all at once, +wait for responses asynchronously: + +* with SNMPv1, community 'public' and + with SNMPv2c, community 'public' and + with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy +* over IPv4/UDP and + over IPv6/UDP +* to an Agent at demo.snmplabs.com:161 and + to an Agent at [::1]:161 +* for instances of SNMPv2-MIB::sysDescr.0 and + SNMPv2-MIB::sysLocation.0 MIB objects + +"""# +from pysnmp.hlapi.asyncore import * + +# List of targets in the followin format: +# ( ( authData, transportTarget, varNames ), ... ) +targets = ( + # 1-st target (SNMPv1 over IPv4/UDP) + (CommunityData('public', mpModel=0), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 2-nd target (SNMPv2c over IPv4/UDP) + (CommunityData('public'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 3-nd target (SNMPv2c over IPv4/UDP) - same community and + # different transport address. + (CommunityData('public'), + UdpTransportTarget(('localhost', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)))), + # 4-nd target (SNMPv3 over IPv4/UDP) + (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 5-th target (SNMPv3 over IPv6/UDP) + (UsmUserData('usr-md5-none', 'authkey1'), + Udp6TransportTarget(('::1', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # N-th target + # ... +) + + +# Wait for responses or errors +# noinspection PyUnusedLocal,PyUnusedLocal +def cbFun(snmpEngine, sendRequestHandle, errorIndication, + errorStatus, errorIndex, varBinds, cbCtx): + authData, transportTarget = cbCtx + print('%s via %s' % (authData, transportTarget)) + if errorIndication: + print(errorIndication) + return True + elif errorStatus: + print('%s at %s' % (errorStatus.prettyPrint(), + errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) + return True + else: + for varBind in varBinds: + print(' = '.join([x.prettyPrint() for x in varBind])) + + +snmpEngine = SnmpEngine() + +# Submit GET requests +for authData, transportTarget, varNames in targets: + getCmd(snmpEngine, authData, transportTarget, ContextData(), *varNames, + **dict(cbFun=cbFun, cbCtx=(authData, transportTarget))) + +snmpEngine.transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries.py b/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries.py deleted file mode 100644 index 2b4b0eb3..00000000 --- a/examples/hlapi/asyncore/manager/cmdgen/multiple-concurrent-queries.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -Multiple concurrent queries -+++++++++++++++++++++++++++ - -Send a bunch of different SNMP GET requests to different peers all at once, -wait for responses asynchronously: - -* with SNMPv1, community 'public' and - with SNMPv2c, community 'public' and - with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy -* over IPv4/UDP and - over IPv6/UDP -* to an Agent at demo.snmplabs.com:161 and - to an Agent at [::1]:161 -* for instances of SNMPv2-MIB::sysDescr.0 and - SNMPv2-MIB::sysLocation.0 MIB objects - -"""# -from pysnmp.hlapi.asyncore import * - -# List of targets in the followin format: -# ( ( authData, transportTarget, varNames ), ... ) -targets = ( - # 1-st target (SNMPv1 over IPv4/UDP) - (CommunityData('public', mpModel=0), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 2-nd target (SNMPv2c over IPv4/UDP) - (CommunityData('public'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 3-nd target (SNMPv2c over IPv4/UDP) - same community and - # different transport address. - (CommunityData('public'), - UdpTransportTarget(('localhost', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)))), - # 4-nd target (SNMPv3 over IPv4/UDP) - (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 5-th target (SNMPv3 over IPv6/UDP) - (UsmUserData('usr-md5-none', 'authkey1'), - Udp6TransportTarget(('::1', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # N-th target - # ... -) - - -# Wait for responses or errors -# noinspection PyUnusedLocal,PyUnusedLocal -def cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, varBinds, cbCtx): - authData, transportTarget = cbCtx - print('%s via %s' % (authData, transportTarget)) - if errorIndication: - print(errorIndication) - return True - elif errorStatus: - print('%s at %s' % (errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) - return True - else: - for varBind in varBinds: - print(' = '.join([x.prettyPrint() for x in varBind])) - - -snmpEngine = SnmpEngine() - -# Submit GET requests -for authData, transportTarget, varNames in targets: - getCmd(snmpEngine, authData, transportTarget, ContextData(), *varNames, - **dict(cbFun=cbFun, cbCtx=(authData, transportTarget))) - -snmpEngine.transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once-over-ipv4-and-ipv6.py b/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..d87d55c5 --- /dev/null +++ b/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once-over-ipv4-and-ipv6.py @@ -0,0 +1,73 @@ +""" +Walk multiple Agents at once +++++++++++++++++++++++++++++ + +Iterate over MIBs of multiple SNMP Agents asynchronously using the +following options: + +* with SNMPv1, community 'public' and + with SNMPv2c, community 'public' and + with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy +* over IPv4/UDP and + over IPv6/UDP +* to an Agent at demo.snmplabs.com:161 and + to an Agent at [::1]:161 +* pull variables till EOM + +"""# +from pysnmp.hlapi.asyncore import * + +# List of targets in the followin format: +# ( ( authData, transportTarget, varNames ), ... ) +targets = ( + # 1-st target (SNMPv1 over IPv4/UDP) + (CommunityData('public', mpModel=0), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('1.3.6.1.2.1')), + ObjectType(ObjectIdentity('1.3.6.1.3.1')))), + # 2-nd target (SNMPv2c over IPv4/UDP) + (CommunityData('public'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('1.3.6.1.4.1')),)), + # 3-nd target (SNMPv3 over IPv4/UDP) + (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'system')),)), + # 4-th target (SNMPv3 over IPv6/UDP) + (UsmUserData('usr-md5-none', 'authkey1'), + Udp6TransportTarget(('::1', 161)), + (ObjectType(ObjectIdentity('IF-MIB', 'ifTable')),)) + # N-th target + # ... +) + + +# Wait for responses or errors, submit GETNEXT requests for further OIDs +# noinspection PyUnusedLocal,PyUnusedLocal +def cbFun(snmpEngine, sendRequestHandle, errorIndication, + errorStatus, errorIndex, varBindTable, cbCtx): + (authData, transportTarget) = cbCtx + print('%s via %s' % (authData, transportTarget)) + if errorIndication: + print(errorIndication) + return + elif errorStatus: + print('%s at %s' % (errorStatus.prettyPrint(), + errorIndex and varBindTable[-1][int(errorIndex) - 1][0] or '?')) + return + else: + for varBindRow in varBindTable: + for varBind in varBindRow: + print(' = '.join([x.prettyPrint() for x in varBind])) + + return True # continue table retrieval + + +snmpEngine = SnmpEngine() + +# Submit initial GETNEXT requests and wait for responses +for authData, transportTarget, varBinds in targets: + nextCmd(snmpEngine, authData, transportTarget, ContextData(), + *varBinds, **dict(cbFun=cbFun, cbCtx=(authData, transportTarget))) + +snmpEngine.transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once.py b/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once.py deleted file mode 100644 index d87d55c5..00000000 --- a/examples/hlapi/asyncore/manager/cmdgen/pull-mibs-from-multiple-agents-at-once.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Walk multiple Agents at once -++++++++++++++++++++++++++++ - -Iterate over MIBs of multiple SNMP Agents asynchronously using the -following options: - -* with SNMPv1, community 'public' and - with SNMPv2c, community 'public' and - with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy -* over IPv4/UDP and - over IPv6/UDP -* to an Agent at demo.snmplabs.com:161 and - to an Agent at [::1]:161 -* pull variables till EOM - -"""# -from pysnmp.hlapi.asyncore import * - -# List of targets in the followin format: -# ( ( authData, transportTarget, varNames ), ... ) -targets = ( - # 1-st target (SNMPv1 over IPv4/UDP) - (CommunityData('public', mpModel=0), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('1.3.6.1.2.1')), - ObjectType(ObjectIdentity('1.3.6.1.3.1')))), - # 2-nd target (SNMPv2c over IPv4/UDP) - (CommunityData('public'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('1.3.6.1.4.1')),)), - # 3-nd target (SNMPv3 over IPv4/UDP) - (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'system')),)), - # 4-th target (SNMPv3 over IPv6/UDP) - (UsmUserData('usr-md5-none', 'authkey1'), - Udp6TransportTarget(('::1', 161)), - (ObjectType(ObjectIdentity('IF-MIB', 'ifTable')),)) - # N-th target - # ... -) - - -# Wait for responses or errors, submit GETNEXT requests for further OIDs -# noinspection PyUnusedLocal,PyUnusedLocal -def cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, varBindTable, cbCtx): - (authData, transportTarget) = cbCtx - print('%s via %s' % (authData, transportTarget)) - if errorIndication: - print(errorIndication) - return - elif errorStatus: - print('%s at %s' % (errorStatus.prettyPrint(), - errorIndex and varBindTable[-1][int(errorIndex) - 1][0] or '?')) - return - else: - for varBindRow in varBindTable: - for varBind in varBindRow: - print(' = '.join([x.prettyPrint() for x in varBind])) - - return True # continue table retrieval - - -snmpEngine = SnmpEngine() - -# Submit initial GETNEXT requests and wait for responses -for authData, transportTarget, varBinds in targets: - nextCmd(snmpEngine, authData, transportTarget, ContextData(), - *varBinds, **dict(cbFun=cbFun, cbCtx=(authData, transportTarget))) - -snmpEngine.transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines-over-ipv4-and-ipv6.py b/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..4a732041 --- /dev/null +++ b/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines-over-ipv4-and-ipv6.py @@ -0,0 +1,95 @@ +""" +Multiple SNMP engines ++++++++++++++++++++++ + +Send multiple SNMP GET requests to multiple peers using multiple +independend SNMP engines. Deal with peers asynchronously. SNMP options +are: + +* with SNMPv1, community 'public' and + with SNMPv2c, community 'public' and + with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy +* over IPv4/UDP and + over IPv6/UDP +* to an Agent at demo.snmplabs.com:161 and + to an Agent at [::1]:161 +* for instances of SNMPv2-MIB::sysDescr.0 and + SNMPv2-MIB::sysLocation.0 MIB objects + +Within this script we have a single asynchronous TransportDispatcher +and a single UDP-based transport serving two independent SNMP engines. +We use a single instance of AsyncCommandGenerator with each of +SNMP Engines to comunicate GET command request to remote systems. + +When we receive a [response] message from remote system we use +a custom message router to choose what of the two SNMP engines +data packet should be handed over. The selection criteria we +employ here is based on peer's UDP port number. Other selection +criterias are also possible. + +"""# +from pysnmp.hlapi.asyncore import * +from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher + +# List of targets in the following format: +# ( ( authData, transportTarget, varNames ), ... ) +targets = ( + # 1-st target (SNMPv1 over IPv4/UDP) + (CommunityData('public', mpModel=0), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 2-nd target (SNMPv2c over IPv4/UDP) + (CommunityData('public'), + UdpTransportTarget(('demo.snmplabs.com', 1161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 3-nd target (SNMPv3 over IPv4/UDP) + (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), + UdpTransportTarget(('demo.snmplabs.com', 2161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))) + # N-th target + # ... +) + + +# Wait for responses or errors +# noinspection PyUnusedLocal,PyUnusedLocal +def cbFun(snmpEngine, sendRequestHandle, errorIndication, + errorStatus, errorIndex, varBinds, cbCtx): + (snmpEngine, authData, transportTarget) = cbCtx + print('snmpEngine %s: %s via %s' % (snmpEngine.snmpEngineID.prettyPrint(), authData, transportTarget)) + if errorIndication: + print(errorIndication) + return True + elif errorStatus: + print('%s at %s' % (errorStatus.prettyPrint(), + errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) + return True + else: + for varBind in varBinds: + print(' = '.join([x.prettyPrint() for x in varBind])) + + +# Instantiate the single transport dispatcher object +transportDispatcher = AsyncoreDispatcher() + +# Setup a custom data routing function to select snmpEngine by transportDomain +transportDispatcher.registerRoutingCbFun( + lambda td, ta, d: ta[1] % 3 and 'A' or 'B' +) + +snmpEngineA = SnmpEngine() +snmpEngineA.registerTransportDispatcher(transportDispatcher, 'A') + +snmpEngineB = SnmpEngine() +snmpEngineB.registerTransportDispatcher(transportDispatcher, 'B') + +for authData, transportTarget, varBinds in targets: + snmpEngine = transportTarget.getTransportInfo()[1][1] % 3 and \ + snmpEngineA or snmpEngineB + getCmd(snmpEngine, authData, transportTarget, ContextData(), *varBinds, + **dict(cbFun=cbFun, cbCtx=(snmpEngine, authData, transportTarget))) + +transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines.py b/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines.py deleted file mode 100644 index 4a732041..00000000 --- a/examples/hlapi/asyncore/manager/cmdgen/query-multiple-snmp-engines.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -Multiple SNMP engines -+++++++++++++++++++++ - -Send multiple SNMP GET requests to multiple peers using multiple -independend SNMP engines. Deal with peers asynchronously. SNMP options -are: - -* with SNMPv1, community 'public' and - with SNMPv2c, community 'public' and - with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy -* over IPv4/UDP and - over IPv6/UDP -* to an Agent at demo.snmplabs.com:161 and - to an Agent at [::1]:161 -* for instances of SNMPv2-MIB::sysDescr.0 and - SNMPv2-MIB::sysLocation.0 MIB objects - -Within this script we have a single asynchronous TransportDispatcher -and a single UDP-based transport serving two independent SNMP engines. -We use a single instance of AsyncCommandGenerator with each of -SNMP Engines to comunicate GET command request to remote systems. - -When we receive a [response] message from remote system we use -a custom message router to choose what of the two SNMP engines -data packet should be handed over. The selection criteria we -employ here is based on peer's UDP port number. Other selection -criterias are also possible. - -"""# -from pysnmp.hlapi.asyncore import * -from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher - -# List of targets in the following format: -# ( ( authData, transportTarget, varNames ), ... ) -targets = ( - # 1-st target (SNMPv1 over IPv4/UDP) - (CommunityData('public', mpModel=0), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 2-nd target (SNMPv2c over IPv4/UDP) - (CommunityData('public'), - UdpTransportTarget(('demo.snmplabs.com', 1161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 3-nd target (SNMPv3 over IPv4/UDP) - (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - UdpTransportTarget(('demo.snmplabs.com', 2161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))) - # N-th target - # ... -) - - -# Wait for responses or errors -# noinspection PyUnusedLocal,PyUnusedLocal -def cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, varBinds, cbCtx): - (snmpEngine, authData, transportTarget) = cbCtx - print('snmpEngine %s: %s via %s' % (snmpEngine.snmpEngineID.prettyPrint(), authData, transportTarget)) - if errorIndication: - print(errorIndication) - return True - elif errorStatus: - print('%s at %s' % (errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) - return True - else: - for varBind in varBinds: - print(' = '.join([x.prettyPrint() for x in varBind])) - - -# Instantiate the single transport dispatcher object -transportDispatcher = AsyncoreDispatcher() - -# Setup a custom data routing function to select snmpEngine by transportDomain -transportDispatcher.registerRoutingCbFun( - lambda td, ta, d: ta[1] % 3 and 'A' or 'B' -) - -snmpEngineA = SnmpEngine() -snmpEngineA.registerTransportDispatcher(transportDispatcher, 'A') - -snmpEngineB = SnmpEngine() -snmpEngineB.registerTransportDispatcher(transportDispatcher, 'B') - -for authData, transportTarget, varBinds in targets: - snmpEngine = transportTarget.getTransportInfo()[1][1] % 3 and \ - snmpEngineA or snmpEngineB - getCmd(snmpEngine, authData, transportTarget, ContextData(), *varBinds, - **dict(cbFun=cbFun, cbCtx=(snmpEngine, authData, transportTarget))) - -transportDispatcher.runDispatcher() diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables-over-ipv6.py b/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables-over-ipv6.py new file mode 100644 index 00000000..499c9b02 --- /dev/null +++ b/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables-over-ipv6.py @@ -0,0 +1,42 @@ +""" +Fetch scalar and table variables +++++++++++++++++++++++++++++++++ + +Send a series of SNMP GETBULK requests using the following options: + +* with SNMPv3 with user 'usr-md5-des', MD5 auth and DES privacy protocols +* over IPv6/UDP +* to an Agent at [::1]:161 +* with values non-repeaters = 1, max-repetitions = 25 +* for IP-MIB::ipAdEntAddr and all columns of the IF-MIB::ifEntry table +* stop when response OIDs leave the scopes of the table + +Functionally similar to: + +| $ snmpbulkwalk -v3 -lauthPriv -u usr-md5-des -A authkey1 -X privkey1 -Cn1, -Cr25 demo.snmplabs.com IP-MIB::ipAdEntAddr IP-MIB::ipAddrEntry + +"""# +from pysnmp.hlapi import * + +for (errorIndication, + errorStatus, + errorIndex, + varBinds) in bulkCmd(SnmpEngine(), + UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), + Udp6TransportTarget(('::1', 161)), + ContextData(), + 1, 25, + ObjectType(ObjectIdentity('IP-MIB', 'ipAdEntAddr')), + ObjectType(ObjectIdentity('IP-MIB', 'ipAddrEntry')), + lexicographicMode=False): + + if errorIndication: + print(errorIndication) + break + elif errorStatus: + print('%s at %s' % (errorStatus.prettyPrint(), + errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) + break + else: + for varBind in varBinds: + print(' = '.join([x.prettyPrint() for x in varBind])) diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables.py b/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables.py deleted file mode 100644 index 499c9b02..00000000 --- a/examples/hlapi/asyncore/sync/manager/cmdgen/getbulk-fetch-scalar-and-table-variables.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -Fetch scalar and table variables -++++++++++++++++++++++++++++++++ - -Send a series of SNMP GETBULK requests using the following options: - -* with SNMPv3 with user 'usr-md5-des', MD5 auth and DES privacy protocols -* over IPv6/UDP -* to an Agent at [::1]:161 -* with values non-repeaters = 1, max-repetitions = 25 -* for IP-MIB::ipAdEntAddr and all columns of the IF-MIB::ifEntry table -* stop when response OIDs leave the scopes of the table - -Functionally similar to: - -| $ snmpbulkwalk -v3 -lauthPriv -u usr-md5-des -A authkey1 -X privkey1 -Cn1, -Cr25 demo.snmplabs.com IP-MIB::ipAdEntAddr IP-MIB::ipAddrEntry - -"""# -from pysnmp.hlapi import * - -for (errorIndication, - errorStatus, - errorIndex, - varBinds) in bulkCmd(SnmpEngine(), - UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - Udp6TransportTarget(('::1', 161)), - ContextData(), - 1, 25, - ObjectType(ObjectIdentity('IP-MIB', 'ipAdEntAddr')), - ObjectType(ObjectIdentity('IP-MIB', 'ipAddrEntry')), - lexicographicMode=False): - - if errorIndication: - print(errorIndication) - break - elif errorStatus: - print('%s at %s' % (errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) - break - else: - for varBind in varBinds: - print(' = '.join([x.prettyPrint() for x in varBind])) diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/preload-pysnmp-mibs.py b/examples/hlapi/asyncore/sync/manager/cmdgen/preload-pysnmp-mibs.py index 27186431..a9bb2bb3 100644 --- a/examples/hlapi/asyncore/sync/manager/cmdgen/preload-pysnmp-mibs.py +++ b/examples/hlapi/asyncore/sync/manager/cmdgen/preload-pysnmp-mibs.py @@ -5,14 +5,14 @@ Preload PySNMP MIBs Send a series of SNMP GETNEXT requests using the following options: * with SNMPv3 with user 'usr-md5-des', MD5 auth and DES privacy protocols -* over IPv6/UDP -* to an Agent at [::1]:161 +* over IPv4/UDP +* to an Agent at demo.snmplabs.com:161 * for all OIDs starting from 1.3.6 * preload all Python MIB modules found in search path Functionally similar to: -| $ snmpwalk -v3 -l authPriv -u usr-md5-des -A authkey1 -X privkey1 -m ALL udp6:[::1]:161 1.3.6 +| $ snmpwalk -v3 -l authPriv -u usr-md5-des -A authkey1 -X privkey1 -m ALL demo.snmplabs.com:161 1.3.6 """# from pysnmp.hlapi import * @@ -22,7 +22,7 @@ for (errorIndication, errorIndex, varBinds) in nextCmd(SnmpEngine(), UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - Udp6TransportTarget(('::1', 161)), + UdpTransportTarget(('demo.snmplabs.com', 161)), ContextData(), ObjectType(ObjectIdentity('1.3.6').loadMibs())): diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads-over-ipv4-and-ipv6.py b/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..16995ed8 --- /dev/null +++ b/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads-over-ipv4-and-ipv6.py @@ -0,0 +1,124 @@ +""" +Query Agents from multiple threads +++++++++++++++++++++++++++++++++++ + +Send a bunch of SNMP GET requests simultaneously using the following options: + +* process 5 GET requests in 3 parallel threads +* with SNMPv1, community 'public' and + with SNMPv2c, community 'public' and + with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy +* over IPv4/UDP and + over IPv6/UDP +* to an Agent at demo.snmplabs.com:161 and + to an Agent at [::1]:161 +* for instances of SNMPv2-MIB::sysDescr.0 and + SNMPv2-MIB::sysLocation.0 MIB objects + +"""# +from sys import version_info +from threading import Thread +from pysnmp.hlapi import * + +if version_info[0] == 2: + from Queue import Queue +else: + from queue import Queue + +# List of targets in the following format: +# ( ( authData, transportTarget, varNames ), ... ) +targets = ( + # 1-st target (SNMPv1 over IPv4/UDP) + (CommunityData('public', mpModel=0), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 2-nd target (SNMPv2c over IPv4/UDP) + (CommunityData('public'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 3-nd target (SNMPv2c over IPv4/UDP) - same community and + # different transport address. + (CommunityData('public'), + UdpTransportTarget(('localhost', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)))), + # 4-nd target (SNMPv3 over IPv4/UDP) + (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), + UdpTransportTarget(('demo.snmplabs.com', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # 5-th target (SNMPv3 over IPv6/UDP) + (UsmUserData('usr-md5-none', 'authkey1'), + Udp6TransportTarget(('::1', 161)), + (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), + ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), + # N-th target + # ... +) + + +class Worker(Thread): + def __init__(self, requests, responses): + Thread.__init__(self) + self.snmpEngine = SnmpEngine() + self.requests = requests + self.responses = responses + self.setDaemon(True) + self.start() + + def run(self): + while True: + authData, transportTarget, varBinds = self.requests.get() + self.responses.append( + next(getCmd(self.snmpEngine, + authData, transportTarget, ContextData(), *varBinds)) + ) + if hasattr(self.requests, 'task_done'): # 2.5+ + self.requests.task_done() + + +class ThreadPool(object): + def __init__(self, num_threads): + self.requests = Queue(num_threads) + self.responses = [] + for _ in range(num_threads): + Worker(self.requests, self.responses) + + def addRequest(self, authData, transportTarget, varBinds): + self.requests.put((authData, transportTarget, varBinds)) + + def getResponses(self): + return self.responses + + def waitCompletion(self): + if hasattr(self.requests, 'join'): + self.requests.join() # 2.5+ + else: + from time import sleep + # this is a lame substitute for missing .join() + # adding an explicit synchronization might be a better solution + while not self.requests.empty(): + sleep(1) + + +pool = ThreadPool(3) + +# Submit GET requests +for authData, transportTarget, varBinds in targets: + pool.addRequest(authData, transportTarget, varBinds) + +# Wait for responses or errors +pool.waitCompletion() + +# Walk through responses +for errorIndication, errorStatus, errorIndex, varBinds in pool.getResponses(): + if errorIndication: + print(errorIndication) + elif errorStatus: + print('%s at %s' % (errorStatus.prettyPrint(), + errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) + else: + for varBind in varBinds: + print(' = '.join([x.prettyPrint() for x in varBind])) diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py b/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py deleted file mode 100644 index 16995ed8..00000000 --- a/examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py +++ /dev/null @@ -1,124 +0,0 @@ -""" -Query Agents from multiple threads -++++++++++++++++++++++++++++++++++ - -Send a bunch of SNMP GET requests simultaneously using the following options: - -* process 5 GET requests in 3 parallel threads -* with SNMPv1, community 'public' and - with SNMPv2c, community 'public' and - with SNMPv3, user 'usr-md5-des', MD5 auth and DES privacy -* over IPv4/UDP and - over IPv6/UDP -* to an Agent at demo.snmplabs.com:161 and - to an Agent at [::1]:161 -* for instances of SNMPv2-MIB::sysDescr.0 and - SNMPv2-MIB::sysLocation.0 MIB objects - -"""# -from sys import version_info -from threading import Thread -from pysnmp.hlapi import * - -if version_info[0] == 2: - from Queue import Queue -else: - from queue import Queue - -# List of targets in the following format: -# ( ( authData, transportTarget, varNames ), ... ) -targets = ( - # 1-st target (SNMPv1 over IPv4/UDP) - (CommunityData('public', mpModel=0), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 2-nd target (SNMPv2c over IPv4/UDP) - (CommunityData('public'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 3-nd target (SNMPv2c over IPv4/UDP) - same community and - # different transport address. - (CommunityData('public'), - UdpTransportTarget(('localhost', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)))), - # 4-nd target (SNMPv3 over IPv4/UDP) - (UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), - UdpTransportTarget(('demo.snmplabs.com', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # 5-th target (SNMPv3 over IPv6/UDP) - (UsmUserData('usr-md5-none', 'authkey1'), - Udp6TransportTarget(('::1', 161)), - (ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)), - ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))), - # N-th target - # ... -) - - -class Worker(Thread): - def __init__(self, requests, responses): - Thread.__init__(self) - self.snmpEngine = SnmpEngine() - self.requests = requests - self.responses = responses - self.setDaemon(True) - self.start() - - def run(self): - while True: - authData, transportTarget, varBinds = self.requests.get() - self.responses.append( - next(getCmd(self.snmpEngine, - authData, transportTarget, ContextData(), *varBinds)) - ) - if hasattr(self.requests, 'task_done'): # 2.5+ - self.requests.task_done() - - -class ThreadPool(object): - def __init__(self, num_threads): - self.requests = Queue(num_threads) - self.responses = [] - for _ in range(num_threads): - Worker(self.requests, self.responses) - - def addRequest(self, authData, transportTarget, varBinds): - self.requests.put((authData, transportTarget, varBinds)) - - def getResponses(self): - return self.responses - - def waitCompletion(self): - if hasattr(self.requests, 'join'): - self.requests.join() # 2.5+ - else: - from time import sleep - # this is a lame substitute for missing .join() - # adding an explicit synchronization might be a better solution - while not self.requests.empty(): - sleep(1) - - -pool = ThreadPool(3) - -# Submit GET requests -for authData, transportTarget, varBinds in targets: - pool.addRequest(authData, transportTarget, varBinds) - -# Wait for responses or errors -pool.waitCompletion() - -# Walk through responses -for errorIndication, errorStatus, errorIndex, varBinds in pool.getResponses(): - if errorIndication: - print(errorIndication) - elif errorStatus: - print('%s at %s' % (errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) - else: - for varBind in varBinds: - print(' = '.join([x.prettyPrint() for x in varBind])) diff --git a/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects-over-ipv4-and-ipv6.py b/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..328e5d28 --- /dev/null +++ b/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects-over-ipv4-and-ipv6.py @@ -0,0 +1,165 @@ +""" +Implementing scalar MIB objects ++++++++++++++++++++++++++++++++ + +Listen and respond to SNMP GET/GETNEXT queries with the following options: + +* SNMPv1 or SNMPv2c +* with SNMP community "public" +* over IPv4/UDP, listening at 127.0.0.1:161 +* over IPv6/UDP, listening at [::1]:161 +* serving two Managed Objects Instances (sysDescr.0 and sysUptime.0) + +Either of the following Net-SNMP commands will walk this Agent: + +| $ snmpwalk -v2c -c public 127.0.0.1 .1.3.6 +| $ snmpwalk -v2c -c public udp6:[::1] .1.3.6 + +The Command Receiver below uses two distinct transports for communication +with Command Generators - UDP over IPv4 and UDP over IPv6. + +"""# +from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher +from pysnmp.carrier.asyncore.dgram import udp, udp6, unix +from pyasn1.codec.ber import encoder, decoder +from pysnmp.proto import api +import time, bisect + + +class SysDescr(object): + name = (1, 3, 6, 1, 2, 1, 1, 1, 0) + + def __eq__(self, other): return self.name == other + + def __ne__(self, other): return self.name != other + + def __lt__(self, other): return self.name < other + + def __le__(self, other): return self.name <= other + + def __gt__(self, other): return self.name > other + + def __ge__(self, other): return self.name >= other + + def __call__(self, protoVer): + return api.protoModules[protoVer].OctetString( + 'PySNMP example command responder' + ) + + +class Uptime(object): + name = (1, 3, 6, 1, 2, 1, 1, 3, 0) + birthday = time.time() + + def __eq__(self, other): return self.name == other + + def __ne__(self, other): return self.name != other + + def __lt__(self, other): return self.name < other + + def __le__(self, other): return self.name <= other + + def __gt__(self, other): return self.name > other + + def __ge__(self, other): return self.name >= other + + def __call__(self, protoVer): + return api.protoModules[protoVer].TimeTicks( + (time.time() - self.birthday) * 100 + ) + + +mibInstr = ( + SysDescr(), Uptime() # sorted by object name +) + +mibInstrIdx = {} +for mibVar in mibInstr: + mibInstrIdx[mibVar.name] = mibVar + + +def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg): + while wholeMsg: + msgVer = api.decodeMessageVersion(wholeMsg) + if msgVer in api.protoModules: + pMod = api.protoModules[msgVer] + else: + print('Unsupported SNMP version %s' % msgVer) + return + reqMsg, wholeMsg = decoder.decode( + wholeMsg, asn1Spec=pMod.Message(), + ) + rspMsg = pMod.apiMessage.getResponse(reqMsg) + rspPDU = pMod.apiMessage.getPDU(rspMsg) + reqPDU = pMod.apiMessage.getPDU(reqMsg) + varBinds = [] + pendingErrors = [] + errorIndex = 0 + # GETNEXT PDU + if reqPDU.isSameTypeWith(pMod.GetNextRequestPDU()): + # Produce response var-binds + for oid, val in pMod.apiPDU.getVarBinds(reqPDU): + errorIndex = errorIndex + 1 + # Search next OID to report + nextIdx = bisect.bisect(mibInstr, oid) + if nextIdx == len(mibInstr): + # Out of MIB + varBinds.append((oid, val)) + pendingErrors.append( + (pMod.apiPDU.setEndOfMibError, errorIndex) + ) + else: + # Report value if OID is found + varBinds.append( + (mibInstr[nextIdx].name, mibInstr[nextIdx](msgVer)) + ) + elif reqPDU.isSameTypeWith(pMod.GetRequestPDU()): + for oid, val in pMod.apiPDU.getVarBinds(reqPDU): + if oid in mibInstrIdx: + varBinds.append((oid, mibInstrIdx[oid](msgVer))) + else: + # No such instance + varBinds.append((oid, val)) + pendingErrors.append( + (pMod.apiPDU.setNoSuchInstanceError, errorIndex) + ) + break + else: + # Report unsupported request type + pMod.apiPDU.setErrorStatus(rspPDU, 'genErr') + pMod.apiPDU.setVarBinds(rspPDU, varBinds) + # Commit possible error indices to response PDU + for f, i in pendingErrors: + f(rspPDU, i) + transportDispatcher.sendMessage( + encoder.encode(rspMsg), transportDomain, transportAddress + ) + return wholeMsg + + +transportDispatcher = AsyncoreDispatcher() +transportDispatcher.registerRecvCbFun(cbFun) + +# UDP/IPv4 +transportDispatcher.registerTransport( + udp.domainName, udp.UdpSocketTransport().openServerMode(('localhost', 161)) +) + +# UDP/IPv6 +transportDispatcher.registerTransport( + udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 161)) +) + +## Local domain socket +# transportDispatcher.registerTransport( +# unix.domainName, unix.UnixSocketTransport().openServerMode('/tmp/snmp-agent') +# ) + +transportDispatcher.jobStarted(1) + +try: + # Dispatcher will never finish as job#1 never reaches zero + transportDispatcher.runDispatcher() +except: + transportDispatcher.closeDispatcher() + raise diff --git a/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects.py b/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects.py deleted file mode 100644 index 328e5d28..00000000 --- a/examples/v1arch/asyncore/agent/cmdrsp/implementing-scalar-mib-objects.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -Implementing scalar MIB objects -+++++++++++++++++++++++++++++++ - -Listen and respond to SNMP GET/GETNEXT queries with the following options: - -* SNMPv1 or SNMPv2c -* with SNMP community "public" -* over IPv4/UDP, listening at 127.0.0.1:161 -* over IPv6/UDP, listening at [::1]:161 -* serving two Managed Objects Instances (sysDescr.0 and sysUptime.0) - -Either of the following Net-SNMP commands will walk this Agent: - -| $ snmpwalk -v2c -c public 127.0.0.1 .1.3.6 -| $ snmpwalk -v2c -c public udp6:[::1] .1.3.6 - -The Command Receiver below uses two distinct transports for communication -with Command Generators - UDP over IPv4 and UDP over IPv6. - -"""# -from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher -from pysnmp.carrier.asyncore.dgram import udp, udp6, unix -from pyasn1.codec.ber import encoder, decoder -from pysnmp.proto import api -import time, bisect - - -class SysDescr(object): - name = (1, 3, 6, 1, 2, 1, 1, 1, 0) - - def __eq__(self, other): return self.name == other - - def __ne__(self, other): return self.name != other - - def __lt__(self, other): return self.name < other - - def __le__(self, other): return self.name <= other - - def __gt__(self, other): return self.name > other - - def __ge__(self, other): return self.name >= other - - def __call__(self, protoVer): - return api.protoModules[protoVer].OctetString( - 'PySNMP example command responder' - ) - - -class Uptime(object): - name = (1, 3, 6, 1, 2, 1, 1, 3, 0) - birthday = time.time() - - def __eq__(self, other): return self.name == other - - def __ne__(self, other): return self.name != other - - def __lt__(self, other): return self.name < other - - def __le__(self, other): return self.name <= other - - def __gt__(self, other): return self.name > other - - def __ge__(self, other): return self.name >= other - - def __call__(self, protoVer): - return api.protoModules[protoVer].TimeTicks( - (time.time() - self.birthday) * 100 - ) - - -mibInstr = ( - SysDescr(), Uptime() # sorted by object name -) - -mibInstrIdx = {} -for mibVar in mibInstr: - mibInstrIdx[mibVar.name] = mibVar - - -def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg): - while wholeMsg: - msgVer = api.decodeMessageVersion(wholeMsg) - if msgVer in api.protoModules: - pMod = api.protoModules[msgVer] - else: - print('Unsupported SNMP version %s' % msgVer) - return - reqMsg, wholeMsg = decoder.decode( - wholeMsg, asn1Spec=pMod.Message(), - ) - rspMsg = pMod.apiMessage.getResponse(reqMsg) - rspPDU = pMod.apiMessage.getPDU(rspMsg) - reqPDU = pMod.apiMessage.getPDU(reqMsg) - varBinds = [] - pendingErrors = [] - errorIndex = 0 - # GETNEXT PDU - if reqPDU.isSameTypeWith(pMod.GetNextRequestPDU()): - # Produce response var-binds - for oid, val in pMod.apiPDU.getVarBinds(reqPDU): - errorIndex = errorIndex + 1 - # Search next OID to report - nextIdx = bisect.bisect(mibInstr, oid) - if nextIdx == len(mibInstr): - # Out of MIB - varBinds.append((oid, val)) - pendingErrors.append( - (pMod.apiPDU.setEndOfMibError, errorIndex) - ) - else: - # Report value if OID is found - varBinds.append( - (mibInstr[nextIdx].name, mibInstr[nextIdx](msgVer)) - ) - elif reqPDU.isSameTypeWith(pMod.GetRequestPDU()): - for oid, val in pMod.apiPDU.getVarBinds(reqPDU): - if oid in mibInstrIdx: - varBinds.append((oid, mibInstrIdx[oid](msgVer))) - else: - # No such instance - varBinds.append((oid, val)) - pendingErrors.append( - (pMod.apiPDU.setNoSuchInstanceError, errorIndex) - ) - break - else: - # Report unsupported request type - pMod.apiPDU.setErrorStatus(rspPDU, 'genErr') - pMod.apiPDU.setVarBinds(rspPDU, varBinds) - # Commit possible error indices to response PDU - for f, i in pendingErrors: - f(rspPDU, i) - transportDispatcher.sendMessage( - encoder.encode(rspMsg), transportDomain, transportAddress - ) - return wholeMsg - - -transportDispatcher = AsyncoreDispatcher() -transportDispatcher.registerRecvCbFun(cbFun) - -# UDP/IPv4 -transportDispatcher.registerTransport( - udp.domainName, udp.UdpSocketTransport().openServerMode(('localhost', 161)) -) - -# UDP/IPv6 -transportDispatcher.registerTransport( - udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 161)) -) - -## Local domain socket -# transportDispatcher.registerTransport( -# unix.domainName, unix.UnixSocketTransport().openServerMode('/tmp/snmp-agent') -# ) - -transportDispatcher.jobStarted(1) - -try: - # Dispatcher will never finish as job#1 never reaches zero - transportDispatcher.runDispatcher() -except: - transportDispatcher.closeDispatcher() - raise diff --git a/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports-incl-ipv4-and-ipv6.py b/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports-incl-ipv4-and-ipv6.py new file mode 100644 index 00000000..994c73dd --- /dev/null +++ b/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports-incl-ipv4-and-ipv6.py @@ -0,0 +1,71 @@ +""" +Using multiple network transports ++++++++++++++++++++++++++++++++++ + +Receive SNMP TRAP/INFORM messages with the following options: + +* SNMPv1/SNMPv2c +* with SNMP community "public" +* over IPv4/UDP, listening at 127.0.0.1:162 + over IPv6/UDP, listening at [::1]:162 +* print received data on stdout + +Either of the following Net-SNMP commands will send notifications to this +receiver: + +| $ snmptrap -v1 -c public 127.0.0.1 1.3.6.1.4.1.20408.4.1.1.2 127.0.0.1 1 1 123 1.3.6.1.2.1.1.1.0 s test +| $ snmptrap -v2c -c public udp6:[::1]:162 123 1.3.6.1.6.3.1.1.5.1 1.3.6.1.2.1.1.5.0 s test +| $ snmpinform -v2c -c public 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1 + +"""# +from pysnmp.entity import engine, config +from pysnmp.carrier.asyncore.dgram import udp, udp6 +from pysnmp.entity.rfc3413 import ntfrcv + +# Create SNMP engine with autogenernated engineID and pre-bound +# to socket transport dispatcher +snmpEngine = engine.SnmpEngine() + +# Transport setup + +# UDP over IPv4 +config.addTransport( + snmpEngine, + udp.domainName, + udp.UdpTransport().openServerMode(('127.0.0.1', 162)) +) + +# UDP over IPv6 +config.addTransport( + snmpEngine, + udp6.domainName, + udp6.Udp6Transport().openServerMode(('::1', 162)) +) + +# SNMPv1/2c setup + +# SecurityName <-> CommunityName mapping +config.addV1System(snmpEngine, 'my-area', 'public') + + +# Callback function for receiving notifications +# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal +def cbFun(snmpEngine, stateReference, contextEngineId, contextName, + varBinds, cbCtx): + print('Notification from ContextEngineId "%s", ContextName "%s"' % (contextEngineId.prettyPrint(), + contextName.prettyPrint())) + for name, val in varBinds: + print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) + + +# Register SNMP Application at the SNMP engine +ntfrcv.NotificationReceiver(snmpEngine, cbFun) + +snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish + +# Run I/O dispatcher which would receive queries and send confirmations +try: + snmpEngine.transportDispatcher.runDispatcher() +except: + snmpEngine.transportDispatcher.closeDispatcher() + raise diff --git a/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports.py b/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports.py deleted file mode 100644 index 994c73dd..00000000 --- a/examples/v3arch/asyncore/manager/ntfrcv/multiple-network-transports.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Using multiple network transports -+++++++++++++++++++++++++++++++++ - -Receive SNMP TRAP/INFORM messages with the following options: - -* SNMPv1/SNMPv2c -* with SNMP community "public" -* over IPv4/UDP, listening at 127.0.0.1:162 - over IPv6/UDP, listening at [::1]:162 -* print received data on stdout - -Either of the following Net-SNMP commands will send notifications to this -receiver: - -| $ snmptrap -v1 -c public 127.0.0.1 1.3.6.1.4.1.20408.4.1.1.2 127.0.0.1 1 1 123 1.3.6.1.2.1.1.1.0 s test -| $ snmptrap -v2c -c public udp6:[::1]:162 123 1.3.6.1.6.3.1.1.5.1 1.3.6.1.2.1.1.5.0 s test -| $ snmpinform -v2c -c public 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1 - -"""# -from pysnmp.entity import engine, config -from pysnmp.carrier.asyncore.dgram import udp, udp6 -from pysnmp.entity.rfc3413 import ntfrcv - -# Create SNMP engine with autogenernated engineID and pre-bound -# to socket transport dispatcher -snmpEngine = engine.SnmpEngine() - -# Transport setup - -# UDP over IPv4 -config.addTransport( - snmpEngine, - udp.domainName, - udp.UdpTransport().openServerMode(('127.0.0.1', 162)) -) - -# UDP over IPv6 -config.addTransport( - snmpEngine, - udp6.domainName, - udp6.Udp6Transport().openServerMode(('::1', 162)) -) - -# SNMPv1/2c setup - -# SecurityName <-> CommunityName mapping -config.addV1System(snmpEngine, 'my-area', 'public') - - -# Callback function for receiving notifications -# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal -def cbFun(snmpEngine, stateReference, contextEngineId, contextName, - varBinds, cbCtx): - print('Notification from ContextEngineId "%s", ContextName "%s"' % (contextEngineId.prettyPrint(), - contextName.prettyPrint())) - for name, val in varBinds: - print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) - - -# Register SNMP Application at the SNMP engine -ntfrcv.NotificationReceiver(snmpEngine, cbFun) - -snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish - -# Run I/O dispatcher which would receive queries and send confirmations -try: - snmpEngine.transportDispatcher.runDispatcher() -except: - snmpEngine.transportDispatcher.closeDispatcher() - raise diff --git a/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing-over-ipv4-and-ipv6.py b/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing-over-ipv4-and-ipv6.py new file mode 100644 index 00000000..9f3a2c40 --- /dev/null +++ b/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing-over-ipv4-and-ipv6.py @@ -0,0 +1,97 @@ +""" +Observe SNMP engine internal operations ++++++++++++++++++++++++++++++++++++++++ + +Receive SNMP TRAP/INFORM messages with the following options: + +* SNMPv1/SNMPv2c +* with SNMP community "public" +* over IPv4/UDP, listening at 127.0.0.1:162 + over IPv6/UDP, listening at [::1]:162 +* registers its own execution observer to snmpEngine +* print received data on stdout + +Either of the following Net-SNMP commands will send notifications to this +receiver: + +| $ snmptrap -v1 -c public 127.0.0.1 1.3.6.1.4.1.20408.4.1.1.2 127.0.0.1 1 1 123 1.3.6.1.2.1.1.1.0 s test +| $ snmptrap -v2c -c public udp6:[::1]:162 123 1.3.6.1.6.3.1.1.5.1 1.3.6.1.2.1.1.5.0 s test +| $ snmpinform -v2c -c public 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1 + +"""# +from pysnmp.entity import engine, config +from pysnmp.carrier.asyncore.dgram import udp, udp6 +from pysnmp.entity.rfc3413 import ntfrcv + +# Create SNMP engine with autogenernated engineID and pre-bound +# to socket transport dispatcher +snmpEngine = engine.SnmpEngine() + + +# Execution point observer setup + +# Register a callback to be invoked at specified execution point of +# SNMP Engine and passed local variables at code point's local scope +# noinspection PyUnusedLocal,PyUnusedLocal +def requestObserver(snmpEngine, execpoint, variables, cbCtx): + print('Execution point: %s' % execpoint) + print('* transportDomain: %s' % '.'.join([str(x) for x in variables['transportDomain']])) + print('* transportAddress: %s' % '@'.join([str(x) for x in variables['transportAddress']])) + print('* securityModel: %s' % variables['securityModel']) + print('* securityName: %s' % variables['securityName']) + print('* securityLevel: %s' % variables['securityLevel']) + print('* contextEngineId: %s' % variables['contextEngineId'].prettyPrint()) + print('* contextName: %s' % variables['contextName'].prettyPrint()) + print('* PDU: %s' % variables['pdu'].prettyPrint()) + + +snmpEngine.observer.registerObserver( + requestObserver, + 'rfc3412.receiveMessage:request', + 'rfc3412.returnResponsePdu' +) + +# Transport setup + +# UDP over IPv4 +config.addTransport( + snmpEngine, + udp.domainName, + udp.UdpTransport().openServerMode(('127.0.0.1', 162)) +) + +# UDP over IPv6 +config.addTransport( + snmpEngine, + udp6.domainName, + udp6.Udp6Transport().openServerMode(('::1', 162)) +) + +# SNMPv1/2c setup + +# SecurityName <-> CommunityName mapping +config.addV1System(snmpEngine, 'my-area', 'public') + + +# Callback function for receiving notifications +# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal +def cbFun(snmpEngine, stateReference, contextEngineId, contextName, + varBinds, cbCtx): + print('Notification from ContextEngineId "%s", ContextName "%s"' % (contextEngineId.prettyPrint(), + contextName.prettyPrint())) + for name, val in varBinds: + print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) + + +# Register SNMP Application at the SNMP engine +ntfrcv.NotificationReceiver(snmpEngine, cbFun) + +snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish + +# Run I/O dispatcher which would receive queries and send confirmations +try: + snmpEngine.transportDispatcher.runDispatcher() +except: + snmpEngine.observer.unregisterObserver() + snmpEngine.transportDispatcher.closeDispatcher() + raise diff --git a/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing.py b/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing.py deleted file mode 100644 index 9f3a2c40..00000000 --- a/examples/v3arch/asyncore/manager/ntfrcv/observe-request-processing.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Observe SNMP engine internal operations -+++++++++++++++++++++++++++++++++++++++ - -Receive SNMP TRAP/INFORM messages with the following options: - -* SNMPv1/SNMPv2c -* with SNMP community "public" -* over IPv4/UDP, listening at 127.0.0.1:162 - over IPv6/UDP, listening at [::1]:162 -* registers its own execution observer to snmpEngine -* print received data on stdout - -Either of the following Net-SNMP commands will send notifications to this -receiver: - -| $ snmptrap -v1 -c public 127.0.0.1 1.3.6.1.4.1.20408.4.1.1.2 127.0.0.1 1 1 123 1.3.6.1.2.1.1.1.0 s test -| $ snmptrap -v2c -c public udp6:[::1]:162 123 1.3.6.1.6.3.1.1.5.1 1.3.6.1.2.1.1.5.0 s test -| $ snmpinform -v2c -c public 127.0.0.1 123 1.3.6.1.6.3.1.1.5.1 - -"""# -from pysnmp.entity import engine, config -from pysnmp.carrier.asyncore.dgram import udp, udp6 -from pysnmp.entity.rfc3413 import ntfrcv - -# Create SNMP engine with autogenernated engineID and pre-bound -# to socket transport dispatcher -snmpEngine = engine.SnmpEngine() - - -# Execution point observer setup - -# Register a callback to be invoked at specified execution point of -# SNMP Engine and passed local variables at code point's local scope -# noinspection PyUnusedLocal,PyUnusedLocal -def requestObserver(snmpEngine, execpoint, variables, cbCtx): - print('Execution point: %s' % execpoint) - print('* transportDomain: %s' % '.'.join([str(x) for x in variables['transportDomain']])) - print('* transportAddress: %s' % '@'.join([str(x) for x in variables['transportAddress']])) - print('* securityModel: %s' % variables['securityModel']) - print('* securityName: %s' % variables['securityName']) - print('* securityLevel: %s' % variables['securityLevel']) - print('* contextEngineId: %s' % variables['contextEngineId'].prettyPrint()) - print('* contextName: %s' % variables['contextName'].prettyPrint()) - print('* PDU: %s' % variables['pdu'].prettyPrint()) - - -snmpEngine.observer.registerObserver( - requestObserver, - 'rfc3412.receiveMessage:request', - 'rfc3412.returnResponsePdu' -) - -# Transport setup - -# UDP over IPv4 -config.addTransport( - snmpEngine, - udp.domainName, - udp.UdpTransport().openServerMode(('127.0.0.1', 162)) -) - -# UDP over IPv6 -config.addTransport( - snmpEngine, - udp6.domainName, - udp6.Udp6Transport().openServerMode(('::1', 162)) -) - -# SNMPv1/2c setup - -# SecurityName <-> CommunityName mapping -config.addV1System(snmpEngine, 'my-area', 'public') - - -# Callback function for receiving notifications -# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal -def cbFun(snmpEngine, stateReference, contextEngineId, contextName, - varBinds, cbCtx): - print('Notification from ContextEngineId "%s", ContextName "%s"' % (contextEngineId.prettyPrint(), - contextName.prettyPrint())) - for name, val in varBinds: - print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) - - -# Register SNMP Application at the SNMP engine -ntfrcv.NotificationReceiver(snmpEngine, cbFun) - -snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish - -# Run I/O dispatcher which would receive queries and send confirmations -try: - snmpEngine.transportDispatcher.runDispatcher() -except: - snmpEngine.observer.unregisterObserver() - snmpEngine.transportDispatcher.closeDispatcher() - raise diff --git a/examples/v3arch/asyncore/proxy/command/ipv6-to-ipv4-conversion.py b/examples/v3arch/asyncore/proxy/command/ipv6-to-ipv4-conversion.py new file mode 100644 index 00000000..9e34fd0d --- /dev/null +++ b/examples/v3arch/asyncore/proxy/command/ipv6-to-ipv4-conversion.py @@ -0,0 +1,144 @@ +""" +IPv6-to-IPv4 conversion ++++++++++++++++++++++++ + +Act as a local SNMPv1/v2c Agent listening on a UDP/IPv6 transport, relay +messages to distant SNMPv1/2c Agent over UDP/IPv4 transport: + +* with local SNMPv2c community 'public' +* local Agent listening at [::1]:161 +* remote SNMPv2c community 'public' +* remote Agent listening at 104.236.166.95:161 + +This script can be queried with the following Net-SNMP command: + +| $ snmpget -v2c -c public udp6:[::1]:161 sysDescr.0 + +due to proxy, it is equivalent to + +| $ snmpget -v2c -c public 104.236.166.95:161 sysDescr.0 + +Warning: for production operation you would need to modify this script +so that it will re-map possible duplicate request-ID values, coming in +initial request PDUs from different Managers, into unique values to +avoid sending duplicate request-IDs to Agents. + +"""# +from pysnmp.carrier.asyncore.dgram import udp, udp6 +from pysnmp.entity import engine, config +from pysnmp.entity.rfc3413 import cmdrsp, cmdgen, context +from pysnmp.proto.api import v2c +from pysnmp import error + +# Create SNMP engine with autogenernated engineID and pre-bound +# to socket transport dispatcher +snmpEngine = engine.SnmpEngine() + +# +# Transport setup +# + +# Agent section + +# UDP over IPv6 +config.addTransport( + snmpEngine, + udp6.domainName, + udp6.Udp6Transport().openServerMode(('::1', 161)) +) + +# Manager section + +# UDP over IPv4 +config.addTransport( + snmpEngine, + udp.domainName, + udp.UdpTransport().openClientMode() +) + +# +# SNMPv1/2c setup (Agent role) +# + +# SecurityName <-> CommunityName mapping +config.addV1System(snmpEngine, '1-my-area', 'public') + +# +# SNMPv1/v2c setup (Manager role) +# +# Here we configure securityName lexicographically lesser than '1-my-area' +# to let it match first in snmpCommunityTable on response processing. +# + +config.addV1System(snmpEngine, '0-distant-area', 'public', transportTag='remote') + +# +# Transport target used by Manager +# + +config.addTargetParams( + snmpEngine, 'distant-agent-auth', '0-distant-area', 'noAuthNoPriv', 1 +) +config.addTargetAddr( + snmpEngine, 'distant-agent', + udp.domainName, ('104.236.166.95', 161), + 'distant-agent-auth', retryCount=0, tagList='remote' +) + +# Default SNMP context +config.addContext(snmpEngine, '') + + +class CommandResponder(cmdrsp.CommandResponderBase): + cmdGenMap = { + v2c.GetRequestPDU.tagSet: cmdgen.GetCommandGenerator(), + v2c.SetRequestPDU.tagSet: cmdgen.SetCommandGenerator(), + v2c.GetNextRequestPDU.tagSet: cmdgen.NextCommandGeneratorSingleRun(), + v2c.GetBulkRequestPDU.tagSet: cmdgen.BulkCommandGeneratorSingleRun() + } + pduTypes = cmdGenMap.keys() # This app will handle these PDUs + + # SNMP request relay + def handleMgmtOperation(self, snmpEngine, stateReference, contextName, + PDU, acInfo): + cbCtx = stateReference, PDU + contextEngineId = None # address authoritative SNMP Engine + try: + self.cmdGenMap[PDU.tagSet].sendPdu( + snmpEngine, 'distant-agent', + contextEngineId, contextName, + PDU, + self.handleResponsePdu, cbCtx + ) + except error.PySnmpError: + self.handleResponsePdu( + snmpEngine, stateReference, 'error', None, cbCtx + ) + + # SNMP response relay + # noinspection PyUnusedLocal + def handleResponsePdu(self, snmpEngine, sendRequestHandle, + errorIndication, PDU, cbCtx): + stateReference, reqPDU = cbCtx + + if errorIndication: + PDU = v2c.apiPDU.getResponse(reqPDU) + PDU.setErrorStatus(PDU, 5) + + self.sendPdu( + snmpEngine, stateReference, PDU + ) + + self.releaseStateInformation(stateReference) + + +CommandResponder(snmpEngine, context.SnmpContext(snmpEngine)) + +snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish + +# Run I/O dispatcher which would receive queries and send responses +try: + snmpEngine.transportDispatcher.runDispatcher() +except: + snmpEngine.transportDispatcher.closeDispatcher() + raise diff --git a/examples/v3arch/asyncore/proxy/command/udp6-to-udp4-conversion.py b/examples/v3arch/asyncore/proxy/command/udp6-to-udp4-conversion.py deleted file mode 100644 index 9e34fd0d..00000000 --- a/examples/v3arch/asyncore/proxy/command/udp6-to-udp4-conversion.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -IPv6-to-IPv4 conversion -+++++++++++++++++++++++ - -Act as a local SNMPv1/v2c Agent listening on a UDP/IPv6 transport, relay -messages to distant SNMPv1/2c Agent over UDP/IPv4 transport: - -* with local SNMPv2c community 'public' -* local Agent listening at [::1]:161 -* remote SNMPv2c community 'public' -* remote Agent listening at 104.236.166.95:161 - -This script can be queried with the following Net-SNMP command: - -| $ snmpget -v2c -c public udp6:[::1]:161 sysDescr.0 - -due to proxy, it is equivalent to - -| $ snmpget -v2c -c public 104.236.166.95:161 sysDescr.0 - -Warning: for production operation you would need to modify this script -so that it will re-map possible duplicate request-ID values, coming in -initial request PDUs from different Managers, into unique values to -avoid sending duplicate request-IDs to Agents. - -"""# -from pysnmp.carrier.asyncore.dgram import udp, udp6 -from pysnmp.entity import engine, config -from pysnmp.entity.rfc3413 import cmdrsp, cmdgen, context -from pysnmp.proto.api import v2c -from pysnmp import error - -# Create SNMP engine with autogenernated engineID and pre-bound -# to socket transport dispatcher -snmpEngine = engine.SnmpEngine() - -# -# Transport setup -# - -# Agent section - -# UDP over IPv6 -config.addTransport( - snmpEngine, - udp6.domainName, - udp6.Udp6Transport().openServerMode(('::1', 161)) -) - -# Manager section - -# UDP over IPv4 -config.addTransport( - snmpEngine, - udp.domainName, - udp.UdpTransport().openClientMode() -) - -# -# SNMPv1/2c setup (Agent role) -# - -# SecurityName <-> CommunityName mapping -config.addV1System(snmpEngine, '1-my-area', 'public') - -# -# SNMPv1/v2c setup (Manager role) -# -# Here we configure securityName lexicographically lesser than '1-my-area' -# to let it match first in snmpCommunityTable on response processing. -# - -config.addV1System(snmpEngine, '0-distant-area', 'public', transportTag='remote') - -# -# Transport target used by Manager -# - -config.addTargetParams( - snmpEngine, 'distant-agent-auth', '0-distant-area', 'noAuthNoPriv', 1 -) -config.addTargetAddr( - snmpEngine, 'distant-agent', - udp.domainName, ('104.236.166.95', 161), - 'distant-agent-auth', retryCount=0, tagList='remote' -) - -# Default SNMP context -config.addContext(snmpEngine, '') - - -class CommandResponder(cmdrsp.CommandResponderBase): - cmdGenMap = { - v2c.GetRequestPDU.tagSet: cmdgen.GetCommandGenerator(), - v2c.SetRequestPDU.tagSet: cmdgen.SetCommandGenerator(), - v2c.GetNextRequestPDU.tagSet: cmdgen.NextCommandGeneratorSingleRun(), - v2c.GetBulkRequestPDU.tagSet: cmdgen.BulkCommandGeneratorSingleRun() - } - pduTypes = cmdGenMap.keys() # This app will handle these PDUs - - # SNMP request relay - def handleMgmtOperation(self, snmpEngine, stateReference, contextName, - PDU, acInfo): - cbCtx = stateReference, PDU - contextEngineId = None # address authoritative SNMP Engine - try: - self.cmdGenMap[PDU.tagSet].sendPdu( - snmpEngine, 'distant-agent', - contextEngineId, contextName, - PDU, - self.handleResponsePdu, cbCtx - ) - except error.PySnmpError: - self.handleResponsePdu( - snmpEngine, stateReference, 'error', None, cbCtx - ) - - # SNMP response relay - # noinspection PyUnusedLocal - def handleResponsePdu(self, snmpEngine, sendRequestHandle, - errorIndication, PDU, cbCtx): - stateReference, reqPDU = cbCtx - - if errorIndication: - PDU = v2c.apiPDU.getResponse(reqPDU) - PDU.setErrorStatus(PDU, 5) - - self.sendPdu( - snmpEngine, stateReference, PDU - ) - - self.releaseStateInformation(stateReference) - - -CommandResponder(snmpEngine, context.SnmpContext(snmpEngine)) - -snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish - -# Run I/O dispatcher which would receive queries and send responses -try: - snmpEngine.transportDispatcher.runDispatcher() -except: - snmpEngine.transportDispatcher.closeDispatcher() - raise -- cgit v1.2.1