Unix-Validierungstools - Beschreibung sysvtools.pl

Das Perl-Programm sysvtools.pl ist ein Wrapper, dessen Verhalten abhängig ist vom Programmnamen, mit dem es aufgerufen wird. Während der Installation werden die zur Verfügung stehenden Programme als Hardlinks auf dieses Programm eingerichtet - das kann man natürlich auch manuell erledigen.

Die Hauptarbeit des Programms besteht darin, die Kommandozeilen-Optionen zu prüfen. Der eigentliche Tool-Ablauf besteht aus einer Handvoll Zeilen, da eigentlich nur der Konstruktor des Tools mit dem aufgebauten Optionen-Hash aufgerufen und dann die Methode run() des erzeugten Objekts gestartet werden muss.

Wer sich den Code anschaut, wird feststellen, dass ich zum Parsen der Optionen keines der in Perl verfügbaren Standardmodule nutze. Das hat natürlich Gründe (hatte ich schon erwähnt, dass ich wie jeder Programmierer faul bin und deshalb eigentlich lieber Vorhandenes nutze?):

Das Resultat ist also ein handgestrickter Optionen-Parser. Auf der Strecke geblieben ist dabei die Möglichkeit, Optionen zusammenzufassen, wie z. B. -rwx (Berechtigungen) für ckpath. Im Moment überlege ich noch, wie ich das implementieren kann, das Feature steht auf jeden Fall auf meiner ToDo-Liste.

Es gibt keine separaten Manual-Pages für jedes einzelne Tool. Ich habe sie zusammengefasst, das Manual für alle Tools ist mit man sysvtools zu erreichen.

sysvtools.pl - Programm zum Aufruf der Unix-SysV-Eingabevalidierungstools. Es wird mit dem Namen des zu startenden Tools aufgerufen.

  ckcont [-w width] [-h help] [-e error] [-p prompt] message

  ckdate [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-f format]
  errdate [-w width] [-e error] [-f format]
  helpdate [-w width] [-h help] [-f format]
  valdate [-f format] input

  ckgid [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-m]
  errgid [-w width] [-e error]
  helpgid [-w width] [-h help] [-m]
  valgid input

  ckint [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-b base]
  errint [-w width] [-e error] [-b base]
  helpint [-w width] [-h help] [-b base]
  valint [-b base] input

  ckitem [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-uno] [-f filename] [-l label] [-i invis [...]]
    [-m max] [choice [...]]
  erritem [-w width] [-e error] [choice [...]]
  helpitem [-w width] [-h help] [choice [...]]

  ckkeywd [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] keyword [...]

  ckpath [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-a|l] [-b|c|f|y] [-n|o[z]] [-rtwx]
  errpath [-w width] [-e error] [-a|l] [-b|c|f|y] [-n|o[z]] [-rtwx]
  helppath [-w width] [-h help] [-a|l] [-b|c|f|y] [-n|o[z]] [-rtwx]
  valpath [-a|l] [-b|c|f|y] [-n|o[z]] [-rtwx] input

  ckrange [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-b base] [-l lower] [-u upper]
  errange [-w width] [-e error] [-b base] [-l lower] [-u upper]
  helprange [-w width] [-h help] [-b base] [-l lower] [-u upper]
  valrange [-b base] [-l lower] [-u upper] input

  ckstr [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-l length] [[-r regexp] [...]]
  errstr [-w width] [-e error] [-l length] [[-r regexp] [...]]
  helpstr [-w width] [-h help] [-l length] [[-r regexp] [...]]
  valstr [-l length] [[-r regexp] [...]] input

  cktime [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-f format]
  errtime [-w width] [-e error] [-f format]
  helptime [-w width] [-h help] [-f format]
  valtime [-f format] input

  ckuid [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]] [-m]
  erruid [-w width] [-e error]
  helpuid [-w width] [-h help] [-m]
  valuid input

  ckyorn [-Q] [-w width] [-d default] [-h help] [-e error] [-p prompt]
    [-k pid [-s signal]]
  erryorn [-w width] [-e error]
  helyorn [-w width] [-h help]
  valyorn input

Diese Dokumentation beschreibt sysvtools.pl in der Version 0.3.

