2016-07-06 9 views
0

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

У меня есть эта запись в файле 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 эр ROR сообщение:

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 в одной строке?

+0

Загрузили ли вы свой файл MIB, как описано в этом ответе http://stackoverflow.com/a/14635022/2807083? – user2807083

+0

Нет, поскольку я не использую пользовательскую MIB, а «NET-SNMP-EXTEND-MIB». Работа MIB-to-OID работает, что не соответствует обработке ответа SNMP. –

+0

Я думаю, что сообщение 'Can \ 't разрешает имя узла :: (\' NET-SNMP-EXTEND-MIB :: nsExtendOutput1Line \ ', \'" check_fd_wap "\ ') в экземпляре '}) 'очевидно говорит, что есть проблема с переводом MIB на OID – user2807083

ответ

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 

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

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

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

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