1

コードで SNMP アラートを受信できるようにしたいと考えています。pysnmpPythonのモジュールを使用しています。トラップ リスナー用の新しいプロセスを作成しています。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()
4

2 に答える 2

0

よくわかりませんが、サブプロセスモジュールを使用する方が簡単かもしれません。subprocess.Popen を使用して新しいプロセスを作成し、そのプロセスにデータを送信するために communicate メソッドを使用できます。

于 2014-02-27T11:44:03.770 に答える