diff options
Diffstat (limited to 'examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py')
-rw-r--r-- | examples/hlapi/asyncore/sync/manager/cmdgen/query-agents-from-multuple-threads.py | 77 |
1 files changed, 37 insertions, 40 deletions
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 index 34ead8b5..d289982e 100644 --- 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 @@ -17,46 +17,48 @@ Send a bunch of SNMP GET requests simultaneously using the following options: """# 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 -from threading import Thread -from pysnmp.hlapi 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)))), + (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)))), + (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)))), + (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) ))), + (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)))), + (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) @@ -65,21 +67,18 @@ class Worker(Thread): 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 - ) - ) + next(getCmd(self.snmpEngine, + authData, transportTarget, ContextData(), *varBinds)) ) if hasattr(self.requests, 'task_done'): # 2.5+ self.requests.task_done() + class ThreadPool: def __init__(self, num_threads): self.requests = Queue(num_threads) @@ -90,7 +89,8 @@ class ThreadPool: def addRequest(self, authData, transportTarget, varBinds): self.requests.put((authData, transportTarget, varBinds)) - def getResponses(self): return self.responses + def getResponses(self): + return self.responses def waitCompletion(self): if hasattr(self.requests, 'join'): @@ -99,29 +99,26 @@ class ThreadPool: 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) + 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(): - print('Response for %s from %s:' % (authData, transportTarget)) if errorIndication: print(errorIndication) elif errorStatus: - print('%s at %s' % ( - errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex)-1][0] or '?' - ) - ) + 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 ])) + print(' = '.join([x.prettyPrint() for x in varBind])) |