2017-02-20 11 views
0

Результатом запроса GET на фирменной MIB было: (None, None, None, []). В чем смысл этого результата?Я не могу понять результат запроса SNMP GET для моего настраиваемого MIB

Это питон скрипт:

>>>g= getCmd(SnmpEngine(), 
...   CommunityData('admin'), 
...   UdpTransportTarget(('10.0.1.134', 161)), 
...   '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360' 
) 
>>>next(g) 
(None, None, None, []) 

Я добавил отладки линии и получили следующий результат:

>>> from pysnmp.hlapi import * 
>>> from pysnmp.debug import setLogger, Debug 
>>> 
>>> setLogger(Debug('msgproc', 'secmod')) 
2017-02-21 10:27:44,322 pysnmp: running pysnmp version 4.3.2 
2017-02-21 10:27:44,322 pysnmp: debug category 'msgproc' enabled 
2017-02-21 10:27:44,322 pysnmp: debug category 'secmod' enabled 
>>> 
>>> 
>>> g= getCmd(SnmpEngine(), 
...    CommunityData('admin'), 
...    UdpTransportTarget(('10.0.1.134', 161)), 
...    '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360' 
... ) 
>>> next(g) 
(None, None, None, []) 

Я даже пытался добавить ContextData(), который отсутствует, и получил следующий результат:

>>> from pysnmp.hlapi import * 
>>> from pysnmp.debug import setLogger, Debug 
>>> setLogger(Debug('msgproc', 'secmod')) 
2017-02-21 10:29:41,640 pysnmp: running pysnmp version 4.3.2 
2017-02-21 10:29:41,640 pysnmp: running pysnmp version 4.3.2 
2017-02-21 10:29:41,640 pysnmp: debug category 'msgproc' enabled 
2017-02-21 10:29:41,640 pysnmp: debug category 'msgproc' enabled 
2017-02-21 10:29:41,640 pysnmp: debug category 'secmod' enabled 
2017-02-21 10:29:41,640 pysnmp: debug category 'secmod' enabled 
>>> g= getCmd(SnmpEngine(), 
...    CommunityData('admin'), 
...    UdpTransportTarget(('10.0.1.134', 161)), 
...    ContextData(), 
...    '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360' 
...) 
>>> next(g) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\asyncore\sync\cmdgen.py", line 107, in getCmd 
File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\asyncore\cmdgen.py", line 127, in getCmd 
File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\varbinds.py", line 36, in makeVarBinds 
File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\smi\rfc1902.py", line 845, in resolveWithMib 
pysnmp.smi.error.SmiError: MIB object ObjectIdentity('1') is not OBJECT-TYPE (MIB not loaded?) 
    >>> 

Вы видите, что я делаю неправильно? Может ли быть так, что тот факт, что я использовал другие MIB-файлы для конвертации моей собственной MIB в формат .py, каким-то образом изменил мою MIB? Не думаете ли вы, что мне лучше сделать преобразование mibdump.py по всему MIB-дереву (без использования http-источников)?

ответ

0

TL; RD; У вас не хватает contextData параметр:

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(), 
     CommunityData('public'), 
     UdpTransportTarget(('demo.snmplabs.com', 161)), 
     ContextData(), 
     ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')), 
     ObjectType(ObjectIdentity('1.3.6.1.2.1.1.6.0'))) 

)

, как вы можете видеть в examples или documentation.

дали кортеж распаковывает в errorIndication, errorStatus, errorIndex, varBinds компоненты:

  • без ложной errorIndication проявляет твердую ошибку, поступающими с локального или удаленного SNMP двигателя
  • без ложной errorStatus указывает на одну из предопределенные коды ошибок SNMP, поступающие с удаленного сервера SNMP
  • varBinds представляет собой последовательность пар значений OID, отправленных удаленным механизмом SNMP в ответ на ваш запрос

Возврат (None, None, None, []) выглядит как удаленный SNMP-движок не помещает пары значений OID в ответ PDU. Чтобы понять это, я бы включить отладку pysnmp:

from pysnmp.debug import setLogger, Debug 

setLogger(Debug('msgproc', 'secmod')) 

, чтобы увидеть, что происходит от вас и то, что приходит в ответ от удаленного конца.

Я предполагаю, что, поскольку вы неправильно используете параметр OID, вы фактически отправляете пустой список OID-значений, чтобы удаленный конец ничего не ответил.

+0

Извините за вопрос (я новичок в этом районе). Где часть отладки входит в скрипт? –

+0

@ MosheS.You можете поместить его куда угодно - отладочные сообщения будут печататься на stderr с момента выполнения функции setLogger. Как правило, в верхней части скрипта. –