In eisfair gibt es die include-Bibliothek ,,eislib``. Darin werden verschiedene standardisierte Funktionen zusammengefasst. Die Funktionalitaet wurde gegenueber den bisher verwendeten Skripten deutlich erweitert.
Aus Kompatibilitaetsgruenden werden die alten Skripte fuer eine uebergangszeit weiterhin unterstuetzt. Die Verwendung von hier nicht dokumentierten Skripten in neuen Releases ist nicht mehr zulaessig.
Die eislib wird am Anfang des paketeigenen Skriptes durch folgenden Aufruf eingebunden:
# include eislib . /var/install/include/eislib
Beim Aufruf der Funktionen braucht nichts weiter beachtet zu werden.
Beispiel:
anykey
Hinweis
Es muss darauf geachtet werden, dass der Inhalt der
Variablen $IFS moeglichst umgehend nach deren
Benutzung immer auf den Ursprungswert zurueck gesetzt wird,
um eventuellen Stoerungen vorzubeugen.
Beispiel:
while read line
do
_ifs="$IFS" # Inhalt sichern
IFS=':' # Inhalt neu zuweisen
set - $line # Bearbeitung durchfuehren
IFS="$_ifs" # Inhalt wieder herstellen
if [ $3 -gt $gid -a $3 -lt 300 ] # ...
then
gid=$3
fi
done </etc/group
In eisfair Version 1.5.0 sind die im Folgenden aufgefuehrten Funktionen verfuegbar:
anykey wartet an der Konsole auf die Eingabe ,,ENTER``. Beim Aufruf unter einem Webbrowser wird der Aufruf von anykey ignoriert, d.h. es erfolgt keine Unterbrechung des Skript-Ablaufs.
An der Konsole darf anykey nur zum Anhalten einer Bildschirmausgabe (bessere Lesbarkeit) benutzt werden. Eine Verwendung zur Steuerung eines Ablaufs (Bitte Diskette Einlegen und Enter druecken) ist nicht mit webconf kompatibel!
clrhome loescht den Bildschirm, so dass eine uebersichtlichere Anzeige moeglich ist (z.B. mehrseitige Anzeigen). Unter einem Webbrowser wird stattdessen eine horizontale Trennlinie angezeigt.
Mittels progress_bar kann man auf der Konsole einen Fortschrittsbalken anzeigen. So kann der Anwender bei laengeren Verarbeitungen ueber den aktuellen Status auf dem Laufenden gehalten werden. Im Webbrowser erfolgt keine Anzeige.
progress_bar [--tty|--html|--file] current_step total_steps
options:
| --tty | use console colors |
| --html | use html tags for colors |
| --file | don't use any color tags |
Als current_step wird der aktuelle Stand der Verarbeitung angegeben, total_steps ist die Gesamtzahl der durchzufuehrenden Verarbeitungsschritte. Um die Anzeige zu aktualisieren wird progress_bar einfach erneut aufgerufen, ohne dass zwischenzeitlich eine eigene Ausgabe erfolgt ist. Es wird dann die alte Anzeige mit dem neuen Fortschrittsbalken ueberschrieben.
Anzeigebeispiel (progress_bar 17 26):
65% [================================> ] 17 / 26
mecho dient zur Ausgabe von Meldungen. Dabei kann als Parameter angegeben werden, welche Formatierungen verwendet werden sollen. Die Ausgabe erfolgt angepasst an die Aufrufvariante (Konsole oder HTML unter der Kontrolle eines Webbrowsers).
Derzeit werden folgende Formatierungen unterstuetzt:
Mit --warn kann der Anwender auch auf eine
Gefahr aufmerksam gemacht werden (z.B. eine haeufige
Fehlerquelle bei der Konfiguration eines Paketes).
|
Create configuration ... [ OK ]
|
|
Create configuration ... [ FAIL ]
|
mecho [-n] [--std|--stdbr|--info|--warn|--error|--link] [--tty|--html|--file] message ...
options:
| -n | do not append newline |
| --std | print standard message (default) |
| --stdbr | print standard message (default - breit) |
| --info | print info message |
| --warn | print warning message |
| --error | print error message |
| --link | print message in - cyan |
| --ok | print message [ OK ] |
| --fail | print message [ FAIL ] |
| --tty | use console colors |
| --html | use html tags for colors |
| --file | don't use any color tags |
Beispiel für OK und FAIL mit der Möglichkeit zur Fehlerbehandlung.
mecho --std " Create configuration ... "
_do_foo
retval="${?}"
if [ "${retval}" -eq 0 ]
then
mecho --ok
else
mecho --fail
_do_bar
fi
Tipp für fortgeschrittene Entwickler
Mit den Optionen [--tty|--html|--file] kann die
automatische Erkennung der Ausgabe-Umgebung gezielt ausgeschaltet
werden. Man kann so bei einem manuellen Aufruf von der Konsole
einfach den HTML-Code erzeugen.
Die Funktion 'echo_retval' liefert, in Abhaengikeit vom Rückgabewert, [ OK ] oder [ FAIL ].
Beispiel für OK und FAIL ohne Eingriff für die Fehlerbehandlung.
mecho --std " Create configuration ... "
_do_foo
retval="${?}"
echo_retval "${retval}"
Tabellen koennen mit Hilfe von techo bequem formatiert werden. Wie die anderen Funktionen der eislib funktioniert die Ausgabe von Tabellen sowohl an der Konsole als auch unter einem Webbrowser.
Dabei erfolgt die Ausgabe der Tabelle in drei Phasen:
Bei der Initialisierung techo --begin wird eine Liste der Spaltenbreiten uebergeben. Diese sind in Zeichen anzugeben; bei der html-Ausgabe werden diese prozentual beruecksichtigt.
Die Summe aller Spaltenbreiten einer Tabelle darf 80 nicht uebersteigen, da sonst die Ausgabe auf dem Bildschirm nicht sichergestellt ist. In diesem Fall wird techo mit einer Fehlermeldung abgebrochen, die Zahlen muessen in ' ' eingefasst werden, damit ein expandieren vom '*' in der shell verhindert wird. Ab der eisfair base Version 1.5.3 ist die Spaltenbreite bei techo --file beliebig.
Tipp für fortgeschrittene Entwickler
Fuer jede Spalte kann angegeben werden, ob diese rechts- oder
linksbuendig ausgerichtet sein soll. Dazu wird der Spaltenbreite
einfach ein ,,r`` bzw. ein ,,l`` angefuegt.
Ausserdem koennen Spalten mit variabler Breite definiert werden indem
bei der Definition ein ,,*`` angefuegt wird.
Jede Tabellenzeile wird mittels techo --row ausgegeben. Danach folgt eine Liste der einzelnen Spalteninhalte. Die gesamte Zeile oder auch jede Zelle kann in einer der vordefinierten Farben ausgegeben werden.
Fuer die Formatierung der gesamten Zeile muss die Angabe zwischen den Schluesselwoertern techo und --row erfolgen. Fuer einzelne Zellen muss die Formatierung dieser vorangestellt werden.
Die Parameter zur Steuerung der Formatierung sind unter der Funktion mecho beschrieben.
Der Abschluss der Ausgabe einer Tabelle erfolgt mit techo --end.
techo [--tty|--html|--file] --begin width[align] width[align] ...
techo [--tty|--html|--file] [--std|--stdbr|--info|--warn|--error|--link] --row
[--std|--stdbr|--info|--warn|--error|--link] message
...
techo [--tty|--html|--file] --end
options:
| --tty | use console colors |
| --html | use html tags for colors |
| --file | don't use any color tags |
message-options:
| --std | print standard message (default) |
| --stdbr | print standard message (default - breit) |
| --info | print info message |
| --warn | print warning message |
| --error | print error message |
| --link | print message in - cyan |
Beispiel:
techo --begin '3 3r 15 10 28* 20'
techo --row '''' 1 foo foo ''This is a somehow longer text, since I need a very long line of text'' foo
techo --row ''->'' 2 --info ''bar foo'' --warn ''foo bar'' foo
techo --row '''' 12 foofoo foo foo --error foobar
techo --info --row '''' 24 foo foobar foo --error foobar
techo --end
Tipp für fortgeschrittene Entwickler
Die Funktionen der eislib funktionieren nicht nur auf der Konsole
und unter einem Webbrowser, sondern auch bei der Umleitung der
Ausgabestroeme in eine Datei oder Variable.
Beispiel:
(
techo --begin '4 40'
techo --row "" "Zeile 1"
techo --row "" "Zeile 2"
techo --row "->" "Zeile 3"
techo --row "" "Zeile 4"
techo --end
) >/tmp/foo.txt
Ueber das Skript eistime werden Datum und Zeit in der
ISO-8601-Notation systemweit zur Verfuegung gestellt.
| ${EISDATE} | = | 2006-04-25 | |
| ${EISTIME} | = | 21:16:38 |
Beispiel:
cat >${HOSTS_HFAXD_FILE} <<EOF
# --------------------------------------------------------------------
# hosts.hfaxd file generated by ${PACKAGE_NAME} version: ${VERSION}
#
# Do not edit this file, edit ${CONFIG_FILE}
# Creation Date: ${EISDATE} Time: ${EISTIME}
# --------------------------------------------------------------------
EOF
Ergibt:
# -------------------------------------------------------------------- # hosts.hfaxd file generated by eisfax version: 1.1.20 # # Do not edit this file, edit /etc/config.d/eisfax # Creation Date: 2006-04-25 Time: 21:16:38 # --------------------------------------------------------------------
Die Funktion 'refresh_screensize' wird mit dem laden der eislib ausgeführt und kann jeder Zeit wieder aufgerufen werden.
Der Rückgabewert ist: _EISLIB_SCREENSIZE_X actual number of screen columns _EISLIB_SCREENSIZE_Y actual number of screen lines
Die Funktion 'check_screensize' üeberprüft die grösse des Terminal. Der Rückgabewert von 1 bedeutet ein zu kleines Terminal.
Default: _EISLIB_SCREENSIZE_X_MIN = 80 _EISLIB_SCREENSIZE_Y_MIN = 24 _EISLIB_SCREENSIZE_Y_FILE = 999999
| get_interfaces() | get list of interfaces |
| get_interface() | get name of interface |
| get_ipaddr() | get IP address of interface |
| get_netmask() | get Netmask of interface |
| get_broadcast() | get Boadcast address of interface |
| get_network() | get Network of interface |
Diese Funktionen dienen dazu, die aktuellen Parameter eines Interfaces (z.B. eth0, eth1 oder auch ppp0) zu ermitteln.
Eigentlich stehen diese Angaben ueber die entsprechenden Variablen
IP_ETH_%_NAME
IP_ETH_%_IPADDR
IP_ETH_%_NETWORK
IP_ETH_%_NETMASK
aus der Konfigurationsdatei /etc/config.d/base zur Verfuegung.
Werden die Parameter fuer Interfaces aber dynamisch vergeben (z.B. bei dhcp oder beim DSL Paket fuer ppp0), so stimmen die Angaben aus /etc/config.d/base nicht mehr mit den aktuellen Parametern der Interfaces ueberein.
Die aufgefuehrten Funktionen ermitteln die Parameter, indem sie die Ausgabe des Befehls ifconfig auswerten.
Die Funktion get_interfaces gibt eine Liste der Interfaces zurueck. Dabei werden nur solche Interfaces ermittelt, die mit eth oder ppp beginnen. Das Loopback-Interface lo ist z.B. nicht in der Liste beinhaltet.
Beispiel:
IF=`get_interfaces` mecho --info "Vorhandene Interfaces $IF"
Ausgabe ist beispielsweise:
Vorhandene Interfaces eth0 eth0:0
Hier wird die Liste der vorhandenen Interfaces ausgegeben.
Die weiteren Funktionen geben die entsprechenden Parameter eines Interfaces aus. Als Parameter kann entweder die Nummer der IP_ETH_%-Variablen aus /etc/config.d/base angegeben werden oder der Name eines Interfaces.
Fuer get_interface macht natuerlich nur die Nummer einen Sinn.
Aufrufe (hier fuer get_ipaddr):
get_ipaddr 1
Hier wird die aktuelle IP-Adresse des Interfaces ausgegeben, welche ueber IP_ETH_1_NAME identifiziert wird. Ist IP_ETH_1_NAME leer, so wird das Interface eth0 genutzt. Achtung: eth0 und nicht eth1.
get_ipaddr eth0:0
Hier wird die aktuelle IP-Adresse des Interfaces eth0:0 ausgegeben.
Existiert ein angegebenes Interface nicht, so wird kein Text bzw. leerer Text ausgeben. Dies gilt auch bei ungueltigem Parameter, wie z.B. ett4.
Ein umfangreicheres Beispiel:
# include eislib
. /var/install/include/eislib
# include inetlib
. /var/install/include/inetlib
# Test the library
mecho --info "Test inetlib functions"
mecho "The interfaces are retrieved using get_interfaces."
mecho
for VAL in $(get_interfaces)
do
mecho --info "Working for interface: $VAL"
mecho "IP address: $(get_ipaddr $VAL)"
mecho "Netmask : $(get_netmask $VAL)"
mecho "Broadcast : $(get_broadcast $VAL)"
mecho "Network : $(get_network $VAL)"
mecho
done
mecho --info "Check function get_interface"
mecho "Use parameter 1, 2 and bad"
mecho
for VAL in 1 2 bad
do
mecho --info "Working for interface: $VAL"
mecho "Interface $VAL : $(get_interface $VAL)"
done
Hier wird die Liste der Interfaces ermittelt und zu jedem Interface werden alle Parameter ausgegeben.
Ausgabe kann beispielsweise sein:
Test inetlib functions The interfaces are retrieved using get_interfaces. Working for interface: eth0 IP address: 192.168.1.252 Netmask : 255.255.255.0 Broadcast : 192.168.1.255 Network : 192.168.1.0 Working for interface: eth0:0 IP address: 192.168.1.251 Netmask : 255.255.255.0 Broadcast : 192.168.1.255 Network : 192.168.1.0 Check function get_interface Use parameter 1, 2 and bad Working for interface: 1 Interface 1 : eth0 Working for interface: 2 Interface 2 : eth0:0 Working for interface: bad Interface bad :
Diese Bibliothek beinhaltet Funktionen zur Behandlung der eisfair Konfigurationsdateien.
Das Einbinden dieser Bibliothek erfolgt analog zur eislib:
# include configlib . /var/install/include/configlib
Die Funktion printgpl() gibt einen GPL-Header fuer eine eisfair -Konfigurationsdatei aus.
Beispiel:
printgpl --conf \
"foo" \
"2005-03-25" "frank" \
"2001-2011 the eisfair team, team(at)eisfair(dot)org"
Im Beispiel wird der GPL-Header fuer das angegebene Paket ausgegeben.
printgpl [Options] PACKAGE CREATED CREATOR COPYRIGHT
Options:
[--conf] - print the GPL Header for config
[--check] - print the GPL Header for check
[--check_exp] - print the GPL Header for check.exp
[--check_ext] - print the GPL Header for check.ext
PACKAGE - Name of the package
CREATED - Package creation Date
CREATOR - Original package author
COPYRIGHT - Copyright String (optional) wenn nicht gesetzt default:
"Copyright (c) 2001-2011 the eisfair team, team(at)eisfair(dot)org"
Das sieht dann in unserem Beispiel so aus:
Beispiel:
# ----------------------------------------------------------------------- # /etc/config.d/foo - configuration file for foo # # Creation: 2005-03-25 frank # Last Update: 2006-02-10 max # # Copyright (c) 2001-2011 the eisfair team, team(at)eisfair(dot)org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -----------------------------------------------------------------------
Bei einem erweiterten ,,Erweitertes update`` $package-update.sh Skript koennen auch die folgenden Header benutzt werden.
Der Parameter --check gibt einen GPL-Header fuer eine eisfair -check-datei aus.
Beispiel:
printgpl --check \
"foo" \
"2005-03-25" "frank" \
"2001-2011 the eisfair team, team(at)eisfair(dot)org"
Beispiel:
# ----------------------------------------------------------------------- # /etc/check.d/foo - eischk file for foo # # Creation:
Im Beispiel wird der GPL-Header fuer das angegebene Paket ausgegeben.
Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl.
Der Parameter --check_exp gibt einen GPL-Header fuer eine eisfair -check.exp-datei aus.
Beispiel:
printgpl --check_exp \
"foo" \
"2005-03-25" "frank" \
"2001-2011 the eisfair team, team(at)eisfair(dot)org"
Beispiel:
# ----------------------------------------------------------------------- # /etc/check.d/foo.exp - eischk exp file for foo # # Creation:
Im Beispiel wird der GPL-Header fuer das angegebene Paket ausgegeben.
Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl.
Der Parameter --check_ext gibt einen GPL-Header fuer eine eisfair -check.ext-datei aus.
Beispiel:
printgpl --check_ext \
"foo" \
"2005-03-25" "frank" \
2001-2011 the eisfair team, team(at)eisfair(dot)org"
Beispiel:
# ----------------------------------------------------------------------- # /etc/check.d/foo.ext - eischk ext file for foo # # Creation:
Im Beispiel wird der GPL-Header fuer das angegebene Paket ausgegeben.
Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl.
Mit der Funktion printgroup() kann man einen Gruppenheader fuer eine eisfair -Konfigurationsdatei erzeugen. Dabei kann nach dem Gruppennamen noch optional ein Kommentar angegeben werden:
Beispiel:
printgroup "Simple group" printgroup "General settings" "General settings for configuration"
Beispiel: Fuer eine Zeile
# ----------------------------------------------------------------------- # Simple group # -----------------------------------------------------------------------
Beispiel: Fuer eine Zeile mit Kommentar
# ----------------------------------------------------------------------- # General settings # general settings for eisfair configuration # -----------------------------------------------------------------------
Standard ist vor und nach dem Gruppenheader jeweils eine Leerzeile.
Diese Leerzeile kann gesteuert werden. Dafuer gibt es die folgenden Parameter. Hierbei laesst sich durch Angabe von '0' die Leerzeile auch unterdruecken.
Parameter:
-b x print x newline before Groupheader -a x print x newline after Groupheader
Beispiel:
printgroup -b 0 "Simple group" printgroup -b 2 -a 0 "General settings" "General configuration settings"
Mit der Funktion printcustomgroup() kann man einen Gruppenheader fuer eine eisfair -Konfigurationsdatei erzeugen und einen mehrzeiligen Kommentar angeben:
Beispiel:
printcustomgroup 'General settings' << !EOC comment line comment line comment line !EOC
Beispiel:
# ----------------------------------------------------------------------- # General settings # # more comment # more comment # etc # -----------------------------------------------------------------------
Standard ist vor und nach dem Gruppenheader jeweils eine Leerzeile.
Diese Leerzeile kann gesteuert werden. Dafuer gibt es die folgenden Parameter. Hierbei laesst sich durch Angabe von '0' die Leerzeile auch unterdruecken.
Parameter:
-b x print x newline before Groupheader -a x print x newline after Groupheader
Beispiel:
printcustomgroup -b 0 'General settings' << !EOC comment line comment line comment line !EOC
Wenn dieser mehrzeilige Kommentar tabellarisch gestaltet werden soll und dabei am Zeilenanfang Leerzeichen vorkommen, muessen diese am Beginn der Zeile mit der '#' Raute geschuetzt werden.
Die Funktion printvar() dient zur formatierten Ausgabe von Konfigurationsvariablen und Kommentaren, sofern eine eisfair -Konfigurationsdatei selbst geschrieben werden muss.
Beispiel:
printvar 'FOO_VARIABLE' "This is a simple Variable" printvar '' "This is a comment without a Variable" printvar 'FOO_ARRAY_'$idx'_OPTION' "Simple printing of Arrays"
Als Beispiel sind hier drei gaengige Aufrufvarianten angegeben. Als erstes die einfache Ausgabe einer Variable mit einem Kommentar. Sollte die Variable FOO_VARIABLE den Inhalt ,,foobar`` haben, so sieht die Ausgabe wie folgt aus:
FOO_VARIABLE='foobar' # This is a simple Variable
Das Kommentarzeichen ,,#`` wird dabei unabhaengig von der Laenge des Variablennamens und des Inhalts immer an Position 39 ausgegeben. Sollten der Variablenname und der Inhalt laenger als 37 Zeichen sein, so wird der Kommentar automatisch in der Folgezeile an Position 39 ausgegeben.
Um laengere Kommentare mehrzeilig ausgeben zu koennen, kann printvar auch ohne einen Variablennamen aufgerufen werden. Es wird dann nur der uebergebene Kommentar ab Position 39 ausgegeben. Das ist im zweiten Beispiel dargestellt.
Auch Variablenfelder koennen einfach mit printvar ausgegeben werden, dazu ist einfach der Variablenname inclusive des Zaehlers an printvar zu uebergeben (Beispiel 3).
Mit der Funktion printend() wird eine eisfair -Konfigurationsdatei abgeschlossen, d.h. es wird die Fusszeile ,,End``ausgegeben:
Beispiel:
printend
Das Skript ask dient zur interaktiven Abfrage einer Eingabe. Aus diesem Grund darf dieses Skript nicht im Zusammenhang mit webconf verwendet werden!
/var/install/bin/ask [tty [color]] QUESTION [DEFAULT] [PATTERN] [PATTERN] ...
QUESTION - Question to be asked.
DEFAULT - Default answer.
PATTERN - Possible answers:
empty - y(es) or n(o)
* - string input
+ - string input (not empty!)
min-max - numerical input (range given)
WORD|WORD - a list of possible values
the first will be included into the question
the last will be returned if choosen
WORD=WORD - a list of possible values
all will be included into the question
the first will be returned if choosen
^$ - ENTER
Return Values:
Exitcode: Zero-Based Index of the Choosen PATTERN
255 ask was aborted by typing CTRL-C
Output: If Output is redirected, the output is either a part
of the matching pattern (if PATTERN is given) or the
entered text
Beispiele:
ask "Kernel loeschen" ask "Kernel loeschen" "no" ask "Cronzyklus" "" "d|daily" "w|weekly" "m|monthly" ask "Hostname" "eistest" "*" ask "Hostname" "" "+" >result answer=`ask "Weiter" "y"` ask "Anzahl" "3" "1-7" >result answer=`ask "Select" "" "1-15" "^$=Return" "0=Exit"` ask $_EISLIB_PRINTMODE $_EISLIB_COLOR_TTY_INFO "Kernel loeschen" "no"
Um den Rueckgabewert von 'ask' bei einem Abruch mit CTRL-C abfangen zu koennen, hat sich die folgende Variante bewaehrt:
_ask_file=`/bin/mktemp -t ask.XXXXXXXXX
/var/install/bin/ask "Select" "" "1-8" "^$=Return" "0=Exit" >${_ask_file}
rc=${?}
answer=`cat ${_ask_file}
rm -f ${_ask_file}
# if ask break, ask returned 255
if [ ${rc} = 255 ]
then
answer=0
fi
case "${answer}" in
'')
exit 0
;;
0)
exit 127
;;
*)
tue das andere
;;
esac
Ueber den Aufruf von choose kann eine Auswahlliste dargestellt werden. choose uebernimmt dazu die gesamte Oberflaechendarstellung.
Sofern im Environment SCROLL=''yes'' gesetzt ist, wird auf das Blaettern verzichtet. Es werden dann immer alle Zeilen ausgegeben und der Anwender muss manuell scrollen.
In diesem Fall sind verschiedene der obigen Features natuerlich nicht verfuegbar.
choose kann nicht in Verbindung mit webconf genutzt werden.
Syntax:
/var/install/bin/choose ARRAY [START_POSITION]
Die uebergabe der Daten an choose erfolgt analog der eisfair Konfigurationsdateien als mehrdimensionales Array. Hierfuer wird im Folgenden MYARRAY verwendet.
Neben den eigentlichen Inhalten muessen folgende Werte uebergeben werden:
Beispiel:
MYARRAY_TITLE="Mein Titel" # Titelzeile MYARRAY_SUBTITLE="Untertitel" # optional ein Untertitel MYARRAY_QUESTION="Select Item" # Frage MYARRAY_COLS="10 32r 10*" # Spaltendefinition (analog techo) MYARRAY_ROWS=345 # Anzahl Zeilen
Bei der Spaltendefinition darf die erste Spalte mit den Auswahlnummern nicht mit angegeben werden. Diese wird von choose automatisch generiert.
Die Inhalte werden als Array uebergeben:
Beispiel:
MYARRAY_1_1="Test" MYARRAY_1_2="foo" MYARRAY_1_3="1234" MYARRAY_2_1="Beispiel" MYARRAY_2_2="bar" MYARRAY_2_3="5678"
Hier muss besonders darauf geachtet werden, dass die Anfuehrungszeichen korrekt gesetzt werden:
Beispiele:
eval MYARRAY_$row_1=\"foo\" eval MYARRAY_$row_1=\"'--info \"'foo bar foo bar'\"'\" eval MYARRAY_$row_1=\"'--warn \"'$FOOBAR'\"'\"
ACHTUNG
Alle Werte muessen per export an Subshells uebergeben
werden!
Nun kann choose aufgerufen werden:
Beispiel:
/var/install/bin/choose MYARRAY 89 > /tmp/choose.$$ rc=$? a=`cat /tmp/choose.$$` rm -f /tmp/choose.$$ [ $rc = 255 ] && exit 255
In diesem Beispiel wird mit der Anzeige direkt auf der Seite begonnen, auf der sich das im Array in Zeile 89 uebergebene Element befindet.
Rueckgabewerte:
"" Return ohne Auswahl; Ruecksprung in vorherige Ebene "1" - "9999" Ausgewaehltes Element "0" Ende; sofortiges Beenden der Anwendung
ueber die Angabe MYARRAY_ACTIVE=''no'' kann man einzelne Spalten aus der Auswahllsite ausblenden. Damit wird diese Spalte in der Auswahlliste nicht beruecksichtigt. Das ist z.B. bei jeglicher Art von Aufgabenlisten praktisch, da man so die bereits abgearbeiteten Punkte einfach aus der Liste entfernen kann, ohne diese komplett umsortieren oder gar neu aufbauen zu muessen.
Um auf jeder Seite wiederkehrende Spaltenueberschriften ausgeben zu koennen, werden diese per
Spaltenueberschriften
MYARRAY_CAPTION_1='--info "Spalte 1"' MYARRAY_CAPTION_2='--info "Spalte 2"'
uebergeben. Die Verwendung von Spaltenueberschriften ist optional.
Mittels MYARRAY_FLAGS koennen die folgenden optionalen Parameter uebergeben werden:
Bei der Angabe von --spread werden zwischen den einzelnen Zeilen jeweils eine Leerzeile ausgegeben und die gesamte Liste wird auf dem Bildschirm vertikal zentriert. Diese Funktion ist nur verfuegbar, wenn die gesamte Liste auf einer Seite dargestellt werden kann. Ansonsten wird dieser Parameter ignoriert und es erfolgt eine normale Ausgabe.
Mittels --indent 12 kann ein groesserer oder kleinerer linker Einzug angegeben werden.
Bei der Angabe von --showexit wird auf jeder Seite als letzter Punkt die Funktion ,,0`` ausgegeben:
--showexit
1. Gallia est omnis divisa in partes tres, quarum unam incolunt
2. Belgae, nostra Galli appellantur. hi omnes lingua, institutis,
3. legibus inter a Belgis Matrona et Sequana dividit. horum omnium
4. fortissimi sunt
0. Return
145. agmine proelio nostros lacessere coeperunt. Caesar suos a proelio
146. pabulationibusque prohibere. ita dies circiter quindecim iter
147. fecerunt, non amplius quinis aut senis milibus passuum interesset.
0. Exit
Um eigene Werte, die nicht angezeigt werden sollen, im Array abzuspeichern muss der Bereich MY (MYARRAY_MY_FOO) verwendet werden. Dadurch kann es zu keinen ueberschneidungen der Namen bei zukuenftigen Erweiterungen der uebergabestruktur kommen.
ueberprueft ein installiertes Paket auf seine Version
check-version package_name check_version check-version -diff version-1 version-2 package_name Paketname check_version Versionsnummer z.B. 1.0.1 Rueckgabewerte: new Abgefrage Version ist aelter als die installierte old Abgefrage Version ist neuer als die installierte installed Paket ist installiert not-installed Paket ist nicht installiert
Beispiel:
if [ "`/var/install/bin/check-version foo 1.0.0`" = "not-installed" ]
then
mecho --error "Required foo package not installed."
mecho --error "Installation aborted."
exit 1
fi
Zeigt die Dokumentation eines Paketes an. Dabei ist der komplette Pfad zur Dokumentationsdatei mit zu uebergeben.
doc file doc file message file Dateiname der Dokumentationsdatei message Kopfzeile
Beispiel:
/var/install/bin/doc /usr/share/doc/foo/foo.txt "View foo documentation"
Startet den Editor zum Editieren der Konfiguration
edit [--apply|--apply-stopstart] file
edit [--apply|--apply-stopstart] package message
--apply Aenderungen werden durch einen Restart sofort
uebernommen.
--apply-stopstart Im Gegensatz zum Schalter -apply wird der Dienst hier
erst gestoppt, dann wird die Konfiguration geschrieben
und erst dann erfolgt der erneute Start des Dienstes.
file Dateiname der Konfigurationsdatei
package Name des Paketes
message Kopfzeile
add-menu dient zur Erstellung eines Menueeintrages (Untermenue) fuer das Setup
add-menu [--menu] menu-file sub-menu-file comment
add-menu --script menu-file script-file comment
--menu Untermenue (<menu>-Tag) erstellen [default]
--script Skriptaufruf (<script>-Tag) anstelle des Untermenues
erstellen
menu-file Dateiname relativ zum Menueverzeichnis /var/install/menu
Der neue Eintrag wird an dieses Menue angefuegt.
sub-menu-file Dateiname relativ zum Menueverzeichnis /var/install/menu
Der neue Eintrag
<menu file="sub-menu-file">comment</menu>
wird am Ende des Menues "menu-file" angefuegt, sofern
ein solcher Eintrag noch nicht im Menue vorhanden ist.
script-file Dateiname relativ zu /var/install/bin oder absoluter Pfad
Der neue Eintrag
<script file="script-file">comment</script>
wird am Ende des Menues "menu-file" angefuegt, sofern
ein solcher Eintrag noch nicht im Menue vorhanden ist.
comment Text, der im Menue angezeigt werden soll
create-menu dient zum Anlegen einer komplett neuen Menuedatei
/var/install/bin/create-menu menu-file menu-title menu-file Dateiname relativ zum Menueverzeichnis /var/install/menu. menu-title Menuetitel der ueber dem Menue angezeigt werden soll.
del-menu dient zur Entfernung eines Menueeintrags aus dem Setup
del-menu menu-file sub-menu-file
del-menu menu-file script-file
menu-file Dateiname relativ zum Menueverzeichnis /var/install/menu
sub-menu-file Dateiname relativ zum Menueverzeichnis /var/install/menu
Die Zeile <menu file="sub-menu-file"> mit dem angegebenen
Untermenue wird aus dem Menue entfernt, sofern es diese
gibt.
script-file Dateiname relativ zu /var/install/bin oder absoluter Pfad
Die Zeile <script file="script-file">comment</script>
mit dem angegebenen Skriptaufruf wird aus dem Menue
entfernt, sofern es diese gibt.
Fuegt einen neuen Benutzer zum System hinzu. Wenn das Skript ohne Parameter aufgerufen wird, werden die Daten einzeln abgefragt. Zum Anlegen eines Benutzers ohne den Eingabedialog koennen folgende Parameter uebergeben werden:
add-user [-d|-l] user encrypted-password uid gid name home shell
-d zum erstellen eines Benutzers der sich ohne Passwort
anmelden darf
-l zum Sperren des Benutzerpasswortes
user Benutzername
encrypted-password Passwort in kodierter Form
uid Benutzer ID Nummer
gid Gruppen ID Nummer
name Beschreibung de Benutzers
home Basisverzeichnis des Benutzers
shell Kommandointerpreter des Benutzers
Beispiel fuer das Anlegen eines Benutzers:
/var/install/bin/add-user \
foo sdz8evwesdfs 2005 100 "User foo" /home/foo /bin/bash
Beispiel fuer das Anlegen eines Systembenutzers ohne Anmeldeberechtigung:
/var/install/bin/add-user \
firebird '*' 84 84 "Firebird SQL deamon" /var/firebird /bin/bash
Beispiel fuer das Anlegen eines Benutzers, der sich ohne Passwort anmelden darf:
/var/install/bin/add-user \
-d foo '' 2005 100 "User foo" /home/foo /bin/bash
aendert diverse benutzerspezifische Parameter, wie den Kommentar (-c), das Home-Verzeichnis (-d), das Ablaufdatum eines Benutzerkontos (-e), der Anzahl der Tage, nach denen das Benutzerkonto gesperrt wird (-f), die Benutzergruppe (-g) und die verwendete System-Shell (-s). Wird beim Aufruf des Skriptes keine Option angegeben, so wird ein Menue angezeigt, ueber welches die aenderungen interaktiv durchgefuehrt werden koennen.
modify-user
modify-user -c login-name comment
modify-user -d login-name home-directory [-m|-r]
modify-user -e login-name YYYY-MM-DD
modify-user -f login-name number-of-days
modify-user -g login-name group-name
modify-user -s login-name user-shell
login-name Loginname des zu bearbeitenden Benutzerkontos.
comment Kommentar.
home-directory Name des Home-Verzeichnises des Benutzers in /home.
Durch die zusaetzliche Angabe einer der folgenden
Optionen kann das Verhalten dieser Funktion beinflusst
werden.
-m - Das Ursprungsverzeichnis und dessen Inhalt wird
verschoben.
-r - Es wird ein neues Home-Verzeichnis angelegt und das
Ursprungsverzeichnis wird geloescht.
'' - Es wird ein neues Home-Verzeichnis angelegt, das
Ursprungsverzeichnis bleibt unveraendert erhalten.
YYYY-MM-DD Ablaufdatum des Benutzerkontos. Wird `never' eingegeben,
so kann das Benutzerkonto unbefristet genutzt werden.
number-of-days Anzahl der Tage nach denen ein Benutzerkonto deaktiviert
wird wenn dessen Kennwort abgelaufen ist. Bei Eingabe von
`0' geschieht dies umgehend, wird `never' eingegeben, so
wird diese Funktion deaktiviert.
group-name Name der Benutzergruppe.
user-shell Name der System-Shell
Entfernt einen Benutzer vom System. Systembenutzer koennen dabei nur durch Setzen des Schalters "-f"entfernt werden.
remove-user [-f] user do-remove-homedir -f Systembenutzer loeschen user Benutzername do-remove-homedir 'y' oder 'n' zum Loeschen des Basisverzeichnisses
Beispiel fuer das Entfernen eines Benutzers mit Loeschen des Basisverzeichnisses:
/var/install/bin/remove-user foo y
Beispiel fuer das Entfernen eines Systembenutzers ohne Loeschen des Basisverzeichnisses:
/var/install/bin/remove-user -f firebird n
Fuegt eine neue Gruppe zum System hinzu. Wenn das Skript ohne Parameter aufgerufen wird, werden die Daten einzeln abgefragt.
add-group group gid group Name der Gruppe gid Gruppen ID Nummer
Beispiel fuer das Anfuegen einer Gruppe:
/var/install/bin/add-group foo 2001
Entfernt eine Gruppe vom System. Systemgruppen koennen dabei nur durch Setzen des Schalters "-f" entfernt werden.
remove-group [-f] group -f Systemgruppe loeschen group Gruppenname
Beispiel fuer das Entfernen einer Gruppe:
/var/install/bin/remove-group foo
ueber dieses Skript ist es moeglich, interaktiv Pakete zu
installieren, die sich auf der lokalen Festplatte befinden, ohne dass
zuvor manuell eine eis-list.txt-Datei erstellt werden muss.
Nach Eingabe des Verzeichnisnamens, in dem sich die Paket- und
.info-Dateien befinden, wird dynamisch eine eis-list.txt-Datei
erzeugt, welche dann menuegefuehrt die Installation der Pakete
ermoeglicht. Das Skript merkt sich die zuletzt verwendeten
Verzeichnisse und bietet diese im interaktiven Modus zur Auswahl
an.
Zusaetzlich ist es moeglich, dem Skript ueber die Kommandozeile ein
Verzeichnis mitzugeben bzw. das Loeschen der temporaeren index.txt
oder eis-list.txt-Dateien auf Wunsch zu verhindern (-keep-all). Wer
diese Installationsfunktion fest in das existierende
eisfair-Installationsmenue aufnehmen moechte, kann dies ueber den
Switch '-add-menu' bewerkstelligen. Der Switch '-del-menu' entfernt
den Menueeintrag wieder.
Falls man das Skript nur fuer die Generierung der index.txt und
eis-list.txt-Dateien verwenden moechte, kann man ueber den Switch
'-no-install' den Aufruf der Installationsroutine verhindern.
Die verschiedenen Startvarianten im ueberblick:
install-local-package
oder
install-local-package [--keep-all][--no-install] Verzeichnisname
oder
install-local-package --add-menu
oder
install-local-package --del-menu
Optionen: --add-menu - Menueeintrag zum Installationsmenue hinzufuegen
--del-menu - Menueeintrag aus Installationsmenue entfernen
--keep-all - eis-list.txt und index.txt-Dateien nicht
loeschen
--no-install - Nach dem Generieren der eis-list.txt und
index.txt-Dateien das Installationsskript
nicht starten.
Dieses neue Skript erlaubt die alphabetische Sortierung von Menue-Eintraegen einer angegebenen Menuedatei.
sort-menu menu-file-name menu-file-name Name einer Menuedatei
Mit diesem Skript laesst sich ueberpruefen, ob ein Paket vorhanden ist. Ist das nicht der Fall, wird die Installation im Dialog eingeleitet.
Intern arbeitet dieses Skript mit 'check-version' zusammen.
Die Aufruf-Syntax
check-package
-p, --setpackage package_name
-v, --setversion package_version
msg_do_now write a message do now
Example: check-package -p perl -v 1.2.0 "SUBVERSION_TOOLS_USE_PERL"
Die Angabe von -v, --setversion ist nicht zwingend, es kann auch nur auf das Paket geprueft werden.
Beispiel fuer die Pruefung eines Paketes und das Auswerten des Rueckgabewertes.
Als Parameter dient in diesem Beispiel EISFAX_USER_1_PRN_INFO='yes' Fuer das Drucken der Information wird das Paket 'a2ps' benoetigt.
prn_info='${EISFAX_USER_1_PRN_INFO}'
case ${prn_info} in
yes)
/var/install/bin/check-package -p "a2ps" "EISFAX_USER_1_PRN_INFO"
case ${?} in
0)
: # alles OK (nun in die configfiles eintragen)
;;
*)
# nicht OK
# Paramneter zuruecksetzen
sed "s/^EISFAX_USER_1_PRN_INFO=.*/EISFAX_USER_1_PRN_INFO='no'/" \
/etc/config.d/eisfax >/tmp/CONFIG_FILE_TMP
mv /tmp/CONFIG_FILE_TMP /etc/config.d/eisfax
chmod 0600 /etc/config.d/eisfax
# Fehlermeldung ausgeben
mecho
mecho --info " EISFAX_USER_1_PRN_INFO="
mecho --info " a2ps
mecho --warn " was not installed and so"
mecho --warn " not added to the config files."
mecho --warn " Please solve that first"
mecho
anykey
;;
esac
;;
*)
: # nothing to do
;;
esac
Mit diesem Skript laesst sich ueberpruefen, ob ein Folder/Verzeichnis vorhanden ist. Ist das nicht der Fall, wird das Verzeichnis im Dialog angelegt.
Die Aufruf-Syntax:
check-folder
-f, --setfolder /x/y/z
msg_do_now write a message do now
Example:
check-folder -f /tmp/myfolder/attention "EISFAX_USER_${idx}_COPY_TO_PATH"
Dieses Skript stellt Funktionen fuer das Init-Skript bereit. Es wird analog der eislib in das Init-Skript eingebunden. Das benutzen der eislib im Init-Skipt ist nicht erwünscht.
Beispiel für ein Init-Script:
#!/bin/sh
# -----------------------------------------------------------------------
# /etc/init.d/foo - init script for foo
#
# Creation: 2010-12-30 hbfl
# Last Update: 2010-12-30 hbfl
#
# Copyright (c) 2001-2011 the eisfair team, team(at)eisfair(dot)org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# -----------------------------------------------------------------------
# include functions
. /etc/init.d/functions
# include configuration
. /etc/config.d/foo
_do_start ()
{
if ${forcestart:-false}
then
START_FOO=yes
fi
### check if starting foo is allowed
if [ "$START_FOO" = 'yes' ]
then
boot_mesg " * Starting foo ..."
loadproc foo
fi
}
_do_stop ()
{
boot_mesg " * Stopping foo ..."
killproc foo
}
_do_status ()
{
statusproc foo
}
_do_usage ()
{
echo "Usage: $0 [-q|--quiet] {start|forcestart|stop|restart}"
{
#--------------------------------------------------------------------------
# main
#--------------------------------------------------------------------------
while [ ${#} -gt 0 ]
do
case "${1}" in
-q|--quiet)
_quiet=true
shift
;;
*)
_action=${1}
shift
;;
esac
done
case "$(_action}" in
start)
_do_start
;;
forcestart)
forcestart=true
_do_start
;;
stop)
_do_stop
;;
restart)
_do_stop
sleep 3
_do_start
;;
status)
_do_status
;;
*)
_do_usage
exit 1
;;
esac
exit 0
Die Funktionen im Überblick
|
* Starting foo ...
|
Dabei wird automatisch das Ergebnis [ OK ] [ FAIL ] [ WARN ] am rechten Rand der Arbeitsfläche hinter der boot_mesg Ausgabe gesetzt.
Beispiel:
boot_mesg " * Starting foo ... "
loadproc foo
|
* Starting foo ... [ OK ]
|
Unhabhängig von load- killproc lassen sich auch die Ausgaben von [ OK ] [ FAIL ] [ WARN ] erzeugen.
Diese Ausgaben erfolgen jeweils eine Zeile Höher an den rechten Rand der Arbeitsfläche.
Beispiel:
boot_mesg " Do foo ... "
_do_foo
retval="${?}"
if [ "${retval}" -eq 0 ]
then
echo_ok
else
echo_failure
_do_bar
fi
Das Skript functions unterdrückt die Ausgaben auf die Console, wenn der Parameter _quiet=true gesetzt ist.
Yves Schumann 2012-02-05