pysnmp nextcmd останавливается по тайм-ауту

Я пытаюсь выполнить обход по протоколу snmp на определенных сетевых устройствах.
На некоторых сетевых устройствах мне удается просмотреть все идентификаторы устройств, а на некоторых сетевых устройствах мне не удается просмотреть все идентификаторы устройств.
Вот мой код:

cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.asyncNextCmd(
    cmdgen.CommunityData('public', mpModel=0),
    cmdgen.UdpTransportTarget(('ip', 161),timeout=timeout,retries=retries),
    ((1,3),),
    (cbFun_Walk, None))
cmdGen.snmpEngine.transportDispatcher.runDispatcher() 

Проблема в том, что иногда asyncCommandGenerator получает тайм-аут на certaion oid и существует вне потока.

введите здесь описание изображения

Как вы можете видеть, поток достигает некоторого oid, получает ошибку тайм-аута и затем завершает поток.
Поэтому я хотел бы знать, как продолжить snmpwalk, даже если был достигнут тайм-аут oid.
В основном, если asyncCommandGenerator достигает oid с истекшим временем ожидания, он должен просто продолжить обход и получить остальные oids.
Как я могу этого добиться?


person yuval    schedule 11.05.2015    source источник


Ответы (1)


Логически говоря, вы не можете пропустить «следующий» OID по тайм-ауту запроса, так как тогда вы не будете знать, какой будет следующий OID. Здесь я вижу два обходных пути:

  1. Повторяйте запрос GETNEXT для того же OID столько времени, сколько требуется для получения ответа. Путем увеличения времени ожидания запроса и количества повторных попыток. Надлежащий ответчик SNMP должен в конечном итоге отвечать на все действительные запросы.
  2. Попробуйте угадать, что является «следующим» OID после того, для которого вы не можете получить ответ. Обычно это зависит от MIB и во многих случаях может потребовать нетривиальной нечеткости. Как только вы каким-то образом выбрали следующий OID, просто перезапустите исходный код с предполагаемым OID. Это эффективно «пропустит» проблемный OID (или сразу несколько, если ваша догадка неверна). В случае другого тайм-аута вы можете подумать об изменении логики выбора следующего OID - скорее всего, вы все еще нажимаете тот же тайм-аут OID.
person Ilya Etingof    schedule 11.05.2015
comment
Я понимаю, что вы говорите, и я могу легко реализовать это, но я все еще думаю, что должен быть более простой способ сделать snmpwalk в pysnmp. - person yuval; 11.05.2015
comment
Нет ли способа получить следующий OID, не угадывая? - person yuval; 12.05.2015
comment
Следующий OID зависит от MIB. Если это статически определенный скаляр, поиск в MIB по предыдущему OID покажет следующий OID. Однако, если это запись таблицы SNMP, все становится более динамичным и не всегда угадываемым. - person Ilya Etingof; 13.05.2015