next up previous contents
Next: 5.5 Realisierung der Messung Up: 5 Prototypische Implementierung Previous: 5.3 Start der Agentenplattform

Prüfung des ISDN-Status

  Um die Anforderung zu erfüllen, zur Datenübertragung an den Manager durch den Agenten keine eigene ISDN-Verbindung aufzubauen, muß der Agent in der Lage sein, den Zustand dieser Verbindung überwachen zu können.
Zur Umsetzung dieser Forderung wurde im Rahmen des Prototypen die Nutzung des SNMP-Agenten des entsprechenden Routers gewählt, der die notwendigen Informationen bereithält. Ein weiterer Vorteil dieser Methode ist, daß dieser Agent durch die eingesetzten Cisco-Geräte bereits als Standard-Management-Schnittstelle vorhanden ist.
Somit übernimmt der JDMK-Agent die Rolle eines SNMP-Managers. Zur Realisierung dieser Architektur sind folgende Schritte durchzuführen:

1.
Identifikation der benötigten MIB-Variable
Die Identifikation der benötigten MIB-Variable hat sich in der Praxis als schwierig erwiesen, da zu den Cisco-Routern unterschiedliche Versionen von Betriebssystemen in Betrieb sind, die unterschiedliche Informationen bereitstellen. Somit scheiden die Cisco-spezifischen MIBs aus, und die Entscheidung fiel für die in RFC1213 definierten Variablen, die durch alle Ciscosysteme unterstützt werden.
2.
Erzeugung eines MIB-Stores
Mit Hilfe des mibgen-Tools des JDMK wird eine sogenannte MIB-Store erstellt, also eine Java-Klasse, die als SNMP-Schnittstelle die Informationen für die Zuordnung von Variablenbezeichnung zu OID bereitstellt.
3.
Implementierung einer Methode für Abfrage des SNMP-Agenten
Um das Abfragen der SNMP-Variablen zu ermöglichen, muß eine Methode implementiert werden, die eine Verbindung zu dem Agenten des Routers herstellt, die entsprechende Variable ausliest, die Verbindung wieder schließt und den erlangten Wert für alle Komponenten zugänglich macht.
4.
Polling-Mechanismus
Da der SNMP-Agent des Routers keine Traps versendet, wenn eine Verbindung aufgebaut wird, ist es notwendig, die entsprechende MIB-Variable mittels der in Punkt 3 implementierten Methode in regelmäßigen Abständen abzufragen (Polling).
5.
Erzeugung eines Events bei Änderung des Status
Sollte im Rahmen des Pollings der entsprechenden Variable eine Änderung des ISDN-Verbindungsstatus festgestellt werden, muß dies an die angemeldeten Objekte mittels eines Events propagiert werden.
Realisiert wird dieses Vorgehen mittels der Klasse AgISDN_Status, die in Abbildung 5.4 zu sehen ist.
  
Abbildung 5.4: Diagramm der Klasse AgISDN_Status
\begin{figure}

 \begin{center}

 \leavevmode
 \epsfxsize = \textwidth
 
\epsfbox {./Bilder/AgISDNStatus.eps}

 \end{center}
\end{figure}

Zur Überwachung des ISDN-Status wird in dem vorliegenden Prototypen der Inhalt von ifOperStatus der RFC1213-MIB zugrunde gelegt. Spezielle Cisco-MIBs stellen zwar noch detaillierte Informationen wie den Kommunikationspartner, bisherige Dauer der ISDN-Verbindung usw. bereit, werden allerdings nicht von allen Ciscosystemen belegt.
Mit Hilfe des so gefundenen MIB-Files kann nun die für den Manager notwendige Klasse für die Zuordnung von MIB-Bezeichnungen und OIDs erzeugt werden. Mit dem JDMK-Tool mibgen wird die Klasse RFC1213_MIBStore.java generiert.
Die so erzeugte Klasse enthält nun die für den JDMK-Agenten lesbaren Metadata-Definitionen der RFC1213-MIB:

...
public class RFC1213_MIBStore extends MibStore implements Serializable{
  /**
   * Default Constructor. Initialize the Mib tree.
   */
  public RFC1213_MIBStore() throws SnmpStatusException {
    loadMib (varList);
  }
  static String varList[][] = {
... 
    {"ifTable", "1.3.6.1.2.1.3.1", "TA" },
    {"ifOperStatus", "1.4.6.1.2.1.2.2.1.8", "I"},
...
  }
Um die benötigten Informationen abfragen zu können, muß eine Methode implementiert werden, die auf der Basis dieser generierten Klasse eine Verbindung zum SNMP-Agenten herstellt und den Wert der Variable ifOperStatus ausliest. Die Implementierung dieser Methode, die als Rückgabewert den jeweiligen ISDN-Status in Form einer Ganzzahl bereitstellt, sieht wie folgt aus:

  int status = -1;
  String host = AgBasis.globalVariables.getrouterIpName();
  int    port = AgBasis.globalVariables.getrouterSnmpPort();
Zu Beginn der Methode werden die zentralen Parameter mit den jeweiligen Werten belegt. Insbesondere sind hier die Adresse des lokalen Routers und der Port dessen SNMP-Agenten interessant. Die Variable status wird mit dem Wert -1 initialisiert, der die Nicht-Überprüfbarkeit des ISDN-Status signalisiert.
Nun folgt der Aufbau der Verbindung zum Agenten:

     // Initialisierung des SNMP-Frameworks und
     // einer Verbindung zu SNMP-Agenten
     SnmpMain.initializeSNMP(new RFC1213_MIBStore());
     SnmpPeer agent= new SnmpPeer(host, port);

