Я пытаюсь создать объект прослушивателя ловушек, который будет запущен и запущен в параллельном процессе с тем, от которого я работаю.
Часть прослушивателя ловушек в приведенном ниже коде хорошо отлажена, и этовыполняет свою работу, когда я создаю процесс вне класса.Проблема в том, что я хотел бы иметь возможность «скрыть» весь код, относящийся к слушателю и определениям процесса.
Таким образом, я смогу создать прослушиватель ловушек внутри одного из моих тестовых сценариев, не добавляя слишком много служебной информации.
Класс прослушивателя ловушек:
try:
from pysnmp.entity import engine, config
from pysnmp.carrier.asyncore.dgram import udp, udp6
from pysnmp.entity.rfc3413 import ntfrcv
from pysnmp.proto.api import v2c
from pysnmp.smi import builder, view, compiler, rfc1902, error
from pysnmp import debug
except ImportError:
print("IMPORT ERROR")
from multiprocessing import Process, Queue
class Trap_Listener():
def __init__(self):
self.PORT = 162
self.ip_type = '4'
self.trap_count = 0
self.snmpEngine = engine.SnmpEngine()
self.COMMUNITYSTRING = 'automation'
config.addV1System(self.snmpEngine, self.COMMUNITYSTRING, self.COMMUNITYSTRING)
self.queue = Queue()
self.Parallel_Process = Process(target=self.run)
def run(self):
ntfrcv.NotificationReceiver(self.snmpEngine, self.cbFun)
self.add_transport(self.snmpEngine, self.PORT, self.ip_type)
self.snmpEngine.transportDispatcher.jobStarted(1)
try:
print("Trap Listener started .....")
print("To Stop Press Ctrl+c")
print("\n")
self.snmpEngine.transportDispatcher.runDispatcher()
except KeyboardInterrupt:
print('Trap Listener was stopped manually')
self.snmpEngine.transportDispatcher.closeDispatcher()
except:
self.snmpEngine.transportDispatcher.closeDispatcher()
raise
self.Parallel_Process.daemon = True
self.Parallel_Process.start()
def stop(self):
print('Trap Listener was stopped manually')
self.snmpEngine.transportDispatcher.closeDispatcher()
self.Parallel_Process.join()
def get_all_traps(self):
traps_list = []
while not self.queue.empty():
traps_list.append(self.queue.get())
return traps_list
def add_transport(self, snmpEngine, PORT, ip_type):
from sys import exit
try:
if ip_type == '6':
config.addTransport(snmpEngine, udp.domainName,
udp6.Udp6SocketTransport().openServerMode(('::', int(PORT)))
)
else:
config.addTransport(
snmpEngine,
udp.domainName,
udp.UdpTransport().openServerMode(('', int(PORT)))
)
except:
print('UDP Port 162 is blocked')
exit()
def cbFun(self, varBinds):
self.trap_count += 1
self.queue.put(varBinds)
Сейчас, Когда я пытаюсь использовать этот слушатель параллельно выполняемому сценарию, кажется, что он блокирует основной сценарий.Это означает, что все шаги, которые у меня есть внутри скрипта, которые должны вызывать генерирование ловушек, не выполняются, и система ожидает ловушек
Сценарий, который я использую, выглядит следующим образом:
listener = Trap_Listener()
listener.run()
'''
# Doing Some actions that cause traps to
# be generated
'''
traps_list = listener.get_all_traps()
for trap in traps_list:
for oid, value in trap:
print(oid, value)
listener.stop()
Что я делаю не так?Почему слушатель не работает в параллельном процессе?