NAME
Config::Manager::Base - Basis-Funktionalitaet fuer alle Tools
SYNOPSIS
use Config::Manager::Base
qw(
$SCOPE
GetList
GetOrDie
ReportErrorAndExit
);
use Config::Manager::Base qw(:all);
if (($host,$hostid,$hostpw) = &GetList([$ConfObj,]\@HOSTNAME,\@HOSTID,\@HOSTPW))
($host,$hostid,$hostpw) = &GetOrDie([$ConfObj,]\@HOSTNAME,\@HOSTID,\@HOSTPW);
&ReportErrorAndExit("Error Message");
&ReportErrorAndExit() unless (...);
DESCRIPTION
Dieses Modul uebernimmt die globale Initialisierung fuer ein Skript. Dies geschieht vollautomatisch durch Perl, zur Compile-Zeit, beim Laden des Moduls (durch die speziellen Funktionen "use" und "BEGIN()").
Das vorliegende Modul initialisiert die Module "Config::Manager::Conf" und "Config::Manager::Report" und setzt ausserdem den Signal-Handler fuer "Ctrl-C" auf "ignorieren". Dies ist unerlaesslich, damit das Schliessen der Log-Datei und das Loeschen aller temporaeren Dateien bei Programmende korrekt funktioniert.
Wichtig: Beim Aufruf aller Skripte kann zusaetzlich eine Option "-D
" (fuer "Define") angegeben werden. Die genaue Syntax lautet:
-DSECTION::VARIABLE=WERT oder
-DVARIABLE=WERT
Falls keine Section angegeben ist, wird "DEFAULT" angenommen.
Im Unterschied zu den Konfigurationsdateien kann ein Leerstring hier ohne Anfuehrungszeichen angegeben werden:
-DSECTION::VARIABLE=
Optionen dieser Art werden noch vor dem eigentlichen Programmstart ausgewertet und anschliessend aus der Kommandozeile entfernt, so dass das ablaufende Skript sie gar nicht erst zu sehen bekommt und also im Skript keine entsprechenden Ausnahmefaelle beruecksichtigt zu werden brauchen.
Mit Hilfe dieses Mechanismus koennen bei einem Toolaufruf beliebige Konfigurationsparameter gesetzt oder ueberschrieben werden. Die Option "-D
" kann bei einem Toolaufruf auch mehrmals angegeben werden, um mehr als eine Konstante zu setzen.
Zusaetzlich koennen auch noch die folgenden Abkuerzungen verwendet werden:
Option Abkuerzung fuer Kommentar
--------- -------------------------- ----------------------
-OS390 -DHost::Platform=OS390 Zielplattform
-BS2000 -DHost::Platform=BS2000 Zielplattform
-DEVL -DHost::Environment=DEVL Entwicklungsumgebung
-TEST -DHost::Environment=TEST Testumgebung
-INTG -DHost::Environment=INTG Integrationsumgebung
-PROD -DHost::Environment=PROD Produktionsumgebung
Diese Optionen ueberschreiben waehrend der Programmausfuehrung die angegebenen Konfigurationskonstanten und heben die Wirkung der Umgebungsvariablen "PLATFORM" bzw. "HOSTENV", respektive, auf.
Die Praeferenzregeln sind dabei wie folgt:
Die niedrigste Praeferenz haben die in den Konfigurationsdateien hinterlegten Werte der beiden Konfigurationskonstanten "Host::Platform" und "Host::Environment".
Falls die Umgebungsvariablen "PLATFORM" oder "HOSTENV" definiert sind und einen der gueltigen Werte "OS390" oder "BS2000" bzw. "DEVL", "TEST", "INTG" oder "PROD" enthalten, so haben diese eine hoehere Praeferenz.
Die hoechste Praeferenz haben die auf der Kommandozeile angegebenen Optionen, wobei es gleichgueltig ist, ob jeweils die lange Form mit "-D
" oder die entsprechende Abkuerzung verwendet wird.
REQUIREMENTS
Alle Skripte muessen wie folgt aufgebaut sein:
#!perl -w
$running_under_some_shell = $running_under_some_shell = 0; # silence warning
package Config::<scope>::<toolname>;
use strict;
use vars qw( $var1 $var2 @var3 %var4 ... ); # optional
use Config::Manager::Base qw( ... );
<weitere "use"-Statements>
<eigentlicher Programmkode>
Zu Beginn des Skripts muss die folgende Zeile stehen:
#!perl -w
Diese Zeile wird von Perl bei der Installation der vorliegenden Module und Skripten automatisch angepasst (d.h. der Pfad des bei der Installation verwendeten Perls wird hier automatisch eingetragen).
Die Zeile
$running_under_some_shell = $running_under_some_shell = 0; # silence warning
direkt darunter, ganz zu Beginn des Skriptes sorgt dafuer, dass Warnungsmeldungen (die auf unterschiedlichen Plattformen wegen der obigen automatischen Anpassung des Pfades von Perl in der Zeile "#!perl -w
" unter unterschiedlichen Umstaenden auftreten koennen) unterdrueckt werden (deswegen auch der seltsam tautologische Aufbau dieser Zeile).
Das Tool-Skript muss danach eine Package-Deklaration enthalten:
package Config::<scope>::<toolname>;
Als Toolname ist der Skript-Filename ohne Extension zu verwenden (also z.B. "putmember" fuer das Skript "putmember.pl"). Derzeit sind die vorgesehenen Scopes beispielsweise "SPU", "Manager" oder "KM".
Der Scope "TEST" ist fuer die Regressionstests des Moduls "Config::Manager::Conf" reserviert, der Scope "Manager" fuer alle Basis-Module (zu denen es im Normalfall keine Skripte gibt).
Anhand der obigen Package-Deklaration wird bei Programmstart der jeweils richtige Scope automatisch erkannt. Der Scope gibt die Gruppe von Konfigurationsdateien an, die eingelesen werden sollen. So lassen sich unterschiedliche Saetze von Werkzeugen bauen, die alle dieselbe Basisfunktionalitaet benutzen, aber dennoch jeweils eigene (und von allen anderen Saetzen von Werkzeugen vollkommen unabhaengige) Konfigurationsdateien besitzen.
Fuer jeden Scope findet sich in der Datei "Conf.ini" eine entsprechende Section, die den weiteren Einleseweg von Konfigurationsdateien vorgibt. (Der "<scope>" in der "package"-Deklaration bestimmt direkt den Scope fuer den Aufruf der Methode "Config::Manager::Conf::init()".)
Die Package-Deklaration wird gefolgt von der Zeile
use strict;
und ggfs. (Beispiel!) von der Zeile
use vars qw( $var1 $var2 @var3 %var4 );
fuer globale Variablen, die nicht mit Hilfe von "my" als statisch deklariert werden koennen (z.B. weil sie exportiert werden sollen).
Diese beiden (und andere) Compiler-Pragmas muessen immer NACH einer eventuellen "package"-Deklaration stehen, da sie sonst unwirksam sind.
Anschliessend folgt die Zeile
use Config::Manager::Base qw(...);
die unbedingt die erste "use"-Anweisung (nach allen Compiler-Pragmas wie "use strict" usw.) sein MUSS.
Es folgen alle weiteren "use"-Statements (in beliebiger Reihenfolge) sowie der eigentliche Programmtext.
UTILITIES
($host,$hostid,$hostpw) = &GetList([$ConfObj,]\@...)
Diese Subroutine gibt eine Liste von Konfigurationswerten zurueck, entweder vom Default-Konfigurationsobjekt oder dem angegenen Konfigurationsobjekt.
Parameter: $ConfObj - Optional; Konfigurationsobjekt, so wie es von dem Modul Config::Manager::Conf zurueckgegeben wird. Wenn keins angegeben wird, wird das Objekt von Config::Manager::Conf::default() verwendet \@... - Eine Liste beliebiger Laenge, die Array-Referenzen enthaelt. Jedes Array besteht aus einem Section/Schluessel-Paar Rueckgabe: Die Rueckgabe der entsprechenden Werte der Section/Schluessel-Paare (evaluiert in dem Modul Config::Manager::Conf) wird in derselben Reihenfolge wie die uebergebenen Parameter zurueckgegeben Es wird eine leere Liste zurueckgegeben, sofern auch nur ein einziger Wert nicht gefunden werden kann. Eine entsprechende Fehlermeldung findet sich dann im Logfile und auf Halde. Beispiel: my($a, $b) = &GetList( [qw(SPECIAL WHOAMI)], [qw(Host HOST-ID)]);
($host,$hostid,$hostpw) = &GetOrDie([$ConfObj,]\@...)
Gleiche Syntax und Semantik wie GetList(), jedoch mit dem Unterschied, dass wenn auch nur ein Wert nicht gefunden werden kann, der Programmlauf mit einer entsprechenden Fehlermeldung beendet wird.
&ReportErrorAndExit("Error Message");
Wenn Meldungen zuvor auf Halde gelegt worden sind, so schreibt diese Funktion die Meldung vor Abbruch auf den Bildschirm (STDERR).
Danach schreibt die Funktion eine Fehlermeldung (sofern uebergeben) in das Log-File und auf den Bildschirm (STDERR) und beendet danach die Programmausfuehrung.
Als Parameter erwartet die Funktion optional eine Liste von Strings. Diese werden Zeilenweise zuerst in das Log-File und dann auf STDERR geschrieben. Wird kein Parameter uebergeben, so werden keine zusaetzlichen Fehlermeldungen (zusaetzlich zu den Meldungen von der Halde) auf dem Bildschirm ausgegeben.
Wenn keine Fehlermeldungen verfuegbar sind (weder auf Halde noch als Parameter uebergebene), so wird eine generische Fehlermeldung auf dem Bildschirm (STDERR) ausgegeben. Dem Modul "Config::Manager::Report" wird in diesem Fall mitgeteilt, dass es den Ort des Logfiles ausgeben soll (STDOUT), da das Logfile ggfs. noch Zusatzinformation enthaelt, die den aufgetretenen Fehler erkennen lassen.
Der Exit-Code des Programms wird auf 1 gesetzt.
HISTORY
2003_02_05 Steffen Beyer & Gerhard Albers Version 1.0
2003_02_14 Steffen Beyer Version 1.1
2003_04_26 Steffen Beyer Version 1.2