next up previous contents
Next: Darstellung der MIB im Up: Entwicklung eines eigenen Subagenten Previous: Entwicklung eines eigenen Subagenten

Genereller Programmablauf

Das Programm wird durch Aufruf des PERL Skripts subagent_start gestartet. PERL 5.0 oder neuer ist dabei Vorraussetzung. Es werden nun alle weiteren benötigten Programmteile mittels require eingebunden, die Konfigurationsvariablen gesetzt, die syntaktische Struktur der MIB konfiguriert und alle MIB Variablen, die schon zu Programmstart einen Wert haben sollen, initialisiert. Anschließend wird die Prozedur Subagent() gestartet.

Die Prozedur Subagent() öffnet die Verbindung zum Hauptagenten und registriert dort die MIB. Anschließend wird der DPI Filehandle bei einem Event Dispatcher registriert und die Kontrolle an diesen Dispatcher abgegeben.

Trifft eine DPI Meldung ein, so wird die Funktion DPI_Handler() aufgerufen. Die Routine dekodiert das eingegangene Paket und ruft, je nach Art des Requests eine der Funktionen answer_get für einen GET Request, answer_getnext für einen GETNEXT Request oder answer_setgrp für einen Request aus der SET Gruppe (SET, COMMIT und UNDO).

Die entsprechenden Funktionen verzweigen nun in eines der Moduln mib_gets.pl und mib_sets.pl, wo kaskadierte if-then-else Schleifen durchlaufen werden. An dieser Stelle wird die OID dekodiert und dann die entsprechende GET/SET/COMMIT/UNDO Funktion in den Moduln sub_gets.pl, sub_sets.pl, sub_coms.pl und sub_undos.pl aufgerufen. In diesen Moduln existieren generische Funktionen für GET, SET, COMMIT und UNDO von Skalar- und Tabellenwerten. In diesen Moduln befinden sich ebenfalls spezielle GET/SET Funktionen für ganz bestimmte MIB Variablen.

Nach der Abarbeitung des DPI Kommandos kehrt das Programm zur Hauptprozedur Subagent() zurück. Diese Endlosschleife wird nur verlassen, wenn eine Steuervariable, die in der MIB bereitgestellt werden muß, auf 0 gesetzt wird:

#--------------------------------------------------------------
# Warten auf eine Anfrage
while(!($Wert{'3.2.0'} == 0)) {   # Warten auf DPI-Anfragen des Agenten
    &dispatch_now (30);
}
#--------------------------------------------------------------

Wird die Agentensteuervariable auf 0 gesetzt, so wird DPI_Handler() beim Event Dispatcher und die MIB Variablen beim Hauptagenten deregistriert. Anschließend wird die Verbindung zum Hauptagent geschlossen und das Programm beendet.

Hinweise für die eigene Implementierung:

Die Übertragung des DPI Handlings an einen Event Dispatcher war nötig, da der Syslog Agent neben dem Socket zur DPI Kommunikation noch weitere asynchrone Ereignisse überwachen muß. Wird diese Funktionalität nicht benötigt, so kann auf den Event Dispatcher komplett verzichtet werden und ein direktes Lesen vom DPI Port stattfinden.

Anstatt

...
# Registrieren des DPI Handlers beim Event Dispatcher
print_debug (3, "Registriere DPI_Handler beim Dispatcher");
&dispatch_addfunc (fileno(DPI_Anschluss), \&DPI_Handler);

#--------------------------------------------------------------
# Warten auf eine Anfrage
while(!($Wert{'3.2.0'} == 0)) {   # Warten auf DPI-Anfragen des Agenten
    &dispatch_now (30);
}
#--------------------------------------------------------------
# Unregistrieren des Teilbaums
&DPI_UnRegister;
...

kann dann

...
#--------------------------------------------------------------
# Warten auf eine Anfrage
while(!($Wert{'3.2.0'} == 0)) {   # Warten auf DPI-Anfragen des Agenten
    recv(DPI_Anschluss,$Laenge,2,0);
    $Laenge = unpack("n",$Laenge);
    recv(DPI_Anschluss,$dpi_packet,$Laenge,0);
    @dpi_header = unpack("H2H2H2nH2",$dpi_packet);  # Header auslesen

    if ($dpi_header[4] eq "01") # Falls get-Request
        {
        print "Get-Request empfangen\n";
        &answer_get;        # Beantworte get-Request
        }
    elsif ($dpi_header[4] eq "02")  # falls getnext-Request
        {
        print "Getnext-Request empfangen\n";
        &answer_getnext;    # Beantworte getnext-Request
        }
    elsif ($dpi_header[4] eq "03" || $dpi_header[4] eq "0a" || $dpi_header[4] eq
 "0b")
        {   # falls set-Request Gruppe
        &answer_setgrp($dpi_header[4]);
        }
    elsif ($dpi_header[4] eq "05")  # falls Response
        {
        print "Response empfangen\n";
        next;
        }
    else
        {
        print "Undefinierbare Nachricht empfangen\n";
        print "gemeldeter Packettyp: $dpi_header[5]\n";
        }
}
#--------------------------------------------------------------
...

benutzt werden. Die Funktion DPI_Handler() und der gesamte Event Dispatcher entfallen.


next up previous contents
Next: Darstellung der MIB im Up: Entwicklung eines eigenen Subagenten Previous: Entwicklung eines eigenen Subagenten
Copyright Munich Network Management Team