2013-09-28 4 views
1

Я хотел бы сделать snmpget в python без блокировки. Я не хочу использовать потоки, мне очень нравится библиотека gevent, но я не использовал ее раньше, поэтому не знаю, с чего начать. Я посмотрел на их примеры и понял, как я могу использовать патчи для обезьян. Если у меня есть патч-палочки для обезьяны и вы используете такой модуль, как pysnmp, было бы достаточно выполнить неблокирующие запросы?gevent и snmp в python

Кроме того, поскольку я буду в ящике linux, у меня есть доступ к утилите командной строки snmpget, поэтому я могу вызвать их с помощью gevent.subprocess, который доступен в версии 1.0, который также может блокировать эти запросы.

Я бы предпочел использовать модуль python для работы с snmp get, чем с помощью утилиты командной строки, однако, если второй вариант легче получить, то я не буду возражать против такого подхода.

Любые намеки/направления были бы высоко оценены. Благодаря!

UPDATE:

Я взял модуль pysnmp_eventlet и попытался принять Twisted пример с eventlet. Я не уверен, почему моя функция обратного вызова не вызвана. Я вижу, что запрос SNMP и ответ возвращаются в tcpdump. Однако моя функция обратного вызова (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 
) 

ответ

1

В коде выше вы по-прежнему необходимо запустить диспетчер для eventlet для обработки входящих пакетов:

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

Обычно вы запускаете это в зеленой планете и забываете об этом (или, вероятно, реализуете некоторое упорядоченное закрытие для него).

(я буду добавлять собственные примеры к pysnmp_eventlet когда-нибудь в будущем.)

+0

Добавление некоторых примеров было бы потрясающе - я также могу помочь вам, как только я получу основы, работающие в моем проекте. – opensourcegeek

+0

Теперь ваш патч был объединен в pysnmp trunk? Там нет документации с объединенной версией где-нибудь, что я мог найти с помощью Google. –

+0

Я боюсь, что это, похоже, как-то упало с списка дел. Это не должно быть слишком сложно, просто нужно потратить время на это. – flub

1

Там есть патч pysnmp, что делает его работы с eventlet:

https://bitbucket.org/flub/pysnmp_eventlet

+0

Можете ли вы кратко содержание этой связи, в случае, если она будет идти 404 в будущем? –

+0

Готово ли оно для производства? – opensourcegeek

+0

Да, мы используем его в производстве на python 2.7. Для других версий python вы можете подождать до тех пор, пока они не будут объединены в pysnmp. – flub

Смежные вопросы