Я хотел бы сделать 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
)
Добавление некоторых примеров было бы потрясающе - я также могу помочь вам, как только я получу основы, работающие в моем проекте. – opensourcegeek
Теперь ваш патч был объединен в pysnmp trunk? Там нет документации с объединенной версией где-нибудь, что я мог найти с помощью Google. –
Я боюсь, что это, похоже, как-то упало с списка дел. Это не должно быть слишком сложно, просто нужно потратить время на это. – flub