Die ck*-Tools zeigen eine Eingabeaufforderung an und validieren die Eingabe des Benutzers. Der Typ der erwarteten Eingabe ist abhängig vom ausgeführten Tool. Die einzelnen Tools definieren zusätzlich Hilfe- und Fehlermeldungen und Standard-Tasten zur Steuerung des Programmablaufs.

Die err*-Tools zeigen die definierte oder eine Standardfehlermeldung an.

Die help*-Tools zeigen den definierten oder einen Standardhilfetext an.

Die val*-Tools validieren die Eingabe entsprechend des Programm-Typs und der vorgegebenen Optionen und liefern einen dazu passenden Returncode zurück. Sie geben den Eingabewert nicht aus.

Alle Meldungen werden in einer Maximalbreite von 70 Zeichen je Zeile formatiert. Leerzeichen in der Definition einschließlich TAB und Zeilenumbrüche werden zusammengefasst. Die Ausgabebreite kann mit der -W-Option übersteuert werden. Eine Tilde am Anfang oder Ende der Definition bewirkt, dass an dieser Stelle der Standardtext eingefügt wird.

Bei Eingabe von '?' wird der Hilfetext angezeigt. Wenn der Benutzer 'a' eingibt (Abbruch), dann wird das Programm beendet, es sei denn, die Option -Q ist gesetzt.

Die Fehlermeldung wird angezeigt, wenn die Eingabe nicht dem Eingabetyp und den definierten Optionen entspricht.

ckcont
Dieses Tool ist eine Erweiterung zu den auf Unix-Systemen vorhandenen. Es zeigt einfach nur eine Eingabeaufforderung an und wartet auf die Eingabe von RETURN. Ich habe es zur Sammlung hinzugefügt, weil ich oft eine einfache Möglichkeit suchte, dem Benutzer die Gelegenheit zu geben, eine Programmausgabe zu lesen und dann fortzufahren.

ckdate
Die Eingabe muss ein Datum im definierten oder Standardformat sein.

ckgid
Es muss eine im System existierende Gruppe eingegeben werden.

ckint
Die Eingabe muss ein Integer sein, wahlweise zu einer definierten Zahlenbasis (Standard: 10). Die Ausgabe erfolgt immer zur Basis 10.

ckitem
Dieses Tool zeigt ein Menü mit einer Auswahl von definierten Menüpunkten an und erwartet die Eingabe entweder der Nummer oder des Namens eines oder mehrerer Menüpunkte. Defaultmäßig werden die Menüpunkte alphanumerisch sortiert und mit einer Nummer versehen, dieses Verhalten kann durch Optionen geändert werden. Sie werden in einer Liste mit 10 Menüpunkten je Seite angezeigt.

Wenn die Liste der Menüeinträge größer als 10 Zeilen ist, dann kann der Anwender mit RETURN vorwärts blättern oder die Anzeige der Liste mit CTRL-d beenden und zur Eingabeaufforderung wechseln. Bei Eingabe von '??' wird das Menü erneut ab Seite 1 angezeigt.

ckkeywd
Die Eingabe muss eines der definierten Schlüsselwörter sein.

ckpath
Es wird ein Pfadname als Eingabe erwartet, der den definierten Kriterien entspricht. Wenn keine Kommandozeilenoptionen angegeben sind, dann muss der Pfadname eine reguläre Datei sein, die nicht existiert.

ckrange
Die Eingabe muss ein Integer sein, wahlweise zu einer definierten Zahlenbasis (Standard: 10). Die Eingabe wird gegen die definierten oberen und unteren Grenzen geprüft. Wenn nur ein Grenzwert definiert wurde, dann wird auch nur gegen dieses Limit geprüft. Die Ausgabe erfolgt immer zur Basis 10.

ckstr
Die Eingabe muss ein String sein, der zu den definierten regulären Ausdrücken passt und nicht länger als die vorgegebene Maximallänge ist. Wenn keine regulären Ausdrücke vorgegeben sind, dann muss die Eingabe ein String mit der definierten Maximallänge sein, er darf keine führenden, eingebetteten oder abschließenden Leerzeichen enthalten. Wenn keine Maximallänge definiert ist, wird die Länge nicht überprüft.

cktime
Die Eingabe muss eine Uhrzeit im definierten oder Standardformat sein.

ckuid
Es muss ein im System existierender Benutzername eingegeben werden.

ckyorn
Die Eingabe muss 'ja' oder 'nein' entsprechen.

Die folgenden Kommandozeilenparameter werden von allen Tools unterstützt:

-Q
Legt fest, dass ein Abbruch ('a') nicht als gültige Eingabe gilt. Das ckcont Tool ignoriert diese Option, sie ist in diesem Fall unsinnig.

-W width
Gibt die maximale Zeilenbreite für die Eingabeaufforderung, Hilfe- und Fehlermeldungen an.

-d default
Definiert default als den Defaultwert. Der Defaultwert wird nicht validiert. Wenn der Benutzer RETURN eingibt und ein Defaultwert vorhanden ist, dann wird dieser Wert zurückgeliefert. Die Option wird für das ckcont-Tool ignoriert.

-e error
Definiert error als Fehlermeldung.

-h help
Definiert help als Hilfetext.

-p prompt
Definiert prompt als Eingabeaufforderung.

-k pid
Legt fest, dass ein Signal an den Prozess mit der ID pid geschickt wird, wenn der Benutzer 'Abbruch' wählt.

-s signal
Legt das Signal fest, dass beim Abbruch an den mit der -k-Option bestimmten Prozess gesendet wird. Wenn kein Signal vorgegeben wurde, wird SIGTERM geschickt. signal kann als Integer oder als Signalname angegeben werden.

Die folgende Option wird durch die *date-Tools unterstützt:

-f format
Legt das Format fest, gegen das die Eingabe validiert wird. Mögliche Formate und ihre Definitionen sind:
%b
abgekürzter Monatsname (jan, feb, mar)

%B
vollständiger Monatsname

%d
Tag im Monat (01 - 31)

%D
Datum im Format %m/%d/%y (das Defaultformat)

%e
Tag im Monat (1 - 31; einstellige Zahlen mit vorangestelltem Leerzeichen)

%h
abgekürzter Monatsname, identisch zu %b

%m
Nummer des Monats (01 - 12)

%y
Jahr ohne Jahrhundert (z. B. 08)

%Y
Jahr vierstellig (z. B. 2008)

Die folgende Option wird durch die *gid-Tools unterstützt:

-m
Zeigt in Fehler- und Hilfemeldungen eine Liste der vorhandenen Gruppen an.

Die folgende Option wird durch die *int-Tools unterstützt:

-b base
Definiert die Zahlenbasis der Eingabe. Mögliche Werte sind 2 .. 36, Default ist 10.

Die folgende Optionen werden durch die *item-Tools unterstüzt:

