2016-05-02 5 views
0

Вот моя реализация snmpbulkwalk (взял из примеров):таймаут при snmpbulkwalking с pysnmp

def bulk_walk(self, oid, context, conv): 
walkdone = False 
data = list() 

if context: 
    community = "%[email protected]%s" % (self.community, context) 
else: 
    community = self.community 

for errorIndication, \ 
    errorStatus, errorIndex, \ 
    varBinds in bulkCmd(SnmpEngine(), 
         CommunityData(community), 
         UdpTransportTarget((self.ip, self.port)), 
         ContextData(), 0, 10, 
         ObjectType(ObjectIdentity(oid)), lookupMib=False): 

    if errorIndication: 
     raise(SNMPError(errorIndication)) 
    elif errorStatus: 
     raise(SNMPError('%s at %s' % (
       errorStatus.prettyPrint(), 
       errorIndex and varBinds[int(errorIndex)-1][0] or '?' 
      )) 
     ) 
    else: 
     for varBind in varBinds: 
      print(varBind[0].prettyPrint(), conv(varBind[1])) 
      if not varBind[0].prettyPrint().startswith(oid+"."): 
       walkdone = True 
       break 
      data.append((varBind[0].prettyPrint(), conv(varBind[1]))) 
    if walkdone: 
     break 
return(data) 

Я пытаюсь snmpwalk OID, который не существует, когда я пытался сделать это с snmpbulkwalk я получаю:

$ snmpwalk -v2c -c общественности @ 1 10.253.35.61 1.3.6.1.2.1.17.4.3.1.1

SNMPv2-SMI::mib-2.17.4.3.1.1 = No Such Instance currently exists at this OID 

Если мы посмотрим на ТСРйитр мы можем увидеть это:

11:26:00.460905 IP host.52491 > 10.253.35.61.snmp: [email protected] GetBulk(30) N=0 M=10 17.4.3.1.1 
11:26:01.462162 IP host.52491 > 10.253.35.61.snmp: [email protected] GetBulk(30) N=0 M=10 17.4.3.1.1 
11:26:01.658323 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(215) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 
11:26:01.658561 IP host.52491 > 10.253.35.61.snmp: [email protected] GetRequest(30) 17.4.3.1.1 
11:26:01.659643 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(215) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 
11:26:01.660698 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(30) 17.4.3.1.1=[noSuchInstance] 

, который в порядке, я могу увидеть ошибку и работать вокруг него, но когда я запрашиваю его от pysnmp - я получаю «нет ответа по протоколу SNMP, полученные до тайм-аута» ошибки, а вот ТСРйитр:

11:26:58.497144 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 
11:26:59.499136 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 
11:27:00.480834 IP 10.253.35.61.snmp > host.54615: [email protected] GetResponse(542) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017501 17.4.4.1.3.4104=43993868 17.4.4.1.3.4115=379731251 17.4.4.1.3.4136=2614818874 17.4.4.1.3.4137=3830362616 17.4.4.1.4.1414=390518443 17.4.4.1.4.4103=547088805 17.4.4.1.4.4104=270695068 17.4.4.1.4.4115=2723143051 17.4.4.1.4.4136=2811735791 17.4.4.1.4.4137=102796762 17.4.4.1.5.1414=0 
11:27:00.503200 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 
11:27:01.505277 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 
11:27:02.469848 IP 10.253.35.61.snmp > host.54615: [email protected] GetResponse(542) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017846 17.4.4.1.3.4104=43994108 17.4.4.1.3.4115=380963114 17.4.4.1.3.4136=2616771624 17.4.4.1.3.4137=3830710704 17.4.4.1.4.1414=390519877 17.4.4.1.4.4103=547090599 17.4.4.1.4.4104=270696594 17.4.4.1.4.4115=2724485940 17.4.4.1.4.4136=2813399966 17.4.4.1.4.4137=102954755 17.4.4.1.5.1414=0 
11:27:02.987802 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 
11:27:03.989765 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1 

, и это плохо, потому что могут быть разные сценарии, которые могут вызвать таймаут (хост вниз, неправильная строка сообщества и т. Д.), Как я могу эмулировать поведение snmpbulkwalk с помощью pysnmp, возможно, не перейдя на более низкий уровень API.

спасибо.

ответ

0

Второй захват показывает отсутствие пакетов GetResponse. Предполагая, что тайм-ауты происходят из-за медленным агент, рассмотреть возможность pysnmp ждут больше и, возможно повторение менее:

... 
UdpTransportTarget(('demo.snmplabs.com', 161), timeout=8.0, retries=0), 
... 

Если это скорее проблема подключения, попробуйте повторить попытку более агрессивно:

... 
UdpTransportTarget(('demo.snmplabs.com', 161), timeout=1.0, retries=5), 
... 

отметить также, что в pysnmp capture (но не в коде) вы запрашиваете 25 переменных в ответ, где snmpbulkwalk хочет всего 10. Слишком много переменных может вызвать стресс у вашего агента.

+0

Это не он, snmpbulkwalk, переход от GetBulk к GetResponse после первого таймаута. pysnmp продолжается с GetBulk до таймаута. –

+0

GET и GETBULK - это разные команды, SNMP не дает им возможности использовать их вместе. Если вы хотите эмулировать snmpbulkwalk, вы можете сделать свой скрипт Python, вызывающий getCmd() вместе с bulkCmd(). Чтобы решить вашу первоначальную проблему, pysnmp не смешивает тайм-аут с условием отсутствия таких ошибок. Библиотека сообщает, что происходит, и не маскирует и не заменяет никаких ошибок. –

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