簡體   English   中英

python中的gevent和snmp

[英]gevent and snmp in python

我想在python中做一個snmpget而不阻塞。 我不想使用線程,我真的很喜歡gevent庫,但是我以前沒有使用過它,所以不確定從哪里開始。 我查看了他們的示例,並了解了如何使用猴子補丁插槽。 如果我猴子修補套接字並使用pysnmp這樣的模塊,執行非阻塞查詢就足夠了嗎?

另外,由於我將在Linux機器上,所以我可以訪問snmpget命令行實用程序,因此我可以使用gevent.subprocess來調用它們,該版本在1.0版中可用,這也可以使這些查詢成為非阻塞形式。

與使用命令行實用程序相比,我更喜歡使用python模塊進行snmp獲取,但是,如果第二個選項更易於使用,則我不介意采用這種方法。

任何提示/方向將不勝感激。 謝謝!

更新:

我采用了pysnmp_eventlet模塊,並嘗試采用帶eventlet的Twisted示例。 我不確定為什么我的回調函數沒有被調用。 我可以在tcpdump中看到SNMP請求和響應。 但是我的回調函數(cbFun)沒有被調用。 我想念什么嗎?

from pysnmp_eventlet.carrier.eventlet.dispatch import EventletDispatcher
from pysnmp_eventlet.carrier.eventlet.dgram import udp

from pysnmp.entity.rfc3413 import cmdgen
from pysnmp.entity import engine, config


# Create SNMP engine instance

snmpEngine = engine.SnmpEngine()
dispatcher = EventletDispatcher()
snmpEngine.registerTransportDispatcher(dispatcher)



# SecurityName <-> CommunityName mapping
config.addV1System(snmpEngine, 'my-area', 'public')

# Specify security settings per SecurityName (SNMPv1 - 0, SNMPv2c - 1)
config.addTargetParams(snmpEngine, 'my-creds', 'my-area', 'noAuthNoPriv', 1)


# UDP/IPv4
config.addSocketTransport(
    snmpEngine,
    udp.domainName,
    udp.UdpEventletTransport().openClientMode()
)
config.addTargetAddr(
    snmpEngine,
    'my-router',
    udp.domainName,
    ('127.0.0.1', 161),
    'my-creds',
    timeout=300,  # in 1/100 sec
    retryCount=1
)

def cbFun(cbCtx):
    (errorIndication, errorStatus, errorIndex, varBinds) = cbCtx

    if errorIndication:
        print(errorIndication)
    elif errorStatus:
        print('%s at %s' % (
                errorStatus.prettyPrint(),
                errorIndex and varBinds[int(errorIndex)-1][0] or '?'
            )
        )
    else:
        for oid, val in varBinds:
            print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))




cmdGen = cmdgen.GetCommandGenerator()
cmdGen.sendReq(
    snmpEngine,
    'my-router',
    ( ('1.3.6.1.2.1.1.1.0', None), ),
    cbFun
)

pysnmp的一個補丁可以使它與eventlet一起運行:

https://bitbucket.org/flub/pysnmp_eventlet

在上面的代碼中,您仍然需要運行eventlet的調度程序來處理傳入的數據包:

while True:
    eventlet.sleep(dispatcher.getTimerResolution())
    try:
        dispatcher.handleTimerTick(time.time())
    except Exception:
        print 'Error while handling dispatcher tick!'
        raise

通常,您會在一個greenlet中生成它,然后將其忽略(或者可能對其執行一些有序的關閉)。

(我將來會在pysnmp_eventlet中添加適當的示例。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM