9. eisfair spezifische Skripte¶
9.1. eislib - Funktionen zur Steuerung des Userinterfaces¶
In eisfair gibt es die include-Bibliothek „eislib“. Darin werden verschiedene standardisierte Funktionen zusammengefasst. Die Funktionalität wurde gegenüber den bisher verwendeten Skripten deutlich erweitert.
Aus Kompatibilitätsgründen werden die alten Skripte für eine Übergangszeit weiterhin unterstützt. Die Verwendung von hier nicht dokumentierten Skripten in neuen Releases ist nicht mehr zulässig.
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
möglichst umgehend nach deren Benutzung immer auf den Ursprungswert
zurück gesetzt wird, um eventuellen Störungen 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 aufgeführten Funktionen verfügbar:
9.1.1. 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 drücken) ist nicht mit webconf kompatibel!
9.1.2. clrhome¶
clrhome löscht den Bildschirm, so dass eine übersichtlichere Anzeige möglich ist (z.B. mehrseitige Anzeigen). Unter einem Webbrowser wird stattdessen eine horizontale Trennlinie angezeigt.
9.1.3. progress_bar¶
Mittels progress_bar
kann man auf der Konsole einen Fortschrittsbalken
anzeigen. So kann der Anwender bei längeren Verarbeitungen über den
aktuellen Status auf dem Laufenden gehalten werden. Im Webbrowser
erfolgt keine Anzeige.
9.1.3.1. 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 durchzuführenden
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 überschrieben.
Anzeigebeispiel (progress_bar 17 26):
65% [================================> ] 17 / 26
9.1.4. 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 unterstützt:
--std
Ausgabe einer allgemeinen Meldung (Standard-Einstellung)
Dies sollte der Standardfall bei der Ausgabe von Meldungen sein. Ein Beispiel dafür ist die Ausgabe von Statusmeldungen beim Starten eines Dienstes oder beim Verarbeiten einer geänderten Konfiguration.
--stdbr
Ausgabe einer allgemeinen Meldung (Breit - Weiß )
Dies sollte der Standardfall bei der Ausgabe von Meldungen sein. Ein Beispiel dafür ist die Ausgabe von Statusmeldungen beim Starten eines Dienstes oder beim Verarbeiten einer geänderten Konfiguration.
--info
Ausgabe einer Information
Eine wichtige Information. Dieser Typ wird für 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 durchgeführt wurde. Mit –warn kann der Anwender auch auf eine Gefahr aufmerksam gemacht werden (z.B. eine häufige 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 für einen Link (Farbe cyan)
Ausgabe eines Zeichen z.B. für einen Link ‚>‘
--ok
Ausgabe einer [ OK ] Meldung
Mittels der Formatierung
--ok
wird eine OK Meldung ausgegeben. Die rechts am Rand der Arbeitsfläche platziert 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 platziert ist und den Abbruch der Verarbeitung bzw. den Misserfolg einer Verarbeitung anzeigt.
Create configuration ... [ FAIL ]
9.1.4.1. 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 forcolors
--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.
9.1.5. echo_retval¶
Die Funktion ‚echo_retval‘ liefert, in Abhängigkeit 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}
9.1.6. techo¶
Tabellen können 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 übergeben. Diese sind in Zeichen anzugeben; bei der html-Ausgabe werden diese prozentual berücksichtigt.Die Summe aller Spaltenbreiten einer Tabelle darf 80 nicht übersteigen, da sonst die Ausgabe auf dem Bildschirm nicht sichergestellt ist. In diesem Fall wird
techo
mit einer Fehlermeldung abgebrochen, die Zahlen müssen in ‚ ‚ eingefasst werden, damit ein expandieren vom ‚*‘ in der shell verhindert wird. Ab der eisfair base Version 1.5.3 ist die Spaltenbreite beitecho --file
beliebig.- Tipp für fortgeschrittene Entwickler
Für jede Spalte kann angegeben werden, ob diese rechts- oder linksbündig ausgerichtet sein soll. Dazu wird der Spaltenbreite einfach ein „r“ bzw. ein „l“ angefügt. Außerdem können Spalten mit variabler Breite definiert werden indem bei der Definition ein „*“ angefügt 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. Für die Formatierung der gesamten Zeile muss die Angabe zwischen den Schlüsselwörterntecho
und--row
erfolgen. Für einzelne Zellen muss die Formatierung dieser vorangestellt werden. Die Parameter zur Steuerung der Formatierung sind unter der Funktionmecho
beschrieben.- Abschluss der Tabelle
Der Abschluss der Ausgabe einer Tabelle erfolgt mit
techo --end
.
9.1.6.1. 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'tuse 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 Ausgabeströme 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
9.1.7. eistime¶
Über das Skript eistime
werden Datum und Zeit in der
ISO-8601-Notation systemweit zur Verfügung gestellt.
9.1.7.1. 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
# --------------------------------------------------------------------
9.1.8. 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
9.1.9. check_screensize¶
Die Funktion check_screensize
überprüft die Größe 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
9.2. inetlib - Funktionen für 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 über die entsprechenden Variablen
IP_ETH_%_NAME
IP_ETH_%_IPADDR
IP_ETH_%_NETWORK
IP_ETH_%_NETMASK
aus der Konfigurationsdatei /etc/config.d/base
zur Verfügung.
Werden die Parameter für Interfaces aber dynamisch vergeben (z.B. bei
dhcp oder beim DSL Paket für ppp0), so stimmen die Angaben aus
/etc/config.d/base
nicht mehr mit den aktuellen Parametern der
Interfaces überein.
Die aufgeführten Funktionen ermitteln die Parameter, indem sie die Ausgabe des Befehls ifconfig auswerten.
9.2.1. get_interfaces¶
Die Funktion get_interfaces gibt eine Liste der Interfaces zurück. 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.
9.2.2. 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.
Für get_interface
macht natürlich nur die Nummer einen Sinn.
Aufrufe (hier für get_ipaddr
):
get_ipaddr 1
Hier wird die aktuelle IP-Adresse des Interfaces ausgegeben, welche
über 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 ungültigem 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 :
9.3. 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
9.3.1. printgpl¶
Die Funktion printgpl()
gibt einen GPL-Header für eine
eisfair-Konfigurationsdatei aus.
Beispiel:
printgpl --conf \
"foo" \
"2005-03-25" "frank" \
"2001-2019 the eisfair team, team(at)eisfair(dot)org"
Im Beispiel wird der GPL-Header für 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-2019 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-2019 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.
# -----------------------------------------------------------------------
9.3.2. check¶
Bei einem erweiterten Erweitertes update $package-update.sh
Skript können auch die folgenden Header benutzt werden.
9.3.2.1. --check
¶
Der Parameter --check
gibt einen GPL-Header für eine
eisfair-check-datei aus.
Beispiel:
printgpl --check \
"foo" \
"2005-03-25" "frank" \
"2001-2019 the eisfair team, team(at)eisfair(dot)org"
Beispiel:
# -----------------------------------------------------------------------
# /etc/check.d/foo - eischk file for foo
#
# Creation:
Im Beispiel wird der GPL-Header für das angegebene Paket ausgegeben. Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl .
9.3.2.2. --check_exp
¶
Der Parameter --check_exp
gibt einen GPL-Header für eine
eisfair-check.exp-datei aus.
Beispiel:
printgpl --check_exp \
"foo" \
"2005-03-25" "frank" \
"2001-2019 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 für das angegebene Paket ausgegeben. Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl .
9.3.2.3. --check_ext
¶
Der Parameter --check_ext
gibt einen GPL-Header für eine
eisfair-check.ext-datei aus.
Beispiel:
printgpl --check_ext \
"foo" \
"2005-03-25" "frank" \
2001-2019 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 für das angegebene Paket ausgegeben. Das Ergebnis entspricht dem vorangegangenen Beispiel printgpl .
9.3.3. printgroup¶
Mit der Funktion printgroup() kann man einen Gruppenheader für 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: Für eine Zeile
# -----------------------------------------------------------------------
# Simple group
# -----------------------------------------------------------------------
Beispiel: Für 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. Dafür gibt es die folgenden Parameter. Hierbei lässt sich durch Angabe von ‚0‘ die Leerzeile auch unterdrücken.
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"
9.3.4. printcustomgroup¶
Mit der Funktion printcustomgroup()
kann man einen Gruppenheader für
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. Dafür gibt es die folgenden Parameter. Hierbei lässt sich durch Angabe von ‚0‘ die Leerzeile auch unterdrücken.
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, müssen diese am Beginn der Zeile mit der ‚#‘ Raute geschützt werden.
9.3.5. 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 gängige 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 unabhängig von der Länge des Variablennamens und des Inhalts immer an Position 39 ausgegeben. Sollten der Variablenname und der Inhalt länger als 37 Zeichen sein, so wird der Kommentar automatisch in der Folgezeile an Position 39 ausgegeben.
Um längere Kommentare mehrzeilig ausgeben zu können, kann printvar
auch ohne einen Variablennamen aufgerufen werden. Es wird dann nur der
übergebene Kommentar ab Position 39 ausgegeben. Das ist im zweiten
Beispiel dargestellt.
Auch Variablenfelder können einfach mit printvar
ausgegeben werden,
dazu ist einfach der Variablenname inklusive des Zählers an printvar
zu übergeben (Beispiel 3).
9.3.6. printend¶
Mit der Funktion printend()
wird eine eisfair-Konfigurationsdatei
abgeschlossen, d.h. es wird die Fußzeile End
ausgegeben:
Beispiel:
printend
9.4. Weitere verfügbare Skripte¶
9.4.1. /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 --info --warn --error] 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
--info print info message (green)
--warn print warning message (yellow)(bright)
--error print error message (red)(brightinvers)
--tty use console colors
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 --tty --info "Kernel loeschen" "no"
Um den Rückgabewert von ask
bei einem Abbruch mit CTRL-C abfangen zu
können, hat sich die folgende Variante bewährt:
_ask_tmpfile=$(/bin/mktemp -t ask.XXXXXXXXX)
/var/install/bin/ask "Select" "" "1-8" "^$=Return" "0=Exit" > ${_ask_tmpfile}
rc=${?}
read answer < ${_ask_tmpfile}
rm -f ${_ask_tmpfile}
# 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
9.4.2. /var/install/bin/choose¶
Über den Aufruf von choose
kann eine Auswahlliste dargestellt werden.
choose
übernimmt dazu die gesamte Oberflächendarstellung.
Darstellung in Tabellenform (mittels
techo
)Automatische Nummerierung der Zeilen
Rücksprung ohne eine Auswahl
Vorwärts- und rückwärtsblättern
Automatische Anpassung an Bildschirmgrösse (horizontal und vertikal)
Direktanzeige einer gewünschten Zeile beim Erstaufruf möglich
Deaktivieren einzelner Zeilen
Sofern im Environment SCROLL="yes"
gesetzt ist, wird auf das
Blättern verzichtet. Es werden dann immer alle Zeilen ausgegeben und
der Anwender muss manuell scrollen.
In diesem Fall sind verschiedene der obigen Features natürlich nicht verfügbar.
choose
kann nicht in Verbindung mit webconf genutzt werden.
Syntax:
/var/install/bin/choose ARRAY [START_POSITION]
Die übergabe der Daten an choose
erfolgt analog der eisfair
Konfigurationsdateien als mehrdimensionales Array. Hierfür wird im
Folgenden MYARRAY
verwendet.
Neben den eigentlichen Inhalten müssen folgende Werte übergeben 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 übergeben:
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 Anführungszeichen korrekt gesetzt werden:
Beispiele:
eval MYARRAY_$row_1=\"foo\"
eval MYARRAY_$row_1=\"'--info \"'foo bar foo bar'\"'\"
eval MYARRAY_$row_1=\"'--warn \"'$FOOBAR'\"'\"
Warnung
Alle Werte müssen per export an Subshells übergeben werden!
Nun kann choose
aufgerufen werden:
Beispiel:
_ask_tmpfile=$(/bin/mktemp -t XXXXXXXXXXXXX)
/var/install/bin/choose MYARRAY 89 > ${_ask_tmpfile}
rc=${?}
read answer < ${_ask_tmpfile}
rm -f ${_ask_tmpfile}
[ $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 übergebene Element befindet.
Rückgabewerte:
"" Return ohne Auswahl; Rücksprung in vorherige Ebene
"1" - "9999" Ausgewähltes Element
"0" Ende; sofortiges Beenden der Anwendung
über die Angabe MYARRAY_ACTIVE="no"
kann man einzelne Spalten aus
der Auswahlliste ausblenden. Damit wird diese Spalte in der
Auswahlliste nicht berücksichtigt. 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 müssen.
Um auf jeder Seite wiederkehrende Spaltenüberschriften ausgeben zu können, werden diese per
Spaltenüberschriften
MYARRAY_CAPTION_1='--info "Spalte 1"'
MYARRAY_CAPTION_2='--info "Spalte 2"'
übergeben. Die Verwendung von Spaltenüberschriften ist optional.
Mittels MYARRAY_FLAGS
können die folgenden optionalen Parameter
übergeben werden:
--spread
--indent 12
--showexit
--list
--default 1
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 verfügbar, 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 größerer oder kleinerer linker Einzug
angegeben werden.
Bei der Angabe von --showexit
wird auf jeder Seite als letzter Punkt
die Funktion „0“ ausgegeben:
Bei der Angabe von --list
werden keine Nummerischen Werte ausgegeben
und es gibt auch keine Auswahl für Numerische Werte. Es ist dann eine
Anzeige.
Mittels --default 1
kann ein Wert übergeben werden
der in der Auswahl als Default angezeigt werden soll.
--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 Überschneidungen der Namen bei zukünftigen
Erweiterungen der Übergabestruktur kommen.
9.4.3. /var/install/bin/check-version¶
überprüft 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 Abgefragte Version ist älter als die installierte
old Abgefragte 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
9.4.4. /var/install/bin/doc¶
Zeigt die Dokumentation eines Paketes an. Dabei ist der komplette Pfad zur Dokumentationsdatei mit zu übergeben.
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"
9.4.5. /var/install/bin/edit¶
Startet den Editor zum Editieren der Konfiguration
edit [--apply|--apply-stopstart] file
edit [--apply|--apply-stopstart] package message
--apply Änderungen werden durch einen Restart sofort
übernommen.
--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
9.4.9. /var/install/bin/add-user¶
Fügt einen neuen Benutzer zum System hinzu. Wird das Skript ohne Parameter aufgerufen, so werden die erforderlichen Informationen interaktiv abgefragt. Soll statt dessen keine Interaktion erfolgen, sind die Angaben auf der Kommandozeile an das Skript zu übergeben:
add-user [-d|-l|-r] user encrypted-password uid group real-name home shell
- leer für den interaktiven Modus
-d - zum Erstellen eines Benutzers der sich ohne
Passwort anmelden darf
-l - zum Sperren des Benutzerpasswortes
-r, --system - Benutzer als Systembenutzer anlegen
user - Login Namen des Benutzers
encrypted-password - Passwort in kodierter Form oder leer lassen
uid - Benutzer ID oder leer lassen
group - Name einer Benutzergruppe, eine Gruppen ID
oder leer lassen
real-name - Beschreibung des Benutzers
home - Heimatverzeichnis des Benutzers
shell - Kommandointerpreter des Benutzers
Einige der Parameter sind optional und können je nach Anwendungsfall
entfallen. Falls nachfolgende Parameter jedoch mit einem Wert belegt
werden sollen, sind optionale Parameter als leere Zeichenkette (''
)
in die Befehlszeile einzufügen.
Wird ein optionaler Parameter leer übergeben, dann nimmt das Skript jeweils einen sinnvollen Standardwert an. Abhängig vom Argument sind dies die folgenden Werte:
Parameter Standardwert
----------------------------------------
uid wird automatisch ermittelt!
group 'users'
real-name ''
home "/home/${USER}"
shell '/bin/sh'
Falls eine Benutzergruppe vorgegeben werden soll, kann diese im Argument ‚group‘ festgelegt werden. Dabei kann - und sollte - die Angabe in Form des Namens der Gruppe erfolgen und braucht nicht als Nummer angegeben werden.
Beispiel Prüfen ob der Benutzers schon angelegt ist:
if ! getent passwd user >/dev/null 2>&1
then
/var/install/bin/add-user ...
fi
Beispiel für das Anlegen eines Benutzers:
/var/install/bin/add-user \
foo sdz8evwesdfs '' users "User foo" /home/foo /bin/bash
Beispiel für das Anlegen eines Systembenutzers ohne Anmeldeberechtigung:
/var/install/bin/add-user \
-r firebird '*' '' firebird "Firebird SQL deamon" /srv/firebird /bin/bash
Beispiel für das Anlegen eines Benutzers, der sich ohne Passwort anmelden darf:
/var/install/bin/add-user \
-d foo '' '' users "User foo" /home/foo /bin/bash
9.4.10. /var/install/bin/modify-user¶
ändert 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 Menü angezeigt, über welches die Änderungen interaktiv durchgeführt werden können.
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 zusätzliche Angabe einer der folgenden
Optionen kann das Verhalten dieser Funktion beeinflusst
werden.
-m - Das Ursprungsverzeichnis und dessen Inhalt wird
verschoben.
-r - Es wird ein neues Home-Verzeichnis angelegt und das
Ursprungsverzeichnis wird gelöscht.
'' - Es wird ein neues Home-Verzeichnis angelegt, das
Ursprungsverzeichnis bleibt unverändert 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
9.4.11. /var/install/bin/remove-user¶
Entfernt einen Benutzer vom System. Systembenutzer können dabei nur durch Setzen des Schalters „-f“ entfernt werden.
remove-user [-f] user do-remove-homedir
-f - Systembenutzer löschen
user - Benutzername
y, n - zum Löschen des Basisverzeichnisses
Beispiel für das Entfernen eines Benutzers mit Löschen des Basisverzeichnisses:
/var/install/bin/remove-user foo y
Beispiel für das Entfernen eines Systembenutzers ohne Löschen des Basisverzeichnisses:
/var/install/bin/remove-user -f firebird n
9.4.12. /var/install/bin/add-group¶
Fügt eine neue Gruppe zum System hinzu. Wenn das Skript ohne Parameter aufgerufen wird, werden die Daten einzeln abgefragt. Zum Anlegen einer Gruppe ohne den Eingabedialog können folgende Parameter übergeben werden:
Um die Eigenschaften des System zu berücksichtigen, sollen die Gruppen IDs nicht hart vergeben werden,
add-group [--quiet] [-r] group [gid]
- leer für den interaktiven Modus
-r, --system - Systemgruppe erstellen
-q, --quiet - alle Bildschirmausgaben unterdrücken
group - Name der Gruppe
gid - Gruppen ID Nummer, leer lassen
Beispiel Prüfen ob die Gruppe schon angelegt ist:
if ! getent group gruppe >/dev/null 2>&1
then
/var/install/bin/add-group ...
fi
Beispiel für das Anlegen einer Gruppe:
/var/install/bin/add-group foo
Beispiel für das Anlegen einer Systemgruppe:
/var/install/bin/add-group -r foo
9.4.13. /var/install/bin/remove-group¶
Entfernt eine Gruppe vom System. Systemgruppen können dabei nur durch Setzen des Schalters „-f“ entfernt werden.
remove-group [-f] group
-f - Systemgruppe löschen
group - Gruppenname
Beispiel für das Entfernen einer Gruppe:
/var/install/bin/remove-group foo
9.4.14. /var/install/bin/install-local-package¶
über dieses Skript ist es möglich, 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 menügeführt die Installation der Pakete ermöglicht. Das Skript merkt sich die zuletzt verwendeten Verzeichnisse und bietet diese im interaktiven Modus zur Auswahl an.
Zusätzlich ist es möglich, dem Skript über die Kommandozeile ein Verzeichnis mitzugeben bzw. das Löschen der temporären index.txt oder eis-list.txt-Dateien auf Wunsch zu verhindern (-keep-all). Wer diese Installationsfunktion fest in das existierende eisfair-Installationsmenü aufnehmen möchte, kann dies über den Switch ‚-add-menu‘ bewerkstelligen. Der Switch ‚-del-menu‘ entfernt den Menüeintrag wieder. Falls man das Skript nur für die Generierung der index.txt und eis- list.txt-Dateien verwenden möchte, kann man über den Switch ‚-no- install‘ den Aufruf der Installationsroutine verhindern.
Die verschiedenen Startvarianten im überblick:
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 - Menüeintrag zum Installationsmenü hinzufügen
--del-menu - Menüeintrag aus Installationsmenü entfernen
--keep-all - eis-list.txt und index.txt-Dateien nicht
löschen
--no-install - Nach dem Generieren der eis-list.txt und
index.txt-Dateien das Installationsskript
nicht starten.
9.4.16. /var/install/bin/check-package¶
Mit diesem Skript lässt sich überprüfen, 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 geprüft werden.
Beispiel für die Prüfung eines Paketes und das Auswerten des Rückgabewertes.
Als Parameter dient in diesem Beispiel EISFAX_USER_1_PRN_INFO="yes"
Für das Drucken der Information wird das Paket a2ps
benötigt.
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
# Parameter zurücksetzen
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
9.4.17. /var/install/bin/check-folder¶
Mit diesem Skript lässt sich überprüfen, 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"
9.4.18. /etc/init.d/functions¶
Dieses Skript stellt Funktionen für 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-2019 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 ()
{
boot_mesg " * Starting foo ..."
loadproc foo
}
_do_stop ()
{
boot_mesg " * Stopping foo ..."
killproc foo
}
_do_status ()
{
statusproc foo
}
_do_usage ()
{
echo "Usage: $0 [-q|--quiet] {start|status|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
;;
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 dafür 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.
9.4.19. /var/install/bin/convert-encoding¶
Mit diesem Skript lässt sich die Kodierung in einem Skript an das vorhandene Encoding auf dem System anpassen. Wenn das Skript in UTF-8 Kodiert ist und das System UTF-8 Kodierung hat, wird nichts ausgeführt, wenn das System in ISO-8859-15 läuft wird das Skript nach ISO-8859-15 Kodiert.
Die Aufruf-Syntax:
convert-encoding
/pfad/zum/skript/
Example: convert-encoding /tmp/myfolder/myskript