#!/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.