<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
\chapter{eisfair spezifische Skripte}

\section{eislib -- Funktionen zur Steuerung des Userinterfaces}

    In \eisfair\ gibt es die include-Bibliothek "`eislib"'. Darin werden
    verschiedene standardisierte Funktionen zusammengefasst. Die
    Funktionalit"at wurde gegen"uber den bisher verwendeten Skripten
    deutlich erweitert.

    Aus Kompatibilit"atsgr"unden werden die alten Skripte f"ur eine
    "ubergangszeit weiterhin unterst"utzt. Die Verwendung von hier
    nicht dokumentierten Skripten in neuen Releases ist nicht
    mehr zul"assig.

    Die eislib wird am Anfang des paketeigenen Skriptes durch folgenden
    Aufruf eingebunden:

\begin{verbatim}
# include eislib
. /var/install/include/eislib
\end{verbatim}

    Beim Aufruf der Funktionen braucht nichts weiter beachtet zu werden.

\begin{example}
Beispiel:
\begin{verbatim}
anykey
\end{verbatim}
\end{example}

%    S"amtliche Funktionen der eislib k"onnen auch unter der Kontrolle
%    eines Webbrowsers verwendet werden, sind also zu webconf kompatibel.

    \hinweis{Es muss darauf geachtet werden, dass der Inhalt der
             Variablen \texttt{\${IFS}} m"oglichst umgehend nach deren
             Benutzung immer auf den Ursprungswert zur"uck gesetzt wird,
             um eventuellen St"orungen vorzubeugen.}

\begin{example}
Beispiel:
\begin{verbatim}
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 &lt;/etc/group
\end{verbatim}
\end{example}

    In \eisfair\ Version 1.5.0 sind die im Folgenden aufgef"uhrten
    Funktionen verf"ugbar:


\subsection{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"ucken) ist
    nicht mit webconf kompatibel!


\subsection{clrhome}

    clrhome l"oscht den Bildschirm, so dass eine "ubersichtlichere
    Anzeige m"oglich ist (z.B. mehrseitige Anzeigen). Unter einem
    Webbrowser wird stattdessen eine horizontale Trennlinie
    angezeigt.


\subsection{progress\_bar}

    Mittels \texttt{progress\_bar} kann man auf der Konsole einen
    Fortschrittsbalken anzeigen. So kann der Anwender bei l"angeren
    Verarbeitungen "uber den aktuellen Status auf dem Laufenden gehalten
    werden. Im Webbrowser erfolgt keine Anzeige.

\subsubsection{Syntax}

\texttt{
progress\_bar [\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{file}] current\_step total\_steps}

options:

\begin{tabular}{ll}
\texttt{\textendash\textendash{tty}}   &amp; \texttt{use console colors} \\
\texttt{\textendash\textendash{html}}  &amp; \texttt{use html tags for colors} \\
\texttt{\textendash\textendash{file}}  &amp; \texttt{don't use any color tags} \\
\end{tabular}


Als \texttt{current\_step} wird der aktuelle Stand der Verarbeitung
angegeben, \texttt{total\_steps} ist die Gesamtzahl der durchzuf"uhrenden
Verarbeitungsschritte. Um die Anzeige zu aktualisieren wird
\texttt{progress\_bar} einfach erneut aufgerufen, ohne dass zwischenzeitlich
eine eigene Ausgabe erfolgt ist. Es wird dann die alte Anzeige mit dem
neuen Fortschrittsbalken "uberschrieben.

\begin{example}
    Anzeigebeispiel (progress\_bar 17 26):
\begin{verbatim}
 65% [================================&gt;                  ] 17 / 26
\end{verbatim}
\end{example}


\subsection{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"utzt:

\begin{description}
\item[\texttt{\textendash\textendash{std}}]
           \textbf{Ausgabe einer allgemeinen Meldung
           (Standard-Einstellung)} \\
           Dies sollte der Standardfall bei der Ausgabe von Meldungen
           sein. Ein Beispiel daf"ur ist die Ausgabe von Statusmeldungen
           beim Starten eines Dienstes oder beim Verarbeiten einer
           ge"anderten Konfiguration.\\

\item[\texttt{\textendash\textendash{stdbr}}]
           \textbf{Ausgabe einer allgemeinen Meldung
           (Breit - Weiss )} \\
           Dies sollte der Standardfall bei der Ausgabe von Meldungen
           sein. Ein Beispiel daf"ur ist die Ausgabe von Statusmeldungen
           beim Starten eines Dienstes oder beim Verarbeiten einer
           ge"anderten Konfiguration.\\

\item[\texttt{\textendash\textendash{info}}]
           \textbf{Ausgabe einer Information} \\
           Eine wichtige Information. Dieser Typ wird f"ur die
           Hervorhebung wichtiger Informationsmeldungen verwendet. Dem
           Anwender wird damit das Ergebnis \glqq{}es ist alles in
           Ordnung\grqq{} signalisiert.\\

\item[\texttt{\textendash\textendash{warn}}]
           \textbf{Ausgabe einer Warnung} \\
           Warnungen werden mit dieser Option gesteuert. Eine Warnung
           signalisiert Probleme bei der Verarbeitung, wobei diese
           dennoch erfolgreich durchgef"uhrt wurde.

           Mit \texttt{\textendash\textendash{warn}} kann der Anwender auch auf eine
           Gefahr aufmerksam gemacht werden (z.B. eine h"aufige
           Fehlerquelle bei der Konfiguration eines Paketes).\\

\item[\texttt{\textendash\textendash{error}}]
           \textbf{Ausgabe einer Fehlermeldung} \\
           Mittels der Formatierung \texttt{\textendash\textendash{error}} wird eine
           klassische Fehlermeldung ausgegeben. Dies soll dem Anwender
           den Abbruch der Verarbeitung bzw. den Misserfolg einer
           Verarbeitung signalisieren.\\

\item[\texttt{\textendash\textendash{link}}]
           \textbf{Ausgabe f"ur einen Link
           (Farbe  cyan)f} \\
           Ausgabe eines Zeichen z.B. f"ur einen Link '\textgreater' \\

\item[\texttt{\textendash\textendash{ok}}]
           \textbf{Ausgabe einer [\space\space OK\space\space ] Meldung} \\
           Mittels der Formatierung \texttt{\textendash\textendash{ok}} wird eine
           OK Meldung ausgegeben. Die rechts am Rand der Arbeitsfl"ache
           plaziert ist und die Erfolgreiche Verarbeitung
           anzeigt.\\
\end{description}

\begin{latexonly}
\begin{bildschirm}
\\ Create configuration ...                                        [ \color{green} OK \color{white} ] \\
\end{bildschirm}
\end{latexonly}

\begin{htmlonly}
\begin{rawhtml}
&lt;CENTER&gt;
    &lt;TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0&gt;
        &lt;COL WIDTH=561&gt;
        &lt;TR&gt;
            &lt;TD WIDTH=561 VALIGN=TOP&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;PRE STYLE="background: #333333"&gt;

&lt;FONT COLOR="#ffffff"&gt; Create configuration ...                                                   [ &lt;/FONT&gt;&lt;FONT COLOR="#008000"&gt; OK &lt;/FONT&gt;&lt;FONT COLOR="#ffffff"&gt; ] &lt;/FONT&gt;
            &lt;/PRE&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;/TD&gt;
        &lt;/TR&gt;
    &lt;/TABLE&gt;
&lt;/CENTER&gt;
\end{rawhtml}
\end{htmlonly}


\begin{description}
\item[\texttt{\textendash\textendash{fail}}]
           \textbf{Ausgabe einer [ FAIL ] Meldung} \\
           Mittels der Formatierung \texttt{\textendash\textendash{fail}} wird eine
           FAIL Meldung ausgegeben, die rechts am Rand der Arbeitsfl"ache
           plaziert ist und den Abbruch der Verarbeitung bzw. den Misserfolg
           einer Verarbeitung anzeigt.\\
\end{description}

\begin{latexonly}
\begin{bildschirm}
\\ Create configuration ...                                        [ \color{red}FAIL\color{white} ] \\
\end{bildschirm}
\end{latexonly}

\begin{htmlonly}
\begin{rawhtml}
&lt;CENTER&gt;
    &lt;TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0&gt;
        &lt;COL WIDTH=561&gt;
        &lt;TR&gt;
            &lt;TD WIDTH=561 VALIGN=TOP&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;PRE STYLE="background: #333333"&gt;

&lt;FONT COLOR="#ffffff"&gt; Create configuration ...                                                   [ &lt;/FONT&gt;&lt;FONT COLOR="#ff0000"&gt;FAIL&lt;/FONT&gt;&lt;FONT COLOR="#ffffff"&gt; ] &lt;/FONT&gt;
            &lt;/PRE&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;/TD&gt;
        &lt;/TR&gt;
    &lt;/TABLE&gt;
&lt;/CENTER&gt;
\end{rawhtml}
\end{htmlonly}


\subsubsection{Syntax}

\texttt{
mecho [\textendash{n}] [\textendash\textendash{std}|\textendash\textendash{stdbr}|\textendash\textendash{info}|\textendash\textendash{warn}|\textendash\textendash{error}|\textendash\textendash{link}] [\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{file}] message ...}

options:

\begin{tabular}{ll}
-n     &amp; do not append newline\\\\

\textendash\textendash{std}   &amp; print standard message (default)\\
\textendash\textendash{stdbr} &amp; print standard message (default - breit)\\
\textendash\textendash{info}  &amp; print info message\\
\textendash\textendash{warn}  &amp; print warning message\\
\textendash\textendash{error} &amp; print error message\\
\textendash\textendash{link}  &amp; print message in - cyan\\
\textendash\textendash{ok}    &amp; print message [\space\space OK\space\space ]\\
\textendash\textendash{fail}  &amp; print message [ FAIL ]\\\\

\textendash\textendash{tty}   &amp; use console colors\\
\textendash\textendash{html}  &amp; use html tags for colors\\
\textendash\textendash{file}  &amp; don't use any color tags\\
\end{tabular}



\begin{example}
    Beispiel f"ur OK und FAIL mit der M"oglichkeit zur Fehlerbehandlung.
\begin{verbatim}

    mecho --std " Create configuration ... "
    _do_foo
    retval="${?}"
    if [ "${retval}" -eq 0 ]
    then
        mecho --ok
    else
        mecho --fail
        _do_bar
    fi

\end{verbatim}
\end{example}


%   \subsubsection{Tipps fuer Fortgeschrittene}
    \tipp{Mit den Optionen \texttt{[\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{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.}


\subsection{echo\_retval}

    Die Funktion 'echo\_retval' liefert, in Abh"angikeit vom R"uckgabewert,
    [\space\space OK\space\space ] oder [ FAIL ].

\begin{example}
    Beispiel f"ur OK und FAIL ohne Eingriff f"ur die Fehlerbehandlung.
\begin{verbatim}

    mecho --std " Create configuration ... "
    _do_foo
    retval="${?}"
    echo_retval "${retval}"

\end{verbatim}
\end{example}



\subsection{techo}

    Tabellen k"onnen 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:

    \begin{description}

    \item[Initialisierung]

        Bei der Initialisierung \texttt{techo \textendash\textendash{begin}} wird eine
        Liste der Spaltenbreiten "ubergeben. Diese sind in Zeichen
        anzugeben; bei der html-Ausgabe werden diese prozentual
        ber"ucksichtigt.

    Die Summe aller Spaltenbreiten einer Tabelle darf 80 nicht
    "ubersteigen, da sonst die Ausgabe auf dem Bildschirm nicht
    sichergestellt ist. In diesem Fall wird \texttt{techo} mit einer
    Fehlermeldung abgebrochen, die Zahlen m"ussen in ' ' eingefasst
    werden, damit ein expandieren vom '*' in der shell verhindert wird.
    Ab der eisfair base Version 1.5.3 ist die Spaltenbreite bei
    \texttt{techo \textendash\textendash{file}} beliebig.

\tipp{F"ur jede Spalte kann angegeben werden, ob diese rechts- oder
    linksb"undig ausgerichtet sein soll. Dazu wird der Spaltenbreite
    einfach ein "`r"' bzw. ein "`l"' angef"ugt.
    Ausserdem k"onnen Spalten mit variabler Breite definiert werden indem
    bei der Definition ein "`*"' angef"ugt wird.}


   \item[Ausgabe der Tabellenzeilen]

        Jede Tabellenzeile wird mittels \texttt{techo \textendash\textendash{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"ur die Formatierung der gesamten Zeile muss die Angabe zwischen
        den Schl"usselw"ortern \texttt{techo} und
        \texttt{\textendash\textendash{row}} erfolgen. F"ur einzelne Zellen muss die
        Formatierung dieser vorangestellt werden.

        Die Parameter zur Steuerung der Formatierung sind unter der
        Funktion mecho beschrieben.


   \item[Abschluss der Tabelle]

        Der Abschluss der Ausgabe einer Tabelle erfolgt mit
        \texttt{techo \textendash\textendash{end}}.

\end{description}


\subsubsection{Syntax}

\texttt{
techo [\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{file}] \textendash\textendash{begin} width[align] width[align] ...\\
techo [\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{file}] [\textendash\textendash{std}|\textendash\textendash{stdbr}|\textendash\textendash{info}|\textendash\textendash{warn}|\textendash\textendash{error}|\textendash\textendash{link}] \textendash\textendash{row}
                            [\textendash\textendash{std}|\textendash\textendash{stdbr}|\textendash\textendash{info}|\textendash\textendash{warn}|\textendash\textendash{error}|\textendash\textendash{link}] message
 ...\\
techo [\textendash\textendash{tty}|\textendash\textendash{html}|\textendash\textendash{file}] \textendash\textendash{end}} \\
\\
options:

\begin{tabular}{ll}
\textendash\textendash{tty}  &amp; use console colors\\
\textendash\textendash{html} &amp; use html tags for colors\\
\textendash\textendash{file} &amp; don't use any color tags\\
\end{tabular}

message-options:

\begin{tabular}{ll}
\textendash\textendash{std}   &amp; print standard message (default)\\
\textendash\textendash{stdbr} &amp; print standard message (default - breit)\\
\textendash\textendash{info}  &amp; print info message\\
\textendash\textendash{warn}  &amp; print warning message\\
\textendash\textendash{error} &amp; print error message\\
\textendash\textendash{link}  &amp; print message in - cyan\\\\
\end{tabular}


    Beispiel:

\texttt{
techo \textendash\textendash{begin} '3 3r 15 10 28* 20'\\
techo \textendash\textendash{row} $''$$''$ 1 foo foo $''$This is a somehow longer text, since I need a very long line of text$''$ foo\\
techo \textendash\textendash{row} $''$-&gt;$''$ 2 \textendash\textendash{info} $''$bar foo$''$ \textendash\textendash{warn} $''$foo bar$''$ foo\\
techo \textendash\textendash{row} $''$$''$ 12 foofoo foo foo \textendash\textendash{error} foobar\\
techo \textendash\textendash{info} \textendash\textendash{row} $''$$''$ 24 foo foobar foo \textendash\textendash{error} foobar\\
techo \textendash\textendash{end}
}

%\subsubsection{Tipps fuer Fortgeschrittene}

\tipp{Die Funktionen der eislib funktionieren nicht nur auf der Konsole
      und unter einem Webbrowser, sondern auch bei der Umleitung der
      Ausgabestr"ome in eine Datei oder Variable.\\
      \\
      Beispiel:\\
      \\
      \texttt{
      (\\
      techo \textendash\textendash{begin} '4 40'\\
      techo \textendash\textendash{row} {\dq\dq}~~~{\dq Zeile 1\dq}\\
      techo \textendash\textendash{row} {\dq\dq}~~~{\dq Zeile 2\dq}\\
      techo \textendash\textendash{row} {\dq -$&gt;$\dq}~{\dq Zeile 3\dq}\\
      techo \textendash\textendash{row} {\dq\dq}~~~{\dq Zeile 4\dq}\\
      techo \textendash\textendash{end}\\
      ) $&gt;$/tmp/foo.txt}}

\newpage

\subsection{eistime}

    Ueber das Skript \texttt{eistime} werden Datum und Zeit in der
    ISO-8601-Notation systemweit zur Verf"ugung gestellt.\\

\subsubsection{Syntax}

\begin{tabular}{llll}\
&amp;\$\{EISDATE\} &amp;  =  &amp; 2006-04-25\\
&amp;\$\{EISTIME\} &amp;  =  &amp; 21:16:38\\
\end{tabular}


Beispiel:

\begin{verbatim}
cat  &gt;${HOSTS_HFAXD_FILE} &lt;&lt;EOF
# --------------------------------------------------------------------
#  hosts.hfaxd file generated by ${PACKAGE_NAME} version: ${VERSION}
#
#  Do not edit this file, edit ${CONFIG_FILE}
#  Creation Date: ${EISDATE} Time: ${EISTIME}
# --------------------------------------------------------------------
EOF
\end{verbatim}


Ergibt:

\begin{verbatim}
# --------------------------------------------------------------------
#  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
# --------------------------------------------------------------------
\end{verbatim}


\subsection{refresh\_screensize}

Die Funktion 'refresh\_screensize' wird mit dem laden der eislib
ausgef"uhrt und kann jeder Zeit wieder aufgerufen werden.

Der R"uckgabewert ist:
   \_EISLIB\_SCREENSIZE\_X   actual number of screen columns
   \_EISLIB\_SCREENSIZE\_Y   actual number of screen lines


\subsection{check\_screensize}

Die Funktion 'check\_screensize' ""uberpr"uft die gr"osse des
Terminal. Der R"uckgabewert von 1 bedeutet ein zu kleines Terminal.

Default:
    \_EISLIB\_SCREENSIZE\_X\_MIN  = 80
    \_EISLIB\_SCREENSIZE\_Y\_MIN  = 24
    \_EISLIB\_SCREENSIZE\_Y\_FILE = 999999


\newpage

\section{inetlib -- Funktionen f"ur Parameter von Interfaces}

    \begin{tabular}{ll}
    \texttt{get\_interfaces()}       &amp; get list of interfaces\\
    \texttt{get\_interface()}        &amp; get name of interface\\
    \texttt{get\_ipaddr()}           &amp; get IP address of interface\\
    \texttt{get\_netmask()}          &amp; get Netmask of interface\\
    \texttt{get\_broadcast()}        &amp; get Boadcast address of interface\\
    \texttt{get\_network()}          &amp; get Network of interface\\
    \end{tabular}

    Diese Funktionen dienen dazu, die aktuellen Parameter eines
    Interfaces (z.B. eth0, eth1 oder auch ppp0) zu ermitteln.

    Eigentlich stehen diese Angaben "uber die entsprechenden Variablen

    \texttt{IP\_ETH\_\%\_NAME}

    \texttt{IP\_ETH\_\%\_IPADDR}

    \texttt{IP\_ETH\_\%\_NETWORK}

    \texttt{IP\_ETH\_\%\_NETMASK}

    aus der Konfigurationsdatei \texttt{/etc/config.d/base} zur Verf"ugung.

    Werden die Parameter f"ur Interfaces aber dynamisch vergeben (z.B.
    bei dhcp oder beim DSL Paket f"ur ppp0), so stimmen die Angaben aus
    \texttt{/etc/config.d/base} nicht mehr mit den aktuellen Parametern der
    Interfaces "uberein.

    Die aufgef"uhrten Funktionen ermitteln die Parameter, indem sie
    die Ausgabe des Befehls \texttt{ifconfig} auswerten.


\subsection{get\_interfaces}

    Die Funktion \texttt{get\_interfaces} gibt eine Liste der Interfaces
    zur"uck. Dabei werden nur solche Interfaces ermittelt, die
    mit eth oder ppp beginnen. Das Loopback-Interface lo ist z.B.
    nicht in der Liste beinhaltet.

\begin{example}
Beispiel:
\begin{verbatim}
 IF=`get_interfaces`
 mecho --info "Vorhandene Interfaces $IF"
\end{verbatim}
\end{example}

    Ausgabe ist beispielsweise:

\begin{verbatim}
 Vorhandene Interfaces eth0 eth0:0
\end{verbatim}

    Hier wird die Liste der vorhandenen Interfaces ausgegeben.


\subsection{weitere get-Funktionen}

    Die weiteren Funktionen geben die entsprechenden Parameter
    eines Interfaces aus. Als Parameter kann entweder die Nummer
    der \texttt{IP\_ETH\_\%}-Variablen aus \texttt{/etc/config.d/base}
    angegeben werden oder der Name eines Interfaces.

    F"ur \texttt{get\_interface} macht nat"urlich nur die Nummer einen Sinn.

    Aufrufe (hier f"ur get\_ipaddr):

\begin{verbatim}

 get_ipaddr 1

\end{verbatim}

    Hier wird die aktuelle IP-Adresse des Interfaces ausgegeben,
    welche "uber \texttt{IP\_ETH\_1\_NAME} identifiziert wird. Ist
    \texttt{IP\_ETH\_1\_NAME} leer, so wird das Interface eth0 genutzt.
    Achtung: eth0 und nicht eth1.

\begin{verbatim}

 get_ipaddr eth0:0

\end{verbatim}

    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"ultigem Parameter, wie
    z.B. ett4.

\begin{example}
Ein umfangreicheres Beispiel:
\begin{verbatim}

 # 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

\end{verbatim}
\end{example}

    Hier wird die Liste der Interfaces ermittelt und zu jedem
    Interface werden alle Parameter ausgegeben.

    Ausgabe kann beispielsweise sein:

\begin{verbatim}

 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 :

\end{verbatim}


\section{configlib -- Funktionen zum Handling der Konfigurationsdateien}

    Diese Bibliothek beinhaltet Funktionen zur Behandlung
    der \eisfair\-Konfigurationsdateien.

    Das Einbinden dieser Bibliothek erfolgt analog zur eislib:

\begin{verbatim}
# include configlib
. /var/install/include/configlib
\end{verbatim}

\subsection{printgpl}

    Die Funktion \texttt{printgpl()} gibt einen GPL-Header f"ur eine
    \eisfair\--Konfigurationsdatei aus.

\begin{example}
Beispiel:
\begin{verbatim}
printgpl --conf                  \
         "foo"                   \
         "2005-03-25" "frank"    \
         "2001-2013 the eisfair team, team(at)eisfair(dot)org"
\end{verbatim}
\end{example}


    Im Beispiel wird der GPL-Header f"ur das angegebene Paket ausgegeben.

\begin{verbatim}
 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"
\end{verbatim}

    Das sieht dann in unserem Beispiel so aus:

\begin{example}
Beispiel:
\begin{verbatim}
# -----------------------------------------------------------------------
# /etc/config.d/foo - configuration file for foo
#
# Creation:     2005-03-25  frank
# Last Update:  2006-02-10  max
#
# Copyright (c) 2001-2013 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.
# -----------------------------------------------------------------------

\end{verbatim}
\end{example}


\subsection{check}

 Bei einem erweiterten "`\jump{erweitertes-update}{Erweitertes update}"'
 \texttt{\${package}-update.sh} Skript k"onnen auch die folgenden Header
 benutzt werden.


\subsubsection{\textendash\textendash{check}}

    Der Parameter \texttt{\textendash\textendash{check}} gibt einen GPL-Header f"ur eine
    \eisfair\--check-datei aus.

\begin{example}
Beispiel:
\begin{verbatim}
printgpl --check                 \
         "foo"                   \
         "2005-03-25" "frank"    \
         "2001-2013 the eisfair team, team(at)eisfair(dot)org"

\end{verbatim}
\end{example}

\begin{example}
Beispiel:
\begin{verbatim}

# -----------------------------------------------------------------------
# /etc/check.d/foo - eischk file for foo
#
# Creation:

\end{verbatim}
\end{example}

    Im Beispiel wird der GPL-Header f"ur das angegebene Paket ausgegeben.

    Das Ergebnis entspricht dem vorangegangenen Beispiel \texttt{printgpl}.


\subsubsection{\textendash\textendash{check\_exp}}

    Der Parameter \texttt{\textendash\textendash{check\_exp}} gibt einen GPL-Header f"ur eine
    \eisfair\--check.exp-datei aus.

\begin{example}
Beispiel:
\begin{verbatim}
printgpl --check_exp             \
         "foo"                   \
         "2005-03-25" "frank"    \
         "2001-2013 the eisfair team, team(at)eisfair(dot)org"


\end{verbatim}
\end{example}

\begin{example}
Beispiel:
\begin{verbatim}

# -----------------------------------------------------------------------
# /etc/check.d/foo.exp - eischk exp file for foo
#
# Creation:

\end{verbatim}
\end{example}

    Im Beispiel wird der GPL-Header f"ur das angegebene Paket ausgegeben.

    Das Ergebnis entspricht dem vorangegangenen Beispiel \texttt{printgpl}.


\subsubsection{\textendash\textendash{check\_ext}}

    Der Parameter \texttt{\textendash\textendash{check\_ext}} gibt einen GPL-Header f"ur eine
    \eisfair\--check.ext-datei aus.

\begin{example}
Beispiel:
\begin{verbatim}
printgpl --check_ext             \
         "foo"                   \
         "2005-03-25" "frank"    \
         2001-2013 the eisfair team, team(at)eisfair(dot)org"

\end{verbatim}
\end{example}

\begin{example}
Beispiel:
\begin{verbatim}

# -----------------------------------------------------------------------
# /etc/check.d/foo.ext - eischk ext file for foo
#
# Creation:

\end{verbatim}
\end{example}

    Im Beispiel wird der GPL-Header f"ur das angegebene Paket ausgegeben.

    Das Ergebnis entspricht dem vorangegangenen Beispiel \texttt{printgpl}.


\subsection{printgroup}

    Mit der Funktion \texttt{printgroup()} kann man einen Gruppenheader
    f"ur eine  \eisfair\--Konfigurationsdatei erzeugen. Dabei kann nach
    dem Gruppennamen noch optional ein Kommentar angegeben werden:

\begin{example}
Beispiel:
\begin{verbatim}
printgroup "Simple group"
printgroup "General settings" "General settings for configuration"
\end{verbatim}
\end{example}


\begin{example}
Beispiel: F"ur eine Zeile
\begin{verbatim}

# -----------------------------------------------------------------------
# Simple group
# -----------------------------------------------------------------------

\end{verbatim}
\end{example}


\begin{example}
Beispiel: F"ur eine Zeile mit Kommentar
\begin{verbatim}

# -----------------------------------------------------------------------
# General settings
# general settings for eisfair configuration
# -----------------------------------------------------------------------

\end{verbatim}
\end{example}

    Standard ist vor und nach dem Gruppenheader jeweils eine Leerzeile.

    Diese Leerzeile kann gesteuert werden. Daf"ur gibt es die folgenden
    Parameter. Hierbei l"asst sich durch Angabe von '0' die Leerzeile
    auch unterdr"ucken.

\begin{example}
Parameter:
\begin{verbatim}
-b x     print x newline before Groupheader
-a x     print x newline after Groupheader
\end{verbatim}
\end{example}

\begin{example}
Beispiel:
\begin{verbatim}
printgroup -b 0 "Simple group"
printgroup -b 2 -a 0 "General settings" "General configuration settings"
\end{verbatim}
\end{example}


\subsection{printcustomgroup}

    Mit der Funktion \texttt{printcustomgroup()} kann man einen
    Gruppenheader f"ur eine  \eisfair\--Konfigurationsdatei erzeugen und
    einen mehrzeiligen Kommentar angeben:

\begin{example}
Beispiel:
\begin{verbatim}
printcustomgroup 'General settings' &lt;&lt; !EOC
comment line
comment line
comment line
!EOC
\end{verbatim}
\end{example}


\begin{example}
Beispiel:
\begin{verbatim}
# -----------------------------------------------------------------------
# General settings
#
# more comment
# more comment
# etc
# -----------------------------------------------------------------------
\end{verbatim}
\end{example}

    Standard ist vor und nach dem Gruppenheader jeweils eine Leerzeile.

    Diese Leerzeile kann gesteuert werden. Daf"ur gibt es die folgenden
    Parameter. Hierbei l"asst sich durch Angabe von '0' die Leerzeile
    auch unterdr"ucken.

\begin{example}
Parameter:
\begin{verbatim}
-b x     print x newline before Groupheader
-a x     print x newline after Groupheader
\end{verbatim}
\end{example}

\begin{example}
Beispiel:
\begin{verbatim}
printcustomgroup -b 0 'General settings' &lt;&lt; !EOC
comment line
comment line
comment line
!EOC
\end{verbatim}
\end{example}

    Wenn dieser mehrzeilige Kommentar tabellarisch gestaltet werden soll
    und dabei am Zeilenanfang Leerzeichen vorkommen, m"ussen diese am
    Beginn der Zeile mit der '\#' Raute gesch"utzt werden.



\subsection{printvar}

    Die Funktion \texttt{printvar()} dient zur formatierten Ausgabe von
    Konfigurationsvariablen und Kommentaren, sofern eine
    \eisfair\--Konfigurationsdatei selbst geschrieben werden muss.

\begin{example}
Beispiel:
\begin{verbatim}
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"
\end{verbatim}
\end{example}

    Als Beispiel sind hier drei g"angige Aufrufvarianten angegeben. Als
    erstes die einfache Ausgabe einer Variable mit einem Kommentar.
    Sollte die Variable \texttt{FOO\_VARIABLE} den Inhalt "`\texttt{foobar}"'
    haben, so sieht die Ausgabe wie folgt aus:

\begin{verbatim}
FOO_VARIABLE='foobar'                 # This is a simple Variable
\end{verbatim}

    Das Kommentarzeichen "`\texttt{\#}"' wird dabei unabh"angig von der
    L"ange des Variablennamens und des Inhalts immer an Position 39
    ausgegeben. Sollten der Variablenname und der Inhalt l"anger als
    37 Zeichen sein, so wird der Kommentar automatisch in der Folgezeile
    an Position 39 ausgegeben.

    Um l"angere Kommentare mehrzeilig ausgeben zu k"onnen, kann
    \texttt{printvar} auch ohne einen Variablennamen aufgerufen werden. Es
    wird dann nur der "ubergebene Kommentar ab Position 39 ausgegeben.
    Das ist im zweiten Beispiel dargestellt.

    Auch Variablenfelder k"onnen einfach mit \texttt{printvar} ausgegeben
    werden, dazu ist einfach der Variablenname inclusive des Z"ahlers an
    \texttt{printvar} zu "ubergeben (Beispiel 3).


\subsection{printend}

    Mit der Funktion \texttt{printend()} wird eine
    \eisfair\--Konfigurationsdatei abgeschlossen, d.h. es wird die
    Fusszeile "`\texttt{End}"'ausgegeben:

\begin{example}
Beispiel:
\begin{verbatim}
printend
\end{verbatim}
\end{example}



\section{Weitere verf"ugbare Skripte}


\subsection{/var/install/bin/ask}

    Das Skript \texttt{ask} dient zur interaktiven Abfrage einer Eingabe.
    Aus diesem Grund darf dieses Skript nicht im Zusammenhang mit webconf
    verwendet werden!

\begin{verbatim}
 /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

\end{verbatim}

\begin{example}
    Beispiele:
\begin{verbatim}
 ask "Kernel loeschen"
 ask "Kernel loeschen" "no"
 ask "Cronzyklus" "" "d|daily" "w|weekly" "m|monthly"
 ask "Hostname" "eistest" "*"
 ask "Hostname" "" "+" &gt;result
 answer=$(ask "Weiter" "y")
 ask "Anzahl" "3" "1-7" &gt;result
 answer=$(ask "Select" "" "1-15" "^$=Return" "0=Exit")
 ask --tty --info "Kernel loeschen" "no"

\end{verbatim}
\end{example}

 Um den R"uckgabewert von 'ask' bei einem Abruch mit CTRL-C abfangen zu
 k"onnen, hat sich die folgende Variante bew"ahrt:

\begin{example}
\begin{verbatim}
 _ask_tmpfile=$(/bin/mktemp -t ask.XXXXXXXXX)
 /var/install/bin/ask "Select" "" "1-8" "^$=Return" "0=Exit" &gt; ${_ask_tmpfile}
 rc=${?}
 read answer &lt; ${_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


\end{verbatim}
\end{example}



\subsection{/var/install/bin/choose}

    Ueber den Aufruf von \texttt{choose} kann eine Auswahlliste
    dargestellt werden. \texttt{choose} "ubernimmt dazu die gesamte
    Oberfl"achendarstellung.

\begin{itemize}
\item Darstellung in Tabellenform (mittels \texttt{techo})
\item Automatische Nummerierung der Zeilen
\item R"ucksprung ohne eine Auswahl
\item Vorw"arts- und r"uckw"artsbl"attern
\item Automatische Anpassung an Bildschirmgr"osse
      (horizontal und vertikal)
\item Direktanzeige einer gew"unschten Zeile beim Erstaufruf m"oglich
\item Deaktivieren einzelner Zeilen
\end{itemize}

    Sofern im Environment \texttt{SCROLL=$''$yes$''$} gesetzt ist, wird
    auf das Bl"attern verzichtet. Es werden dann immer alle Zeilen
    ausgegeben und der Anwender muss manuell scrollen.

    In diesem Fall sind verschiedene der obigen Features nat"urlich
    nicht verf"ugbar.

    choose kann nicht in Verbindung mit webconf genutzt werden.

    Syntax:

\begin{verbatim}
 /var/install/bin/choose ARRAY [START_POSITION]
\end{verbatim}

    Die "ubergabe der Daten an \texttt{choose} erfolgt analog der \eisfair
    Konfigurationsdateien als mehrdimensionales Array. Hierf"ur wird im
    Folgenden \texttt{MYARRAY} verwendet.

    Neben den eigentlichen Inhalten m"ussen folgende Werte "ubergeben
    werden:

\begin{example}
    Beispiel:
\begin{verbatim}
 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
\end{verbatim}
\end{example}


    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 "ubergeben:

\begin{example}
    Beispiel:
\begin{verbatim}
 MYARRAY_1_1="Test"
 MYARRAY_1_2="foo"
 MYARRAY_1_3="1234"
 MYARRAY_2_1="Beispiel"
 MYARRAY_2_2="bar"
 MYARRAY_2_3="5678"
\end{verbatim}
\end{example}

    Hier muss besonders darauf geachtet werden, dass die
    Anf"uhrungszeichen korrekt gesetzt werden:

\begin{example}
    Beispiele:
\begin{verbatim}
 eval MYARRAY_$row_1=\"foo\"
 eval MYARRAY_$row_1=\"'--info \"'foo bar foo bar'\"'\"
 eval MYARRAY_$row_1=\"'--warn \"'$FOOBAR'\"'\"
\end{verbatim}
\end{example}

    \achtung{Alle Werte m"ussen per export an Subshells "ubergeben
             werden!}

    Nun kann choose aufgerufen werden:

\begin{example}
    Beispiel:
\begin{verbatim}
 _ask_tmpfile=$(/bin/mktemp -t XXXXXXXXXXXXX)
 /var/install/bin/choose MYARRAY 89  &gt; ${_ask_tmpfile}
 rc=${?}
 read answer &lt; ${_ask_tmpfile}
 rm -f ${_ask_tmpfile}

 [ $rc = 255 ] &amp;&amp; exit 255
\end{verbatim}
\end{example}

    In diesem Beispiel wird mit der Anzeige direkt auf der Seite
    begonnen, auf der sich das im Array in Zeile 89 "ubergebene Element
    befindet.

\begin{example}
    R"uckgabewerte:
\begin{verbatim}
 ""                 Return ohne Auswahl; Ruecksprung in vorherige Ebene
 "1" - "9999"       Ausgewaehltes Element
 "0"                Ende; sofortiges Beenden der Anwendung
\end{verbatim}
\end{example}

    "uber die Angabe \texttt{MYARRAY\_ACTIVE=$''$no$''$} kann man einzelne
    Spalten aus der Auswahllsite ausblenden. Damit wird diese Spalte in
    der Auswahlliste nicht ber"ucksichtigt. 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"ussen.

    Um auf jeder Seite wiederkehrende Spalten"uberschriften ausgeben zu
    k"onnen, werden diese per

\begin{example}
    Spalten"uberschriften
\begin{verbatim}
 MYARRAY_CAPTION_1='--info "Spalte 1"'
 MYARRAY_CAPTION_2='--info "Spalte 2"'
\end{verbatim}
\end{example}

   "ubergeben. Die Verwendung von Spalten"uberschriften ist optional.

   Mittels \texttt{MYARRAY\_FLAGS} k"onnen die folgenden optionalen
   Parameter "ubergeben werden:

\begin{itemize}
\item \texttt{\textendash\textendash{spread}}
\item \texttt{\textendash\textendash{indent} \textit{12}}
\item \texttt{\textendash\textendash{showexit}}
\item \texttt{\textendash\textendash{list}}
\end{itemize}

   Bei der Angabe von \texttt{\textendash\textendash{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"ugbar,
   wenn die gesamte Liste auf einer Seite dargestellt werden kann.
   Ansonsten wird dieser Parameter ignoriert und es erfolgt eine normale
   Ausgabe.

   Mittels \texttt{\textendash\textendash{indent} \textit{12}} kann ein gr"osserer oder kleinerer
   linker Einzug angegeben werden.

   Bei der Angabe von \texttt{\textendash\textendash{showexit}} wird auf jeder Seite als letzter
   Punkt die Funktion "`0"' ausgegeben:

   Bei der Angabe von \texttt{\textendash\textendash{list}} werden keine
   Nummerischen Werte ausgegeben und es gibt auch keine Auswahl fuer
   Numerische Werte. Es ist dann eine Anzeige.

\begin{example}
    \texttt{\textendash\textendash{showexit}}
\begin{verbatim}
    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
\end{verbatim}
\end{example}

   Um eigene Werte, die nicht angezeigt werden sollen, im Array
   abzuspeichern muss der Bereich MY (\texttt{MYARRAY\_MY\_FOO}) verwendet
   werden. Dadurch kann es zu keinen "uberschneidungen der Namen bei
   zuk"unftigen Erweiterungen der "ubergabestruktur kommen.




\subsection{/var/install/bin/check-version}

    "uberpr"uft ein installiertes Paket auf seine Version

\begin{verbatim}
 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
\end{verbatim}

\begin{example}
    Beispiel:
\begin{verbatim}
 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
\end{verbatim}
\end{example}


\subsection{/var/install/bin/doc}

    Zeigt die Dokumentation eines Paketes an. Dabei ist der komplette
    Pfad zur Dokumentationsdatei mit zu "ubergeben.

\begin{verbatim}
 doc file
 doc file message

 file           Dateiname der Dokumentationsdatei
 message        Kopfzeile
\end{verbatim}

\begin{example}
    Beispiel:
\begin{verbatim}
 /var/install/bin/doc /usr/share/doc/foo/foo.txt "View foo documentation"
\end{verbatim}
\end{example}



\subsection{/var/install/bin/edit}

    Startet den Editor zum Editieren der Konfiguration

\begin{verbatim}
 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
\end{verbatim}



\subsection{/var/install/bin/add-menu}

    add-menu dient zur Erstellung eines Men"ueintrages (Untermen"u) f"ur
    das Setup

\begin{verbatim}
 add-menu [--menu] menu-file sub-menu-file comment
 add-menu --script menu-file script-file comment

 --menu         Untermenue (&lt;menu&gt;-Tag) erstellen   [default]
 --script       Skriptaufruf (&lt;script&gt;-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
                     &lt;menu file="sub-menu-file"&gt;comment&lt;/menu&gt;
                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
                     &lt;script file="script-file"&gt;comment&lt;/script&gt;
                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
\end{verbatim}



\subsection{/var/install/bin/create-menu}

    create-menu dient zum Anlegen einer komplett neuen Men"udatei

\begin{verbatim}
/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.
\end{verbatim}



\subsection{/var/install/bin/del-menu}

    del-menu dient zur Entfernung eines Men"ueintrags aus dem Setup

\begin{verbatim}
 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 &lt;menu file="sub-menu-file"&gt; 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 &lt;script file="script-file"&gt;comment&lt;/script&gt;
                mit dem angegebenen Skriptaufruf wird aus dem Menue
                entfernt, sofern es diese gibt.
\end{verbatim}



\subsection{/var/install/bin/add-user}

    F"ugt 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 k"onnen folgende
    Parameter "ubergeben werden:

\begin{verbatim}
 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
\end{verbatim}

\begin{example}
    Beispiel f"ur das Anlegen eines Benutzers:
\begin{verbatim}
 /var/install/bin/add-user \
     foo sdz8evwesdfs 2005 100 "User foo" /home/foo /bin/bash
\end{verbatim}
\end{example}

\begin{example}
    Beispiel f"ur das Anlegen eines Systembenutzers ohne
    Anmeldeberechtigung:
\begin{verbatim}
 /var/install/bin/add-user \
     firebird '*' 84 84 "Firebird SQL deamon" /var/firebird /bin/bash
\end{verbatim}
\end{example}

\begin{example}
    Beispiel f"ur das Anlegen eines Benutzers, der sich ohne Passwort
    anmelden darf:
\begin{verbatim}
 /var/install/bin/add-user \
     -d foo '' 2005 100 "User foo" /home/foo /bin/bash
\end{verbatim}
\end{example}



\subsection{/var/install/bin/modify-user}

    "andert 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"u angezeigt, "uber welches die "anderungen interaktiv
    durchgef"uhrt werden k"onnen.

\begin{verbatim}
 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
\end{verbatim}



\subsection{/var/install/bin/remove-user}

    Entfernt einen Benutzer vom System. Systembenutzer k"onnen dabei nur
    durch Setzen des Schalters \dq -f\dq entfernt werden.

\begin{verbatim}
 remove-user [-f] user do-remove-homedir

 -f             Systembenutzer loeschen
 user           Benutzername
 do-remove-homedir 'y' oder 'n' zum Loeschen des Basisverzeichnisses
\end{verbatim}

\begin{example}
    Beispiel f"ur das Entfernen eines Benutzers mit L"oschen des
    Basisverzeichnisses:
\begin{verbatim}
 /var/install/bin/remove-user foo y
\end{verbatim}
\end{example}

\begin{example}
    Beispiel f"ur das Entfernen eines Systembenutzers ohne L"oschen des
    Basisverzeichnisses:
\begin{verbatim}
 /var/install/bin/remove-user -f firebird n
\end{verbatim}
\end{example}



\subsection{/var/install/bin/add-group}

    F"ugt eine neue Gruppe zum System hinzu. Wenn das Skript ohne
    Parameter aufgerufen wird, werden die Daten einzeln abgefragt.

\begin{verbatim}
 add-group group gid

 group          Name der Gruppe
 gid            Gruppen ID Nummer
\end{verbatim}

\begin{example}
    Beispiel f"ur das Anf"ugen einer Gruppe:
\begin{verbatim}
 /var/install/bin/add-group foo 2001
\end{verbatim}
\end{example}



\subsection{/var/install/bin/remove-group}

    Entfernt eine Gruppe vom System. Systemgruppen k"onnen dabei nur
    durch Setzen des Schalters \dq -f\dq~entfernt werden.

\begin{verbatim}
 remove-group [-f] group

 -f             Systemgruppe loeschen
 group          Gruppenname
\end{verbatim}

\begin{example}
    Beispiel f"ur das Entfernen einer Gruppe:
\begin{verbatim}
 /var/install/bin/remove-group foo
\end{verbatim}
\end{example}



\subsection{/var/install/bin/install-local-package}

    "uber dieses Skript ist es m"oglich, 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"ugef"uhrt die Installation der Pakete
    erm"oglicht. Das Skript merkt sich die zuletzt verwendeten
    Verzeichnisse und bietet diese im interaktiven Modus zur Auswahl
    an.\\
    Zus"atzlich ist es m"oglich, dem Skript "uber die Kommandozeile ein
    Verzeichnis mitzugeben bzw. das L"oschen der tempor"aren index.txt
    oder eis-list.txt-Dateien auf Wunsch zu verhindern (-keep-all). Wer
    diese Installationsfunktion fest in das existierende
    eisfair-Installationsmen"u aufnehmen m"ochte, kann dies "uber den
    Switch '-add-menu' bewerkstelligen. Der Switch '-del-menu' entfernt
    den Men"ueintrag wieder.\\
    Falls man das Skript nur f"ur die Generierung der index.txt und
    eis-list.txt-Dateien verwenden m"ochte, kann man "uber den Switch
    '-no-install' den Aufruf der Installationsroutine verhindern.\\

    Die verschiedenen Startvarianten im "uberblick:

\begin{verbatim}
 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.
\end{verbatim}



\subsection{/var/install/bin/sort-menu}

    Dieses neue Skript erlaubt die alphabetische Sortierung von
    Men"u-Eintr"agen einer angegebenen Men"udatei.

\begin{verbatim}
 sort-menu menu-file-name

 menu-file-name     Name einer Menuedatei
\end{verbatim}


\subsection{/var/install/bin/check-package}

    Mit diesem Skript l"asst sich "uberpr"ufen, 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

\begin{verbatim}
 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"
\end{verbatim}

    Die Angabe von -v, \textendash\textendash{setversion} ist nicht zwingend, es kann auch nur
    auf das Paket gepr"uft werden.


\begin{example}

    Beispiel f"ur die Pr"ufung eines Paketes und das Auswerten des
    R"uckgabewertes.

    Als Parameter dient in diesem Beispiel
    EISFAX\_USER\_1\_PRN\_INFO='yes'
    F"ur das Drucken der Information wird das Paket 'a2ps' ben"otigt.

\begin{verbatim}

  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 &gt;/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

\end{verbatim}
\end{example}



\subsection{/var/install/bin/check-folder}

    Mit diesem Skript l"asst sich "uberpr"ufen, ob ein Folder/Verzeichnis
    vorhanden ist. Ist das nicht der Fall, wird das Verzeichnis im Dialog
    angelegt.

    Die Aufruf-Syntax:

\begin{verbatim}
  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"
\end{verbatim}


\subsection{/etc/init.d/functions}

    Dieses Skript stellt Funktionen f"ur das Init-Skript bereit.
    Es wird analog der eislib in das Init-Skript eingebunden. Das
    benutzen der eislib im Init-Skipt ist nicht erw"unscht.

\begin{example}
Beispiel f"ur ein Init-Script:
\begin{verbatim}
#!/bin/sh
# -----------------------------------------------------------------------
# /etc/init.d/foo - init script for foo
#
# Creation:     2010-12-30  hbfl
# Last Update:  2010-12-30  hbfl
#
# Copyright (c) 2001-2013 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


\end{verbatim}
\end{example}


    Die Funktionen im "Uberblick

\begin{description}

\item[\texttt{{boot\_mesg}}]
          \textbf{Ausgabe einer allgemeinen Meldung} \\
           Dies sollte der Standardfall bei der Ausgabe von Meldungen
           sein. Ein Beispiel daf"ur ist die Ausgabe von Statusmeldungen
           beim Starten oder Stoppen eines Dienstes. .
\end{description}


\begin{latexonly}
\begin{bildschirm}
\\ * Starting foo ...                                            \\
\end{bildschirm}
\end{latexonly}

\begin{htmlonly}
\begin{rawhtml}
&lt;CENTER&gt;
    &lt;TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0&gt;
        &lt;COL WIDTH=561&gt;
        &lt;TR&gt;
            &lt;TD WIDTH=561 VALIGN=TOP&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;PRE STYLE="background: #333333"&gt;

&lt;FONT COLOR="#ffffff"&gt; * Starting foo ...
            &lt;/PRE&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;/TD&gt;
        &lt;/TR&gt;
    &lt;/TABLE&gt;
&lt;/CENTER&gt;
\end{rawhtml}
\end{htmlonly}

\begin{description}
\item[\texttt{loadproc}]
          \textbf{Angabe des Programms das gestartet werden soll} \\
\item[\texttt{killproc}]
          \textbf{Angabe des Programms das gestoppt werden soll} \\

           Dabei wird automatisch das Ergebnis [\ \ OK\ \ ] [ FAIL ] [ WARN ]
           am rechten Rand der Arbeitsfl"ache hinter der boot\_mesg  Ausgabe gesetzt.
\end{description}


\begin{example}
    Beispiel:
\begin{verbatim}
    boot_mesg " * Starting foo ... "
    loadproc foo

\end{verbatim}
\end{example}


\begin{latexonly}
\begin{bildschirm}
\\ * Starting foo ...                                              [ \color{green} OK \color{white} ] \\
\end{bildschirm}
\end{latexonly}

\begin{htmlonly}
\begin{rawhtml}
&lt;CENTER&gt;
    &lt;TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0&gt;
        &lt;COL WIDTH=561&gt;
        &lt;TR&gt;
            &lt;TD WIDTH=561 VALIGN=TOP&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;PRE STYLE="background: #333333"&gt;

&lt;FONT COLOR="#ffffff"&gt; * Starting foo ...                                                         [ &lt;/FONT&gt;&lt;FONT COLOR="#008000"&gt; OK &lt;/FONT&gt;&lt;FONT COLOR="#ffffff"&gt; ] &lt;/FONT&gt;
            &lt;/PRE&gt;
            &lt;P&gt;&lt;BR&gt;
            &lt;/P&gt;
            &lt;/TD&gt;
        &lt;/TR&gt;
    &lt;/TABLE&gt;
&lt;/CENTER&gt;
\end{rawhtml}
\end{htmlonly}



\begin{description}
\item[\texttt{statusproc}]
          \textbf{Angabe des Programms f"ur das der Status ausgegeben werden soll} \\   .

\end{description}


Unhabh"angig von load- killproc lassen sich auch die Ausgaben von
 [\ \ OK\ \ ] [ FAIL ] [ WARN ] erzeugen.

\begin{description}
\item[\texttt{echo\_ok}]
          \textbf{Ausgabe von [\ \ OK\ \ ]} \\   .

\item[\texttt{echo\_failure}]
          \textbf{Ausgabe von [ FAIL ]} \\

\item[\texttt{echo\_warning}]
          \textbf{Ausgabe von [ WARN ]} \\
\end{description}

Diese Ausgaben erfolgen jeweils eine Zeile H"oher an den rechten
Rand der Arbeitsfl"ache.

\begin{example}
    Beispiel:
\begin{verbatim}
    boot_mesg " Do foo ... "
    _do_foo
    retval="${?}"
    if [ "${retval}" -eq 0 ]
    then
        echo_ok
    else
        echo_failure
        _do_bar
    fi
\end{verbatim}
\end{example}

Das Skript functions unterdr"uckt die Ausgaben auf die Console, wenn
der Parameter \_quiet=true gesetzt ist.


\subsection{/var/install/bin/convert-encoding}

    Mit diesem Skript l"asst 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"uhrt, wenn das System in ISO-8859-15 laeuft
    wird das Skript nach ISO-8859-15 Kodiert.

    Die Aufruf-Syntax:

\begin{verbatim}
  convert-encoding
                    /pfad/zum/skript/

  Example:
convert-encoding  /tmp/myfolder/myskript
\end{verbatim}

</pre></body></html>