Преобразование пар значений OID из текстового соглашения MIB с помощью pysnmp

Я пытаюсь написать фрагмент кода, который принимает объект JSON с идентификаторами OID в качестве ключей и значениями OID в качестве значений. Примером может быть:

{".1.3.6.1.4.1.562.29.6.2.3": "Link Down",
 ...
}

Когда этот объект JSON получен, я хочу перевести OID и значение OID с помощью PySNMP, но я не знаю, как я могу преобразовать значение OID в соответствии с текстовыми соглашениями, определенными в соответствующем файле MIB.

Пример файла MIB будет определять:

TruthValue ::= TEXTUAL-CONVENTION
     STATUS       current
     DESCRIPTION
             "Represents a boolean value."
     SYNTAX       INTEGER { true(1), false(2) }

Учитывая OID и значение OID, которое соответствует текстовому соглашению, подобному приведенному выше, я хотел бы перевести:

{"OID": 1,...} в {"OID": true,...}

Возможно ли это с PySNMP?


person user3530640    schedule 24.11.2014    source источник


Ответы (1)


Это возможно с помощью pysnmp:

from pysnmp.smi import builder

mibBuilder = builder.MibBuilder()
TruthValue, = mibBuilder.importSymbols('SNMPv2-TC', 'TruthValue')
print(TruthValue(1).prettyPrint()) # prints 'true'

Однако в целом вам придется каким-то образом сопоставить OID с типами значений (некоторые из которых могут преобразоваться в ТЕКСТОВЫЕ КОНВЕНЦИИ). Это можно сделать специальным образом, жестко закодировав сопоставление типов OID-> для определенных OID в вашем приложении, но более общим решением является использование служб pysnmp MIB:

from pysnmp.smi import view, builder

mibViewController = view.MibViewController(builder.MibBuilder())
varName = mibvar.MibVariable('1.3.6.1.6.3.10.2.1.1.0').loadMibs('SNMP-FRAMEWORK-MIB').resolveWithMib(mibViewController)
print(varName.getMibNode().getSyntax().clone('12341234'))

В приведенном выше примере будет выбран тип значения для 1.3.6.1.6.3.10.2.1.1.0 и приведено значение 12341234 к связанному типу.

ОБНОВЛЕНО:

Рассмотрите возможность использования высокоуровневого интерфейса для служб MIB, который доступен с pysnmp 4.3

person Ilya Etingof    schedule 24.11.2014
comment
Спасибо за ваш ответ. Я попытался реализовать ваше более общее решение с файлом MIB и OID, который следует текстовому соглашению, и я включил from pysnmp.entity.rfc3413.oneliner import mibvar, чтобы получить доступ к mibvar. Предполагается, что оператор печати выводит переведенное значение OID? Для меня результат print(varName.getMibNode().getSyntax().clone('2')) - это непереведенное целое число 2. - person user3530640; 24.11.2014
comment
Да, вы должны получить переведенное значение, если: 1) OID, с которым вы работаете, имеет связанный тип, который является ТЕКСТОВОЙ КОНВЕНЦИЕЙ и 2) вы загрузили MIB, в котором определен OID, с которым вы работаете, и 3) значение, которое вы пытаетесь translate (например, 2) имеет символическое представление, определенное в его TEXTUAL-CONVENTION. - person Ilya Etingof; 27.11.2014
comment
Я обнаружил, что с помощью prettyPrint () вот так: print(varName.getMibNode().getSyntax().clone('12341234').prettyPrint()) напечатал перевод из моей тестовой MIB, но у меня, похоже, есть проблемы с другими MIB и функцией resolveWithMIB. Я получаю pysnmp.smi.error.SmiError: Short OID for index NnExtAlarmEventType(). Не лучше ли задать это другим вопросом? - person user3530640; 28.11.2014
comment
Имейте в виду, что если OID действует как индекс таблицы, он должен быть преобразован в значения индекса. Но это совсем другой вопрос. Также были бы полезны образцы кода и MIB. - person Ilya Etingof; 29.11.2014
comment
Спасибо за помощь! Я разместил здесь другую проблему: stackoverflow.com/questions/27224002/ - person user3530640; 01.12.2014