2016-08-01 36 views
0

Ich hatte eine Möglichkeit gesucht, pysnmp zu verwenden, um eine SNMP-Tabelle während laufendem SNMP-Agent dynamisch zu aktualisieren. Aber bisher kein Glück ...Verwenden Sie Pysnmp, um SNMP-Tabelle dynamisch von der Agentenseite zu aktualisieren

Die Tabelle bereits hatte in MIB-Datei (siehe unten) definiert, aber es scheint, ich brauche seine „readGet()“ Methode, um zu überschreiben korrekte Daten von aktuellem zurückzukehren Systemstatus.

Nach den Anweisungen von http://pysnmp.sourceforge.net/examples/v3arch/asyncore/agent/cmdrsp/agent-side-mib-implementations.html#implementing-conceptual-table

Ich bin der Lage, eine statische Tabelle mit vordefinierten Wert, bevor SNMP-Agenten Inbetriebnahme und nach SNMP-Agent Startup zu bauen:

# 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 

es ist kann meinen erwarteten Wert zurückgeben.

Aber für mein System wird es dynamisch viele Alarminformationen generieren, und diese Informationen müssen in SNMP MIB-Tabelle aktualisiert werden, die andere SNMP-Manager senden "Get/getNext" Alarminformationen aus meinem System abrufen können.

So würde Ich mag

  • wissen, ist es eine Möglichkeit, dies in pysnmp zu tun?
  • oder muss ich meine Alarmtabelle immer statisch aktualisieren? und dann den SNMP-Agenten nach jeder Update-Aktion neu starten?
  • oder muss ich beim Start des SNMP-Agenten meine Alarmtabelle mit allen möglichen 2147483647-Instanzen initialisieren? und benutze "name [-1]", um die Index-/Zeilennummer von jeder Abfrage zu erhalten?

    Wenn ja, wie wäre es mit getNext Abfrage? Wird diese leere Tabellenzeile ignoriert? oder es kommt immer als nächstes zurück, auch wenn es ein Dummy ist?

  • oder gibt es eine bessere Möglichkeit, die "index/row" -Nummer aus der Abfragenachricht abzurufen?

@Ilya Etingof, der Experte von pysnmp. Könntest du mir helfen, wenn du Zeit hast?

Br, -Dapeng Jiao

1.

MIB-Datei Definition dieser Alarmtabelle (einige sensible Informationen werden entfernt)

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") 

Antwort

1

Es ist möglich, dynamische SNMP-Tabelle zu verwalten mit pysnmp. Es gibt viele Ansätze für dieses Problem:

  1. In regelmäßigen Abständen Ihre Tabelle aktualisieren (über einen Tisch Rückruf oder spezielle Gewinde) durch mibInstrumentation.writeVars in this Beispiel Skript aufrufen. Die Rückseite enthält Verzögerungen bei der Bereitstellung neuer Daten und Abfragen, wenn sie zum Zeitpunkt der Aktualisierung ausgeführt werden. Aber nicht viel Codierung erforderlich.

  2. MibTableColumn Klasse erweitern und implementieren seine readGet/readGetNext Methoden in Ihre Daten zu suchen, wenn und OID/Wert-Paar Rückkehr aufgerufen wird.Die Komplikation hier ist, dass GETNEXT Abfrage Sie müssen eine Art von konsistenten Reihenfolge der OIDs und Suche nach nächsten größer als angegeben pflegen.

  3. Ditch des SMI-Infrastruktur des gesamten pysnmp und Ihre eigenen MIB controller auf der Quelle, was auch immer Daten implementieren Sie Daten aus lesen müssen. Sie müssten readGet (einfach) und wahrscheinlich readGetNext implementieren (komplizierter, da stabile OID-Sortiermethoden erforderlich sind). Auf diese Weise würden Sie sich von den Details einer eher generischen und komplizierten pysnmp SMI Implementierung befreien und sich auf Ihre minimalen Anforderungen konzentrieren.

Ihre Fragen zu beantworten:

  • Es ist keine gute Idee, einen Dienst neu zu starten nur das Datum zu aktualisieren, es dient.
  • Sie können es dynamisch aktualisieren (Timer Callback oder Thread), wenn Sie wirklich so viele (2^31) Zeilen in Ihrer SNMP-Tabelle haben. Wenn sie mehr als ein paar Hundert sind, besteht die einzige Möglichkeit darin, alle Alarmdaten dort zu belassen, wo sie sich gerade befinden, sie zu lesen, wenn eine Anfrage kommt, und daraus eine SNMP-Antwort zu erstellen.
  • Das Wissen, welcher Teil von OID zum SNMP-Tabellenindex gehört, gehört zu den Klassen MibTableRow und MibTableColumn. Also, wenn Sie sie erweitern, könnten Sie das herausfinden. Dafür gibt es helper methods.