2016-07-09 6 views
0

Ich habe einen SNMP-Agenten mit snmp4j implementiert und stolpere ein wenig darüber, wie man SNMPv3-Traps/Notifications korrekt an einen SNMP-Manager meldet. Die Implementierung ist so eingerichtet, dass sie eine Tabelle von Werten verwaltet, die von instanceId indiziert sind. Wenn Sie den Agenten abfragen, erhalten Sie die OIDs der verschiedenen Felder mit dem Suffix ".1", ".2", ".3" usw. basierend auf der bestimmten Verknüpfungsinstanz, die dem OID-Wert zugeordnet ist. Also Abfrage Ergebnisse in:Tabellenindex in SNMP-Trap senden

----------------------------------------- 
| Entity | OID   | Value  | 
----------------------------------------- 
| Link1 | linkAlias.1 | Link 1  | 
| Link2 | linkAlias.2 | Link 2  | 
| Link1 | linkState.1 | 1   | 
| Link2 | linkState.2 | 3   | 
| Link1 | linkText.1 | UP   | 
| Link2 | linkText.2 | INITIALIZING | 
----------------------------------------- 

Das funktioniert super. Allerdings muss ich in der Lage sein, Traps auf ähnliche Weise zu senden, so dass der Index der Tabelle mit dem Trap gesendet wird. Auf diese Weise können Alarme, die durch SNMP-Abfragen ausgelöst werden, gelöscht werden, wenn sich der Verbindungsstatus ändert. Ich habe versucht, einfach die instanceId als Varbind hinzuzufügen, wie unten in meinem Codeblock gezeigt, aber die Entität wird immer als generischer "Link" gemeldet. Ist mir jemand begegnet, der mir helfen könnte, das zu lösen? Alles wird sehr geschätzt.

public static void updateLinkStatus(int instanceId, LinkState status) 
{ 
    boolean varChanged = false; 

    Variable[] currentManagedObject = currentManagedObjects.get(instanceId); 
    if(currentManagedObject != null) 
    { 
     // If we are managing this object 
     if(((Integer32)currentManagedObject[1]).toInt() != status.value) 
      varChanged = true; 

     // Update the managed object Status Integer and Status Text 
     currentManagedObject[1] = new Integer32(status.value); 
     currentManagedObject[2] = new OctetString(status.getLinkStateText()); 
    } 
    else 
    { 
     varChanged = true; // No previous record to check against 
    } 

    // Send trap now if not equal to previous value 
    if(varChanged) 
    { 
     OID trapOid = null; 
     int linkState = LinkState.UNKNOWN.value; // Will be overridden 
     String linkStateText = null; 

     if(status == LinkState.DOWN) 
     { 
      trapOid = oidLinkDown; 
      linkState = LinkState.DOWN.value; 
      linkStateText = LnkState.DOWN.getLinkStateText(); 
     } 
     else if(status == LinkState.MISCONFIGURED) 
     { 
      trapOid = oidLinkMisconfigured; 
      linkState = LinkState.MISCONFIGURED.value; 
      linkStateText = LinkState.MISCONFIGURED.getLinkStateText(); 
     } 
     else if(status == LinkState.UP) 
     { 
      trapOid = oidLinkUp; 
      linkState = LinkState.UP.value; 
      linkStateText = LinkState.UP.getLinkStateText(); 
     } 
     else if(status == LinkState.INITIALIZING) 
     { 
      trapOid = oidLinkInitializing; 
      linkState = LinkState.INITIALIZING.value; 
      linkStateText = LinkState.INITIALIZING.getLinkStateText(); 
     } 
     else 
     { 
      // Theoretically, should never change to LinkState.UNKNOWN - no trap available for it 
      linkState = LinkState.UNKNOWN.value; 
      linkStateText = LinkState.UNKNOWN.getLinkStateText(); 
     } 

     // Create variable bindings for V3 trap 
     if(trapOid != null) 
     { 
      List<VariableBinding> variableBindings = new ArrayList<VariableBinding>(); 
      variableBindings.add(new VariableBinding(oidLinkState, new Integer32(linkState))); 
      variableBindings.add(new VariableBinding(oidLinkText, new OctetString(linkStateText))); 
      variableBindings.add(new VariableBinding(oidLinkInstanceID, new Integer32(instanceId))); 
      //I've tried the below varbind too and it also doesn't work 
      //variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId))); 
      agent.sendTrap_Version3(trapOid, variableBindings); 
     } 
    } 
} 

Edit:

Hinweis: Die Links sind dynamisch konfigurierbar, so kann ich nicht einfach jede Verbindung mit einer separaten OID definieren; Ich definiere die Basis-OID in der MIB und muss den Index dynamisch hinzufügen.

Antwort

0

Ich entdeckte die Lösung. Ich habe versucht, einfach die Instanz Index für die OID hinzufügen und einen NULLOBJ als Wert in der varbind senden etwa so:

variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId))); 

aber der Manager abgelehnt die Nachricht. So habe ich die Instanz Index für die OID sowie den varbind Wert wie so:

variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId), new Integer32(instanceId))); 

Und der Manager meldet die Einheit als Link1, Link2 usw. im Einklang mit der SNMP-Tabelle.