     // Erzeugung einer SNMP-Session
     SnmpSession session= new SnmpSession("performCheckISDNStatusSession");    
     session.setDefaultPeer(agent);
Dazu wird der das SNMP-Framework, das durch das JDMK bereitgestellt wird, mit den zu prüfenden MIBs initialisiert eine SNMP-Session gestartet. Nun muß eine Liste zusammengestellt werden, in denen die Variablen angegeben werden, deren Werte tatsächlich abgefragt werden sollen. Dazu wird ein Objekt der Klasse SnmpVarbindList genutzt, das anschließend in der snmpGet-Methode der Session übergeben wird.

     // Erstellung einer Liste mit den abzufragenden Variablen
     SnmpVarbindList list = new SnmpVarbindList("performCheckISDNStatusVarbindList");
     list.addVariable("ifOperStatus.1");
     list.addVariable("ifOperStatus.2");
     list.addVariable("ifOperStatus.3");

     // Abfrage der in list aufgefuehrten Variablen
     SnmpRequest request = session.snmpGet(null, list);
     
     // Falls der Agent nicht verfuegbar ist (Router abgschaltet)
     boolean completed = request.waitForCompletion(10000);
Mit waitForCompletion(10000) wird nun auf die Beendigung der SNMP-Abfrage, die durch einen Thread realisiert ist, gewartet. Wird diese nicht beendet, so wird der Wert -1 aus dieser Methode zurückgegeben. Wird hier durch completed das korrekte Ausführen der Methode signalisiert, so müssen die Ergebnisse aus diesem request ausgelesen werden. Dies geschieht mit der Methode getResponseVbList():

     // Neue Liste mit dem Resultat der Abfrage erzeugen
     // und einzelne Variablen auslesen
     SnmpVarbindList result = request.getResponseVbList();
     SnmpVar ifOperBRI  = result.getSnmpVarAt(0);
     SnmpVar ifOperB0   = result.getSnmpVarAt(1);
     SnmpVar ifOperB1   = result.getSnmpVarAt(2);
Abschließend müssen die erlangten Ergebnisse interpretiert und ein Rückgabewert ermittelt werden.

     //ISDN Verbindung besteht, wenn mind. ein ISDN Kanal benutzt wird !
     if ((ifOperB0int==1)||(ifOperB1int==1))
       status = 1;
     //ISDN Verbindung besteht nicht, wenn beide Kanaele getestet werden !
     else
       status = 2;
     return status;
Benutzt werden in dieser Methode die SNMP-Funtionalitäten, die in dem JDMK-Paket com.sun.jaw.snmp.manager bereitgestellt werden. Zur Klarstellung wird darauf hingewiesen, daß diese Methode Teil des Management-Agenten ist. Dieser JDM-Agent tritt allerdings dem SNMP-Agenten des Routers gegenüber als Manager auf.
Ein Polling-Mechanismus wird mit Hilfe des Alarmclock-Service implementiert, der in regelmäßigen Abständen ein Event erzeugt.

   alarmClock = new AlarmClock();
   alarmClock.setTimeoutAsLong(new Long(10));
   alarmClock.performStart();
   alarmClock.addAlarmClockListener(this);
setTimeoutAsLong initialisiert diesen Service mit 10 Millisekunden. Dieser Wert ist zu Beginn deshalb so gering, da praktisch umgehend der Status überprüft werden muß. Die Behandlung des durch die Alarmclock erzeugten Events sieht wie folgt aus:

   public void handleAlarmClock (AlarmClockEvent e){
      int status = performCheckISDNStatus();
      setISDNStatus(status);
      alarmClock.setTimeoutAsLong(new Long(10000));
      alarmClock.performStart();
    }
Durch das AlarmClockEvent wird die Methode handleAlarmClock aufgerufen. Diese prüft mittels der oben beschriebenen Methode performCheckISDNStatus den ISDN-Status, und aktiviert die Alarmclock erneut. Durch den Wert 10000 für den Parameter Timeout wird jetzt der Intervall auf 10 Sekunden verlängert.
Die in Abbildung 4.5 dargestellte Forderung der Benachrichtigung aller angemeldeten Instanzen bei Änderung des ISDN-Status wird mit einem Objekt der Klasse PropertyChangeSupport umgesetzt. Diese Klasse ist ein Teil des java.beans-Paketes und hat die Aufgabe, ein Event zu erzeugen, wenn der ISDN-Status sich verändert. Dies geschieht wie folgt:

 private void setISDNStatus (int nISDNStatus){
     int oldISDNStatus = ISDNStatus;
     this.ISDNStatus = nISDNStatus;
     // Event erzeugen und alten und neuen Status uebergeben 
     propertyChangeSupport.firePropertyChange("ISDNStatus", 
                                       new Integer(oldISDNStatus), 
                                       new Integer(ISDNStatus));
 }
Jede Klasse, die sich als Listener für dieses Event registriert hat, wird so benachrichtigt. Dabei wird durch das Event sowohl der alte als auch der neue Statuswert übertragen.
Somit wird durch die Klasse AgISDNStatus die für das Anwendungsszenario zentrale Anforderung der Überwachung der ISDN-Verbindung erfüllt. Durch die Nutzung des PropertyChangeEvent wird die geforderte Benachachrichtigung registrierter Klassen realisiert.


next up previous contents
Next: 5.5 Realisierung der Messung Up: 5 Prototypische Implementierung Previous: 5.3 Start der Agentenplattform
Copyright Munich Network Management Team