2016-08-01 33 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代理啓動後:

# 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 

是能夠回報我的期望值。

但是對於我的系統,它會動態生成很多告警信息,這些信息需要更新到SNMP的MIB表中,允許其他SNMP管理器發送「get/getNext」從我的系統中獲取告警信息。

所以我想知道

  • 有沒有辦法在pysnmp做到這一點?
  • 或我必須始終靜態更新我的報警表?然後在每次更新操作後重新啓動SNMP代理?
  • 或者我必須在SNMP代理程序啓動期間使用所有可能的2147483647實例初始化我的報警表?並使用「名稱[-1]」從每個查詢中獲取索引/行號?

    如果是這樣,getNext查詢怎麼樣?它會忽略那些空錶行嗎?或者它總是返回下一個,即使它是一個虛擬的?

  • 還是有更好的方法來從查詢消息中獲取「索引/行」號碼嗎?

@Ilya Etingof,pysnmp的專家。如果你有時間,你能幫助我嗎?

BR, -Dapeng焦該告警表

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. 定期通過this示例腳本調用mibInstrumentation.writeVars更新表(通過表格回調或專用線)。如果在運行更新的時候發現新的數據和查詢,則背後包含延遲。但沒有太多的編碼要求。

  2. 擴展MibTableColumn類並實現它的readGet/readGetNext方法來調用您的數據並返回OID /值對。這裏的複雜性在於,要處理GETNEXT查詢,您需要維護某種OID的一致排序並搜索下一個大於給定的排序。

  3. 溝通整個pysnmp的SMI基礎設施,並實施您自己的MIB controller任何數據源,你必須從中讀取數據。您需要實施readGet(簡單),並可能需要readGetNext(更復雜,因爲需要穩定的OID排序)方法。通過這種方式,您可以從自己學習相當普遍且複雜的pysnmp SMI實現的細節中獲益,並專注於最低要求。

爲了回答您的其他問題:

  • 它不是重新啓動服務,只是爲了更新它所服務的日期是個好主意。
  • 除非在SNMP表中確實有很多行(2^31),否則可以動態更新它(定時器回調或線程)。如果它們超過幾百個,唯一的辦法就是將所有的警報數據保存在現在的位置,在查詢出來時讀取它並從中建立SNMP響應。
  • 有關OID的哪些部分屬於SNMP表索引的知識屬於MibTableRowMibTableColumn類。所以如果你延長他們,你可以弄清楚。儘管如此,還有helper methods