Unterabschnitte

eisfair spezifische Skripte

eislib - Funktionen zur Steuerung des Userinterfaces

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

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

clrhome loescht den Bildschirm, so dass eine uebersichtlichere Anzeige moeglich ist (z.B. mehrseitige Anzeigen). Unter einem Webbrowser wird stattdessen eine horizontale Trennlinie angezeigt.

progress_bar

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.

Syntax

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

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:

--std
Ausgabe einer allgemeinen Meldung (Standard-Einstellung)
Dies sollte der Standardfall bei der Ausgabe von Meldungen sein. Ein Beispiel dafuer ist die Ausgabe von Statusmeldungen beim Starten eines Dienstes oder beim Verarbeiten einer geaenderten Konfiguration.

--stdbr
Ausgabe einer allgemeinen Meldung (Breit - Weiss )
Dies sollte der Standardfall bei der Ausgabe von Meldungen sein. Ein Beispiel dafuer ist die Ausgabe von Statusmeldungen beim Starten eines Dienstes oder beim Verarbeiten einer geaenderten Konfiguration.

--info
Ausgabe einer Information
Eine wichtige Information. Dieser Typ wird fuer die Hervorhebung wichtiger Informationsmeldungen verwendet. Dem Anwender wird damit das Ergebnis ,,es ist alles in Ordnung`` signalisiert.

--warn
Ausgabe einer Warnung
Warnungen werden mit dieser Option gesteuert. Eine Warnung signalisiert Probleme bei der Verarbeitung, wobei diese dennoch erfolgreich durchgefuehrt wurde.

Mit --warn kann der Anwender auch auf eine Gefahr aufmerksam gemacht werden (z.B. eine haeufige Fehlerquelle bei der Konfiguration eines Paketes).

--error
Ausgabe einer Fehlermeldung
Mittels der Formatierung --error wird eine klassische Fehlermeldung ausgegeben. Dies soll dem Anwender den Abbruch der Verarbeitung bzw. den Misserfolg einer Verarbeitung signalisieren.

--link
Ausgabe fuer einen Link (Farbe cyan)
Ausgabe eines Zeichen z.B. fuer einen Link '>'

--ok
Ausgabe einer [ OK ] Meldung
Mittels der Formatierung --ok wird eine OK Meldung ausgegeben. Die rechts am Rand der Arbeitsfläche plaziert ist und die Erfolgreiche Verarbeitung anzeigt.



 Create configuration ...                                                   [  OK  ] 
            


--fail
Ausgabe einer [ FAIL ] Meldung
Mittels der Formatierung --fail wird eine FAIL Meldung ausgegeben, die rechts am Rand der Arbeitsfläche plaziert ist und den Abbruch der Verarbeitung bzw. den Misserfolg einer Verarbeitung anzeigt.



 Create configuration ...                                                   [ FAIL ] 
            


Syntax

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.

echo_retval

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}"

techo

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:

Initialisierung

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.


Ausgabe der Tabellenzeilen

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.

Abschluss der Tabelle

Der Abschluss der Ausgabe einer Tabelle erfolgt mit techo --end.

Syntax

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


eistime

Ueber das Skript eistime werden Datum und Zeit in der ISO-8601-Notation systemweit zur Verfuegung gestellt.

Syntax

  ${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
# --------------------------------------------------------------------

refresh_screensize

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

check_screensize

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

inetlib - Funktionen fuer Parameter von Interfaces

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.

get_interfaces

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.

weitere get-Funktionen

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 :

configlib - Funktionen zum Handling der Konfigurationsdateien

Diese Bibliothek beinhaltet Funktionen zur Behandlung der eisfair Konfigurationsdateien.

Das Einbinden dieser Bibliothek erfolgt analog zur eislib:

# include configlib
. /var/install/include/configlib

printgpl

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

check

Bei einem erweiterten ,,Erweitertes update`` $package-update.sh Skript koennen auch die folgenden Header benutzt werden.

--check

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.

--check_exp

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.

--check_ext

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.

printgroup

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"

printcustomgroup

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.

printvar

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).

printend

Mit der Funktion printend() wird eine eisfair -Konfigurationsdatei abgeschlossen, d.h. es wird die Fusszeile ,,End``ausgegeben:

Beispiel:

printend

Weitere verfuegbare Skripte

/var/install/bin/ask

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

/var/install/bin/choose

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.

/var/install/bin/check-version

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

/var/install/bin/doc

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"

/var/install/bin/edit

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

/var/install/bin/add-menu

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

/var/install/bin/create-menu

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.

/var/install/bin/del-menu

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.

/var/install/bin/add-user

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

/var/install/bin/modify-user

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

/var/install/bin/remove-user

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

/var/install/bin/add-group

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

/var/install/bin/remove-group

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

/var/install/bin/install-local-package

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.

/var/install/bin/sort-menu

Dieses neue Skript erlaubt die alphabetische Sortierung von Menue-Eintraegen einer angegebenen Menuedatei.

 sort-menu menu-file-name

 menu-file-name     Name einer Menuedatei

/var/install/bin/check-package

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

/var/install/bin/check-folder

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"

/etc/init.d/functions

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

boot_mesg
Ausgabe einer allgemeinen Meldung
Dies sollte der Standardfall bei der Ausgabe von Meldungen sein. Ein Beispiel dafuer ist die Ausgabe von Statusmeldungen beim Starten oder Stoppen eines Dienstes. .



 * Starting foo ...
            


loadproc
Angabe des Programms das gestartet werden soll
killproc
Angabe des Programms das gestoppt werden soll

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  ] 
            


statusproc
Angabe des Programms für das der Status ausgegeben werden soll
.

Unhabhängig von load- killproc lassen sich auch die Ausgaben von [ OK ] [ FAIL ] [ WARN ] erzeugen.

echo_ok
Ausgabe von [ OK ]
.

echo_failure
Ausgabe von [ FAIL ]

echo_warning
Ausgabe von [ WARN ]

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