next up previous contents
Next: Zusammenfassung Up: Entwicklung eines DPI-Subagenten in Previous: Gleichbleibendes Gerüst des Subagenten

Aufbau eines eigenen Subagenten

Zuerst erstellt man eine Datei, die das PERL 5.0 - Startskript für den Subagenten enthalten soll. Folgender Aufbau wird dringend empfohlen:
#!/sw/mnm/perl5/bin/perl

require "sub_gets.pl";
require "sub_sets.pl";
require "sub_undos.pl";
require "sub_coms.pl";
require "mib_gets.pl";
require "mib_sets.pl";
require "subagent_standard.pl";

#######################################################
# Definition einiger Konstanten
#######################################################
# Konstanten fuer den Socket
$AF_INET     = 2;
$SOCK_STREAM = 1;
$SOCK_DGRAM  = 2;
$SOCKADDR    = 'S n a4 x8';

#Konstanten fuer die SNMP-Kommunikation zum Agenten
$SNMP_PORT      = 161 ;
$SNMP_TRAP_PORT = 162 ;
$SNMP_COMMUNITY = "public" ;
$SNMP_TRAP_COMMUNITY    = "public";

#Konstanten fuer die DPI-Kommunikation
$GROUPID        = "1.3.6.1.3.100.7.1.";
$OID            = "1.3.6.1.3.100.7.1";
$DESCRIPTION    = "BeispielSubagent";

########################################################
# Definition globaler Variablen
########################################################
$AGENT_HOST     = "sunhegering8" ;      # Host des Agenten

########################################################
# Initialisierungsroutine fuer die MIB-Variablen, die 
# der Subagent anbietet.
########################################################
sub initial_MIB
        {
        $MIB{'1.0'} = "02";     # Variable 1: Text
        $MIB{'2.0'} = "81";     # Variable 2: Integer
        $MIB{'3.1.1.0'} = "02";        # Tabelle Feld 1: Text
        $MIB{'3.1.2.0'} = "81";        # Tabelle Feld 2: Integer

        # sortierte Liste der MIB-Variablen:
        @MIB = sort by_hierarchy keys(%MIB);   

&Subagent;    # Starte den Subagenten

Die einzigen Anpassungen, die erforderlich sein sollten, sind das Vorbelegen folgender globaler Variablen:

Alleine mit diesen Angaben würde sich der Subagent schon beim Agenten anmelden und sich registrieren können. Er würde Requests empfangen, könnte aber noch nicht korrekt darauf reagieren. Dazu muß dem Subagenten auch die MIB, die er zur Verfügung stellen soll, bekanntgemacht werden. Dies geschieht in der Funktion

initial_MIB.

Ein Beispiel für eine solche Funktion findet man in dem obigen Listing. Zu beachten sind einige Dinge:

Mit dieser zusätzlichen Angabe kann der Subagent schon Anfragen des Agenten auf Korrektheit bezüglich des Types und der Verfügbarkeit von angeforderten Varibalen überprüfen.

Nun muß man die MIB in If-then-else Kaskaden abbilden. Dabei werden zwei solcher Kaskaden benötigt. Die eine bildet die Variablen, die mit GET oder GETNEXT gelesen werden können, auf entsprechende Funktionen ab. Die andere bildet Variablen, die gesetzt werden können, auf entsprechende SET-, COMMIT- und UNDO-Funktionen ab. Dabei stehen Variablen, die geschrieben und gelesen werden können natürlich in beiden Kaskaden. Diese Kaskaden sind in den beiden Dateien mib_gets.pl und mib_sets.pl anzugeben. Die zwei Dateien zu unserem obigen kleinen Beipiel befinden sich auf Seite [*] und [*] im Anhang. In diesen Dateien erkennt man schnell die If-then-else-Kaskaden, die abhängig von der gewünschten Instanz eine externe Funktion aufrufen. Zum Anpassen eines eigenen Subagenten ist es nur erforderlich, die jeweils gewünschte Anzahl von else-Zweigen in die Datei einzufügen. Dabei kopiert man am schnellsten einen anderen Zweig. In dem Zweig sind dann die Bedingung (also die Instanz-ID) und die aufzurufende Funktion anzupassen. Die Kaskade in der Datei mib_sets.pl unterscheidet sich von der in der Datei mib_gets.pl noch dadurch, daß jeder Zweig wieder in drei Fälle zerlegt wird. Jeder dieser Zweige repräsentiert dabei eine Set, Undo oder Commit-Funkiton für die jeweilige Variable (oder Instanz).

Die letzte eigentliche Arbeit steckt nun darin, die einzelnen externen Funktionen zu schreiben. Empfehlenswert ist hier, die einzelnen Funktionen nach Typ in den Dateien sub_gets.pl,
sub_sets.pl,sub_coms.pl und sub_undos.pl unterzubringen. Hierfür sind einfache Funktionen für das Beispiel im Anhang ab Seite [*] angegeben.
Die Set-Funktion bekommt den gewünschten neuen Wert in einem Array von Bytes in hexadezimaler Darstellung. Für die Umsetzung in den jeweiligen Datentyp ist der Subagenten-Programmierer selbst verantwortlich. Als Beispiele sind die Umwandlung eines Arrays in einen Textstring und die Umwandlung eines vier Byte umfassenden Arrays in eine Integer-Zahl angegeben.

Dies war ein kleines Beispiel für einen einfachen Subagenten. Aus diesen Darstellungen sind hoffentlich die nötigen Schritte zur Erstellung eigener Subagenten unter PERL 5.0 hervorgegangen. Dabei ist zu bedenken, daß die eigentliche Aufgabe nicht in der Erstellung eines DPI-Subagenten lag, der für alle Anwendungen perfekt ist. Es sollte ein DPI-Subagent für das Skript LinkTest entstehen. Falls dieser nun so modular sein sollte, daß er ohne großen Aufwand auch führ andere Anwendungen angepaßt werden kann, so war dies durchaus Absicht, aber nicht erklärtes Ziel der Entwicklung.


next up previous contents
Next: Zusammenfassung Up: Entwicklung eines DPI-Subagenten in Previous: Gleichbleibendes Gerüst des Subagenten
Copyright Munich Network Management Team