pysnmp - получить вывод из сценария расширения NET-SNMP-EXTEND-MIB?

Как я могу правильно вызвать сценарий расширения SNMP с помощью MIB с помощью pysnmp 4.3?

У меня есть эта запись в файле snmpd.conf удаленного сервера:

extend check_fd_wap /app/users/nagios_checks/check_fd_wap.sh

который, в свою очередь, может быть вызван:

snmpwalk -t 60 -v2c -c greendale remoteserver 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"'
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap" = STRING: { "sys_inuse" : 32640, "proc_data" : {  "ssl-mmsib" : { "proc_used" : 22, "proc_limit" : 200000 } , (...) }

В pysnmp я пытаюсь вызвать MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap", используя пример кода:

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
        CommunityData(community, mpModel=1),
        UdpTransportTarget((hostname, port)),
        ContextData(),
        ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB','nsExtendOutput1Line','check_fd_wap')))
)

for varBind in varBinds:
    print(' = '.join([x.prettyPrint() for x in varBind]))

Однако это не удается с сообщением об ошибке 'DisplayString' failed to cast value OctetString:

raise SmiError('MIB object %r having type %r failed to cast value %r: %s' % (self.__args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class__.__name__, self.__args[1], sys.exc_info()[1]))
;SmiError: MIB object u'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap' having type 'DisplayString' failed to cast value OctetString('{ "sys_inuse" (...)"" at DisplayString

Однако вызов с переведенным OID работает нормально ('.1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112').

SNMPv2-SMI::enterprises.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112 = { "sys_inuse" : 31110, "proc_data" : {  "ssl-mmsib" : { "proc_used" : 19, "proc_limit" : 200000 } } }

В чем причина этой ошибки?

Кроме того, если я вызываю getCmd с полным MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap в качестве одного аргумента, я получаю сообщение об ошибке:

pysnmp.smi.error.NoSuchObjectError: NoSuchObjectError({'str': 'Can\'t resolve node name ::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\', \'"check_fd_wap"\') at <pysnmp.smi.view.MibViewController instance at 0x2989638>'})

Можно ли вызвать SNMP-получение с полным MIB в одной строке?


person André Fernandes    schedule 06.07.2016    source источник
comment
Вы загрузили свой собственный файл MIB, как описано в этом ответе stackoverflow.com/a/14635022/2807083?   -  person user2807083    schedule 08.07.2016
comment
Нет, так как я использую не пользовательский MIB, а NET-SNMP-EXTEND-MIB. Преобразование MIB в OID работает, а вот обработка SNMP-ответа не работает.   -  person André Fernandes    schedule 08.07.2016
comment
Я думаю, что сообщение Can\'t resolve node name ::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\', \'"check_fd_wap"\') at <pysnmp.smi.view.MibViewController instance at 0x2989638>'}) явно говорит о том, что есть проблема с трансляцией MIB в OID   -  person user2807083    schedule 08.07.2016
comment
И с числовым oid тоже все работает.   -  person user2807083    schedule 08.07.2016
comment
Вероятно, это означает, что конструктор ObjectIdentity не вызывается должным образом, поскольку ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB','nsExtendOutput1Line','check_fd_wap'))) правильно транслируется в OID. Но это только второй вопрос, на который я бы удовлетворился ответом «Нет, это нельзя так назвать».   -  person André Fernandes    schedule 08.07.2016
comment
\'"check_fd_wap"\' посмотрите на дополнительные кавычки в этой строке, может из-за этого. Я понятия не имею, откуда он взялся в сообщении об ошибке.   -  person user2807083    schedule 08.07.2016
comment
Удаление двойных кавычек не решает эту проблему. Двойные кавычки исходят из синтаксиса, необходимого для вызова этой конкретной MIB с помощью snmpwalk/snmpget в командной строке.   -  person André Fernandes    schedule 08.07.2016


Ответы (1)


Эта неудача:

'DisplayString' failed to cast value OctetString

происходит, когда pysnmp получает ответ от агента SNMP для запрошенного OID

1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112

(что соответствует объекту MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap), а затем попытался преобразовать значение ответа ({ "sys_inuse" : 32640, "proc... ) в удобное для человека представление DisplayString. В этот момент pysnmp завершился ошибкой, но точная причина по какой-то причине не включена в ваш отчет.

Я предполагаю, что строка ответа, отправленная вашим SNMP-агентом, может случайно превысить длину 255 символов (это ограничение типа DisplayString).

Формально правильное решение состоит в том, чтобы сделать ответ SNMP-агента для этого объекта MIB, умещающего 255 символов ASCII, чтобы удовлетворить ограничения типа DisplayString.

Кроме того, вы можете отключить поиск MIB для значений ответов в pysnmp, передав ключевой аргумент lookupMib=False в функцию getCmd().

person Ilya Etingof    schedule 13.07.2016