コードで SNMP アラートを受信できるようにしたいと考えています。pysnmp
Pythonのモジュールを使用しています。トラップ リスナー用の新しいプロセスを作成しています。multiprocessing
モジュールを使用しています。トラップ リスナーは snmp アラート メッセージを受信し、それをメイン プロセスに送信します。しかし、そのメッセージ データを親プロセスに渡すにはどうすればよいでしょうか。キューを作成したかったのです。しかし、関数によって snmp データが受信されているcbFun()
ため、 に渡す方法がわかりませんtrapReceiver()
。単純な return 関数は機能しません。
キューをグローバル変数にできると思いました。それは良い考えですか?
cbFun
私の他の選択肢は、メインプロセスでファイルに書き込み、そこから読み取ることです。
これにアプローチする最良の方法は何ですか?
以下のコードを実行すると、子プロセスは受信した snmp メッセージを出力しますが、親プロセスからは出力できません。私は何を間違っていますか?
from pysnmp.entity import engine, config
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pysnmp.entity.rfc3413 import ntfrcv
from multiprocessing import Process
import Queue
q = Queue.Queue()
def trapListener():
# Create SNMP engine with autogenernated engineID and pre-bound
# to socket transport dispatcher
snmpEngine = engine.SnmpEngine()
# Transport setup
# UDP over IPv4
config.addSocketTransport(
snmpEngine,
udp.domainName,
udp.UdpTransport().openServerMode(('10.94.175.171', 162))
)
# SNMPv1/2c setup
# SecurityName <-> CommunityName mapping
config.addV1System(snmpEngine,'my-area', 'public')
# 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
# Callback function for receiving notifications
def cbFun(snmpEngine,stateReference,
contextEngineId, contextName,
varBinds,
cbCtx):
(transportDomain, transportAddress ) = snmpEngine.msgAndPduDsp.getTransportInfo(stateReference)
f=open('eventDescriptions.txt','r')
print('Notification from %s, ContextEngineId "%s", ContextName "%s"' % (
transportAddress, contextEngineId.prettyPrint(),
contextName.prettyPrint()))
for name, val in varBinds:
if name.prettyPrint()=="1.3.6.1.4.1.674.10892.5.3.1.2.0":
print('child: %s' % (val.prettyPrint()))
q.put(val.prettyPrint())
if __name__=="__main__":
p=Process(target=trapListener, args=(child_conn,))
p.start()
print "parent: ", q.get()
p.join()