-f filename
Gibt eine Datei filename an, die die Liste der anzuzeigenden Menüpunkte enthält. Das Format der Zeilen ist: Menüpunkt<TAB>Beschreibung. Zeilen, die mit einem Hash (#) beginnen, gelten als Kommentare und werden ignoriert.

-i invis
Definiert unsichtbare Einträge, die nicht im Menü angezeigt werden. Die Angabe von 'all' z. B. ermöglicht die Eingabe dieses Menüpunktes als zulässige Auswahl, der Menüpunkt erscheint aber nicht in der Ausgabeliste. Diese Option kann mehrmals angegeben werden. Unsichtbare Menüpunkte sollten dem Anwender in der Eingabeaufforderung und im Hilfetext bekannt gemacht werden.

-l label
Definiert label als Überschrift in der Menüanzeige. Im Standard wird keine Überschrift angezeigt.

-m max
Legt die maximale Anzahl von Einträgen fest, die der Benutzer auswählen kann. Der Default ist 1.

-n
Legt fest, dass die Menüpunkte nicht alphabetisch sortiert werden.

-o
Legt fest, dass nur ein Menüeintrag zurückgeliefert wird.

-u
Legt fest, dass die Liste der Menüpunkte nicht nummeriert wird.

Die folgenden Optionen werden durch die *path-Tools unterstützt:

-a
Der Pfad muss absolut angegeben werden

-b
Der Pfadname muss ein Block-Device sein

-c
Der Pfadname muss ein Character-Device sein

-f
Der Pfad muss eine reguläre Datei sein

-l
Der Pfad muss relativ angegeben werden

-n
Der eingegebene Pfadname darf nicht existieren (muss neu sein)

-o
Der eingegebene Pfadname muss existieren (muss alt sein)

-r
Der Pfadname muss lesbar sein

-t
Der Pfadname muss anzulegen sein. Er wird angelegt, wenn er noch nicht existiert (siehe BUGS)

-w
Der Pfadname muss schreibbar sein

-x
Der Pfadname muss ausführbar sein

-y
Der Pfadname muss ein Verzeichnis sein

-z
Der Pfad muss eine Datei mit einer Größe von mehr als 0 Bytes sein

Die folgenden Optionen werden durch die *range-Tools unterstützt:

-b base
Definiert die Zahlenbasis der Eingabe. Mögliche Werte sind 2 .. 36, Default ist 10.

-l lower
Legt lower als untere Grenze der Eingabe fest. Default ist der größte negative Long Integer der Maschine. lower wird als Zahl zur Basis -b base interpretiert.

-u upper
Legt upper als obere Grenze der Eingabe fest. Default ist der größte positive Long Integer der Maschine. lower wird als Zahl zur Basis -b base interpretiert.

Die folgenden Optionen werden von den *str-Tools unterstützt:

-l length
Gibt die maximal erlaubte Länge der Eingabe an.

-r regex
Legt regex als regulären Ausdruck fest, gegen den die Eingabe validiert werden soll. Der Ausdruck kann Leerzeichen und Tabulatoren enthalten. Wenn mehrere Ausdrücke definiert sind, dann muss die Eingabe nur einem Ausdruck genügen.

Die folgende Option wird von den *time-Tools unterstützt:

-f format
Gibt das Format an, gegen das die Eingabe validiert wird. Mögliche Formate und ihre Beschreibung sind:
%H
Stunde (00 - 23)

%I
Stunde (00 - 12)

%M
Minute (00 - 59)

%p
Vor- oder nachmittags (am, pm)

%r
Zeit im Format %I:%M:%S %p

%R
Zeit im Format %H:%M (Defaultformat)

%S
Sekunden (00 - 59)

%T
Zeit im Format %H:%M:%S

Die folgende Option ist für die *uid-Tools gültig:

-m
Zeigt in Fehler- und Hilfemeldungen eine Liste der existierenden Benutzernamen an.

Der Returncode dieses Programms weicht in einigen Fällen von dem der Unix-Originale ab. Zum Teil konnte ich keine Erklärung für einige der Returncodes finden (z. B. für die Codes 2 und 4 in ckpath), in anderen Fällen (z. B. ungültiges Format in ckdate oder cktime, leere Auswahlliste für ckitem) führe ich alle Prüfungen innerhalb einer Methode durch und mache deshalb keine Unterschiede zwischen den Fehlersituationen.

Die folgenden Returncodes sind möglich:

0
Erfolgreiche Ausführung

1
Ungültiger Aufruf durch die getArgs-Methode entdeckt (z. B. ungültiger Programmname, ungültige Optionen, fehlende Optionsparameter)

2
Ungültiger Aufruf bei der Validierung im Modul JT::CLI::SysVTools entdeckt (ungültiges Datum- oder Zeitformat, ungültige Werte für Optionen, sich gegenseitig ausschließende Optionen); ungültige Eingabe für die val*-Tools.

3
Abbruch durch Benutzer (quit)

Zusammengefasste Optionen wie -rwx sind nicht möglich, solche Angaben liefern einen Fehler. Wenn die -t-Option für die *path-Tools angegeben wurde, wird die Datei nicht angelegt.

Wenn Ihr ein anderes "unerwünschtes Feature" in diesem Programm findet, dann schickt mir eine detaillierte Fehlermeldung. Eine Meldung in der Art "Das Programm funzt nicht" wird ignoriert ;-)

Ich habe versucht, alle möglichen Kombinationen von Optionen und das Verhalten der Programme möglichst umfassend gegen das der Originale auf einem Solaris10-Rechner zu testen, aber möglicherweise habe ich die eine oder andere Variante übersehen. Die Meldungskataloge, die mit dem Programm installiert werden, enthalten nicht vollständig die gleichen Meldungen wie die Originale. Das liegt zum Teil an Rechtschreibfehlern, die ich entdeckt und korrigiert habe (ich hoffe, dadurch sind nicht andere Fehler reingerutscht), zum Teil habe ich auch Texte geändert, die nach meiner Meinung missverständlich oder mehrdeutig waren. Wenn Ihr der Meinung seid, dass Texte korrigiert werden müssten, dann schreibt mir - oder besser: Nehmt Euch die Sourcen der Kataloge vor (sind im Installationspaket drin) und schickt mir die korrigierte Version zu.