2016-08-01 2 views
0

Я искал способ использования pysnmp для динамического обновления SNMP-таблицы во время работы SNMP-агента. Но до сих пор не повезло ...Использование Pysnmp для динамического обновления SNMP-таблицы со стороны агента

таблица не была уже определена в MIB файле (см ниже), но, кажется, мне нужно переписать его метод «readGet()» для того, чтобы вернуть правильные данные из потока состояние системы.

В соответствии с инструкциями http://pysnmp.sourceforge.net/examples/v3arch/asyncore/agent/cmdrsp/agent-side-mib-implementations.html#implementing-conceptual-table

Я могу построить статическую таблицу с заранее определенным значением перед запуском SNMP агента, и после запуска SNMP Agent:

# Register an imaginary never-ending job to keep I/O dispatcher running forever 
self.snmpEngine.transportDispatcher.jobStarted(1) 
# Run I/O dispatcher which would receive queries and send responses 
try: 
    self.snmpEngine.transportDispatcher.runDispatcher() 
except: 
    self.snmpEngine.transportDispatcher.closeDispatcher() 
    raise 

оно способный вернуть ожидаемое значение.

Но для моей системы он будет динамически генерировать много информации о тревоге, и эта информация должна быть обновлена ​​в таблице MIB SNMP, что позволяет другому диспетчеру SNMP отправлять «get/getNext» для извлечения информации о тревоге из моей системы.

Так что я хотел бы знать,

  • есть способ сделать это в pysnmp?
  • или мне нужно постоянно обновлять таблицу аварийных сигналов? а затем перезапустить агент SNMP после каждого действия по обновлению?
  • или мне нужно инициализировать мою таблицу тревог со всеми возможными экземплярами 2147483647 во время запуска агента SNMP? и использовать «имя [-1]», чтобы получить номер индекса/строки из каждого запроса?

    если так, как насчет запроса getNext? игнорирует ли эти строки пустую таблицу? или он всегда возвращает следующий, даже это фиктивный?

  • или есть лучший способ получить номер «индекс/строка» из сообщения запроса?

@Ilya Etingof, эксперт pysnmp. Не могли бы вы мне помочь, если у вас есть время?

Br, -Dapeng Jiao

1.

MIB файл определения этой таблица тревог (некоторая чувствительная информация удаляется)

alarmTable = MibTable((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3)) 
alarmEntry = MibTableRow((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1)).setIndexNames((0, "MY-MIB", "alarmIndex")) 
alarmIndex = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 1), Integer32().subtype(subtypeSpec=ValueRangeConstraint(1, 2147483647))).setMaxAccess("readonly") 
alarmId = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 2), Integer32().subtype(subtypeSpec=ValueRangeConstraint(1, 2147483647))).setMaxAccess("readonly") 
alarmName = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 3), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly") 
alarmSeverity = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 4), AlarmSeverity()).setMaxAccess("readonly") 
alarmTime = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 5), DateAndTime()).setMaxAccess("readonly") 
alarmType = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 6), AlarmType()).setMaxAccess("readonly") 
alarmSource = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 7), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly") 
alarmCategory = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 8), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly") 
alarmProbableCause = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 9), ProbableCause()).setMaxAccess("readonly") 
alarmComparable = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 10), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly") 
alarmAdditionalText = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 11), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly") 

ответ

1

можно поддерживать динамическую таблицу SNMP с pysnmp. Есть много подходов к этой проблеме:

  1. Периодически обновлять таблицу (с помощью таблицы обратного вызова или специальной нити) путем вызова mibInstrumentation.writeVars в this примере сценария. Backsides включает задержки в обслуживании новых данных и запросов, если они приходят в момент запуска обновления. Но не требуется много кодирования.

  2. Внесите MibTableColumn класс и реализуйте его методы поиска в ваших данных при вызове и возврате пары OID/value.Усложнение заключается в том, что для обработки запроса GETNEXT вам необходимо поддерживать какой-то согласованный порядок OID и искать следующее больше заданного.

  3. Погрузите всю инфраструктуру SMI pysnmp и внесите свой собственный MIB controller поверх любого источника данных, с которого вы должны будете считывать данные. Вам нужно будет реализовать readGet (легко) и, вероятно, readGetNext (более сложным, так как требуется стабильная сортировка OID). Таким образом, вы облегчите себе изучение деталей довольно общей и сложной реализации SMI pysnmp и сосредоточьтесь на своих минимальных требованиях.

Чтобы ответить на другие вопросы:

  • Это не очень хорошая идея, чтобы перезапустить службу просто обновить дату, которую он обслуживает.
  • Вы можете обновить его динамически (обратный вызов таймера или поток), если у вас действительно так много (2^31) строк в вашей таблице SNMP. Если их больше нескольких сотен, единственный способ - сохранить все данные тревоги там, где он есть сейчас, прочитать его, когда приходит запрос, и построить от него ответ SNMP.
  • Знание того, какая часть OID принадлежит индексу таблицы SNMP, относится к классам MibTableRow и MibTableColumn. Поэтому, если вы их продлеваете, вы можете понять это. Для этой цели есть helper methods.
Смежные вопросы