6. eisfair Konfigurationsschicht¶
6.1. Grundlagen der eisfair Konfiguration¶
Das wohl wichtigste Merkmal von eisfair ist die für alle Pakete einheitliche Konfiguration. Deshalb ist die Nutzung der eisfair-Konfigurationsschicht eine absolute Voraussetzung für ein eisfair-Paket.
Im Folgenden wird der Aufbau einer solchen eisfair-Konfigurationsdatei sowie die damit zusammenhängenden Mechanismen beschrieben.
6.2. Speicherung der Konfiguration¶
Die aktuelle Konfiguration eines Pakets wird immer in der Datei
/etc/config.d/$package
gespeichert. Der Aufbau der
Konfigurationsdateien ist weiter unten detailliert beschrieben.
Diese Datei wird bei einem eisfair-Paket nicht mitgeliefert, da diese bei der Installation eine eventuell bereits vorhandene Konfiguration einer vorher installierten Version des Pakets überschreiben würde. Bei einer Erstinstallation muss diese aber erstellt werden. Das kann z.B. durch Kopieren der Standardkonfigurationsdatei erfolgen. (Siehe auch Kapitel Paketinstallation)
Die Standardkonfigurationsdatei liegt unter /etc/default.d/$package
.
Diese Datei muss in einem eisfair-Paket mitgeliefert werden. In ihr
muss das Paket deaktiviert sein, d.h. die Startvariable START_$PACKAGE
muss auf „no“ gesetzt sein.
Bei jedem Editieren einer Konfiguration wird mittels ACFH - Advanced
Configuration File Handling eine Sicherheitskopie der letzten
Konfiguration unter /etc/backup.d/$package
erstellt. Die Verwaltung
dieser Sicherheitskopien erfolgt mittels der ACFH-Funktionalität und
muss nicht in jedem Paket einzeln implementiert werden.
6.2.1. Aufbau einer eisfair-Konfigurationsdatei¶
Beispiel für eine eisfair-Konfigurationsdatei (Paket foo):
# -----------------------------------------------------------------------
# /etc/config.d/foo - foo configuration parameters
#
# Creation: 2005-02-01 max
# Last Update: 2005-03-06 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.
# -----------------------------------------------------------------------
# -----------------------------------------------------------------------
# General settings
# -----------------------------------------------------------------------
START_FOO='no' # start foo: yes or no
FOO_GENERAL_SETTING='60' # time for foo
FOO_ANOTHER_SETTING='Test' # text for foo
FOO_LONG_COMMNET='yes' # you can write long comments by
# using more than one line...
# -----------------------------------------------------------------------
# Second Group
#
# You can give a detailed description of this group inside
# the comment
# -----------------------------------------------------------------------
FOO_ARRAY_N='3' # number of elements in array
FOO_ARRAY_1_ACTIVE='yes' # is element active: yes or no
FOO_ARRAY_1_TEXT='Sample' # some text for an array element
FOO_ARRAY_1_VALUE='12345' # a number for this element
FOO_ARRAY_2_ACTIVE='no' # is element active: yes or no
FOO_ARRAY_2_TEXT='Inactive' # some text for an array element
FOO_ARRAY_2_VALUE='' # a number for this element
FOO_ARRAY_3_ACTIVE='yes' # is element active: yes or no
FOO_ARRAY_3_TEXT='Something' # some text for an array element
FOO_ARRAY_3_VALUE='999' # a number for this element
# -----------------------------------------------------------------------
# End
# -----------------------------------------------------------------------
Damit die Konfiguration mittels eines eisfair-Konfigurationseditors bearbeitet werden kann, ist die Struktur der Konfigurationsdatei zwingend einzuhalten. Im Folgenden werden die einzelnen Blöcke näher beschrieben.
Generell werden spezielle Blöcke mittels der Trennzeilen „#-----
“
gekennzeichnet.
6.2.2. Kopfbereich und Fußbereich¶
Vor der eigentlichen Konfiguration steht der Kopfbereich, der im Allgemeinen der GPL-Header ist und einen Verweis auf die GPL enthält, da wohl die meisten Pakete unter der GPL stehen werden.
Am einfachsten sollte der hier angegebene Kopfbereich einfach übernommen und nur die relevanten Inhalte angepasst werden.
Als Fußbereich wird das Ende der Datei mit „# End
“ gekennzeichnet.
6.2.3. Gruppenstruktur¶
Die gesamte Konfiguration wird in einzelne Gruppen unterteilt. Jede
Gruppe wird über den Gruppenkopf näher beschrieben. Dieser wird
mittels einer Trennzeile „#-----
“ eingeleitet und abgeschlossen.
Dazwischen steht in der ersten Zeile der Gruppenname und in den Folgezeilen ein optionaler Kommentar zur gesamten Gruppe. Dort können nähere Angaben zu den in der Gruppe zu konfigurierenden Funktionen gemacht werden (aber hier noch ohne Bezug zur einzelnen Konfigurationsvariable).
6.2.4. Konfigurationsvariablen¶
Innerhalb der einzelnen Gruppen stehen die Konfigurationsvariablen.
Unter diesen nimmt die Startvariable START_$PACKAGE
eine
Sonderstellung ein. Durch diese Variable wird das gesamte Paket
aktiviert bzw. deaktiviert.
Alle anderen Variablen haben die Form $PACKAGE_OPTION
, d.h. jede der
Variablen bekommt als Präfix den Paketnamen. Die anderen
Namensbestandteile werden mittels des Unterstrichs „_
“ abgetrennt.
Konfigurationsvariablen werden prinzipiell durchgehend groß geschrieben.
Jede Konfigurationsvariable kann mit einem eigenen Kommentar näher
beschrieben werden. Dieser Kommentar kann dabei entweder hinter der
Variable stehen (mittels mindestens eines Leerzeichens plus einem
Kommentarzeichen „#
“ abgetrennt) oder in der Folgezeile. In diesem
Fall muss der Kommentar mittels eines oder mehrerer Leerzeichen
eingerückt sein, das Kommentarzeichen darf also nicht in der
ersten Spalte stehen.
Mehrzeilige Kommentare sind möglich, dabei dürfen die Kommentarzeichen in keiner Zeile in der ersten Spalte stehen.
Um Optionen anzugeben, die in einer variablen Anzahl auftreten können,
müssen mehrere Felder verwendet werden. Diese bestehen aus einer
Variable, die die Anzahl der Werte angibt (FOO_ARRAY_N
) und den
eigentlichen Optionen (FOO_ARRAY_1_TEXT, FOO_ARRAY_1_VALUE
). Diese
treten dann je nach angegebener Anzahl mehrfach auf.
Um einzelne Ausprägungen auch innerhalb der Liste ausblenden zu
können, ohne jedesmal die gesamte Liste umnummerieren zu müssen,
empfiehlt sich die Verwendung einer Aktivierungsvariable (\FOO_ARRAY_1_ACTIVE
).
Diese muss dann im paketspezifischen Script geprüft werden.
Mehrdimensionale Felder können in der Form (FOO_ARRAY_1_SUBARRAY_2_VALUE
)
angegeben werden. Dazu müssen dann je
Ausprägung der ersten Dimension die Anzahl der Ausprägungen der
zweiten Dimension angegeben werden (FOO_ARRAY_1_SUBARRAY_N
).
6.2.5. Prüfen der Konfiguration¶
Sobald ein Anwender eine Konfiguration über das eisfair-Menü (über das edit-Script) geändert hat, wird diese auf Gültigkeit überprüft. Dazu wird das Programm eischk benutzt, das im weiteren Verlauf dieses Kapitels näher beschrieben wird.
/etc/check.d/$package
/etc/check.d/$package.exp
/etc/check.d/$package.ext
In der Datei /etc/check.d/$package
wird dabei die eigentliche Prüfung
mit Abhängigkeiten und Feldern definiert. Dazu stehen die in
/etc/check.d/base.exp definierten Regulären Ausdrücke zur Verfügung.
Sofern für die Überprüfung einer eigenen Variable die vordefinierten
Ausdrücke nicht ausreichend sind, so können in der Datei
/etc/check.d/$package.exp
eigene Reguläre Ausdrücke definiert werden.
Die Namen dieser eigenen Ausdrücke müssen dabei den Paketnamen als Präfix
enthalten (Beispiel: $PACKAGE_VALUES
).
In der Datei /etc/check.d/$package.ext
können mit einer
Scriptsprache zudem weitergehende Prüfungen implementiert werden.
6.2.6. Hilfedatei zur Konfiguration¶
In dem neueren Konfigurationseditor (ECE) können dem Anwender
weitergehende Hilfetexte angezeigt werden. Diese müssen dazu in der
Datei /var/install/help/$package
hinterlegt werden.
Zeilenumbrüche werden in dieser Datei mit dem Tag <br/>
gekennzeichnet, Kommentare können XML-Konform mittels
<!--
Kommentar -->
eingefügt werden.
Der Hilfetext jeder einzelnen Variable wird mittels des Tags <help>
in
dieser Datei hinterlegt.
Die Datei hat damit folgendes Format:
Beispiel für eine eisfair-Hilfedatei (Paket foo):
<!--
# -----------------------------------------------------------------------
# /var/install/help/foo - helptexts for package foo
#
# Creation: 2005-02-01 max
# Last Update: 2005-03-06 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.
# -----------------------------------------------------------------------
-->
<help name="FOO_GENERAL_SETTING">
Hier koennen Sie eine Zeitspanne fuer das Paket foo
definieren.
<br/><br/>
Default: 60
</help>
<!-- Dies ist ein Kommentar -->
<help name="FOO_ARRAY_%_ACTIVE">
Die Konfigurationsvariable FOO_ARRAY_%_ACTIVE dient
zur Aktivierung bzw. Deaktivierung der einzelnen
Eintraege.
<br/><br/>
Default: yes
</help>
6.3. Anwenden der Konfiguration¶
Nach erfolgreicher Prüfung der Konfiguration muss diese aktiviert („apply“) werden. Dieser Vorgang wird vollständig im allgemeinen Edit- Script gekapselt.
Für diesen Mechanismus müssen zwei paketspezifische Dateien bereitstehen:
/var/install/config.d/$package.sh
/etc/init.d/$package
Die Datei /var/install/config.d/$package.sh
dient dabei zum
Generieren der Konfiguration der im Paket verwendeten Software aus der
eisfair Konfigurationsdatei. Es handelt sich hier also um das Apply im
eigentlichen Sinne.
Warnung
Da eischk die Konfiguration nicht überprüft, wenn
START_$PACKAGE='no'
gesetzt ist, darf in diesem Fall kein
Neuschreiben der Konfiguration erfolgen!
Dieses Skript muss im Erfolgsfall den Wert 0 zurückgeben (exit 0
).
Im Fehlerfall muss ein Wert ungleich 0 zurückgegeben werden. Dies
bewirkt, dass der Neustart des Basisdienstes über /etc/init.d/$package
nicht ausgeführt wird.
Im Script /etc/init.d/ $package muss der Befehl restart unterstützt werden. Dieser Befehl wird beim Aufruf als einziger Parameter übergeben. Bei Aufruf mit restart muss der Dienst neu gestartet bzw. es muss die Konfiguration so eingelesen werden, dass diese wirksam wird.
Weitere Details dazu können in den Kapiteln Menü sowie Bootprozess und Shutdown nachgeschlagen werden.
6.4. ACFH - Advanced Configuration File Handling¶
6.4.1. ACFH Grundlagen¶
Das Advanced Configuration File Handling (ACFH) bietet die
Möglichkeit, Generationen von Konfigurationsdateien in einem
Verzeichnis (/etc/backup.d/
) sichern zu lassen. Dies geschieht bei
Nutzung des Skripts /var/install/bin/edit
automatisch.
Die gesicherten Konfigurationsdateien tragen den Namen
$package.YYYY-MM-DD-HH-MI-SS,
also z.B. base.2005-03-08-17-57-24.
Die Anzahl der vorzuhaltenden Generationen von Konfigurationsdateien
wird bestimmt durch den Wert der Environmentvariablen
MAX_BACKUP_CONFIG
in der Datei /etc/config.d/environment
. Übersteigt
die Anzahl der Konfigurationsdateien für ein Paket die in
MAX_BACKUP_CONFIG
angegebene Anzahl, so wird jeweils die älteste
Konfigurationsdatei gelöscht.
Über ein vorbereitetes Menü des ACFH und entsprechende Skripts lassen sich die Funktionen des ACFH aufrufen. An der Stelle base steht jeweils der entsprechende Paketname.
Beispiel:
Advanced base-configuration file handling.
1: Restore configuration file from default directory
2: Restore configuration file from backup directory
3: Backup configuration file to backup directory
4: Show difference between current and default configuration
5: Show difference between current and a backup configuration
6: Show difference between default and a backup configuration
7: Show difference between two backup configurations
0: Exit
Select (1-7, ENTER=Return 0=Exit)
Die einzelnen Menüpunkte können allerdings nur dann erfolgreich aufgerufen werden, wenn die entsprechenden Konfigurationsdateien vorhanden sind.
6.4.2. Einbinden von ACFH¶
Die Einbindung von ACFH in ein Paket ist mit dem neuen Menüformat (XML-Menü) sehr einfach geworden.
Um für ein Paket das ACFH-Untermenü aufrufen zu können sind nur zwei Zeilen im entsprechenden Paket-Menü notwendig.
<package>$package</package>
<menu file="setup.services.advancedconfig.menu">
Advanced configuration file handling</menu>
Das <menu>
-Tag muss in einer Zeile stehen.
Über das <package>
-Tag wird einerseits die Anzeige im Untermenü
(siehe Beispiel oben paketname=base) gesteuert, andererseits auch für
die aufzurufenden Skripte eingestellt, um welches Paket und damit um
welche Konfigurationsdateien es sich handelt.
Der über das <package>
-Tag eingestellt Paketname wird in der
Environmentvariablen $PACKAGE
gespeichert. Diese Variable darf nicht
anderweitig benutzt oder gar gelöscht werden. Daher steht im ACFH-
Untermenü selbst (Datei setup.services.advancedconfig.menu
) kein
<package>
-Tag.
6.5. eischk¶
Um die Konfigurationsfehler in Paketen möglichst auszuschliessen wird
für jedes Paket, welches eine Config-Datei besitzt, auch eine eischk-Datei
angelegt: /etc/check.d/$package
. In ihr sind alle Variablen
der Konfigurationsdatei einzutragen. Der Aufbau gliedert sich dabei in
4 Spalten, die wie folgt belegt sind:
6.5.1. VARIABLE¶
Diese Spalte gibt den Namen der zu überprüfenden Variable aus der Config-Datei an. Wenn es sich dabei um eine Variable handelt, die mehrmals mit verschiedenen Nummern auftauchen kann, wird an Stelle der Nummer ein Prozentzeichen (%) als Platzhalter in den Variablennamen eingefügt. Mehrere Prozentzeichen zur Überprüfung mehrdimensionaler Arrays sind zulässig. Sollten Variablen nur unter bestimmten Konfigurationsbedingungen benötigt werden, so sind sie als Optional zu kennzeichnen. Dazu wird vor die Variable ein „+“ Zeichen vorangestellt. Soll ein gesamtes Array optional sein, dann ist der Zählvariable (z.B. FOO_N ) ebenfalls ein „+“ voranzustellen. In diesem Fall müssen aber auch die Array-Elemente als optional gekennzeichnet werden.
Beispiele:
optionale Variable:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
+FOO_NAME - - NONE
optionales Element in einem Array:
FOO_N - - NUMERIC
++FOO_%_VALUE1 - FOO_N NONE
FOO_%_VALUE2 - FOO_N NONE
optionales Array:
+FOO_N - - NUMERIC
++FOO_%_VALUE1 - FOO_N NONE
++FOO_%_VALUE2 - FOO_N NONE
optionales mehrdimensionales Array:
+FOO_N - - NUMERIC
++FOO_%_VALUE_N - FOO_N NUMERIC
++FOO_%_VALUE_%_VAL1 - FOO_%_VALUE_N NONE
6.5.2. OPT_VARIABLE¶
Bei Bedarf kann in dieser Spalte eine Abhängigkeit zu einer anderen
Variable (OPT_VARIABLE
) definiert werden. Dadurch findet eine
Überprüfung nur dann statt, wenn die OPT_VARIABLE
auf yes
steht.
Der Name der OPT_VARIABLE
darf keine Platzhalter für Arrays (%)
enthalten. Gibt es keine OPT_VARIABLE
, ist hier ein „-“ anzugeben.
Ab dem base-Paket v1.3.0 dürfen Platzhalter für Arrays (%) enthalten
sein.
Beispiel:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
--------------------------------------------------------------------------------------
EISFAX_ANALOG_USE START_EISFAX - YESNO
EISFAX_ANALOG_N EISFAX_ANALOG_USE - NUMERIC
EISFAX_ANALOG_%_NAME EISFAX_ANALOG_USE EISFAX_ANALOG_N NONE
EISFAX_ANALOG_%_ACTIVE EISFAX_ANALOG_USE EISFAX_ANALOG_N YESNO
EISFAX_ANALOG_%_DEVICE EISFAX_ANALOG_%_ACTIVE EISFAX_ANALOG_N NOTEMPTY
EISFAX_ANALOG_%_SND EISFAX_ANALOG_%_ACTIVE EISFAX_ANALOG_N YESNO
EISFAX_ANALOG_%_SND_TO EISFAX_ANALOG_%_SND EISFAX_ANALOG_N NONE
EISFAX_ANALOG_%_SND_TYPE EISFAX_ANALOG_%_SND EISFAX_ANALOG_N EISFAX_FTYPE
EISFAX_ANALOG_%_PRN EISFAX_ANALOG_%_ACTIVE EISFAX_ANALOG_N YESNO
EISFAX_ANALOG_%_PRN_QUE EISFAX_ANALOG_%_PRN EISFAX_ANALOG_N EISFAX_PQUEUE
EISFAX_ANALOG_%_PRN_TYPE_GS EISFAX_ANALOG_%_PRN EISFAX_ANALOG_N YESNO
EISFAX_ANALOG_%_PRN_DRV EISFAX_ANALOG_%_PRN_TYPE_GS EISFAX_ANALOG_N NONE
6.5.3. VARIABLE_N¶
Steht in der ersten Spalte eine Variable mit einem Platzhalter (%) im
Namen, so wird hier die Variable angegeben, die die Häufigkeit des
Auftretens der Variable definiert. Für mehrdimensionale Array sind
auch hier (%) Zeichen im Namen zulässig. Gibt es keine VARIABLE_N
, ist
hier ein „-“ anzugeben.
Beispiel 1:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
BIND9_N - - NUMERIC
BIND9_%_NAME - BIND9_N DOMAIN
BIND9_%_MASTER - BIND9_N YESNO
BIND9_%_NETWORK - BIND9_N IPADDR
Beispiel 2 - mehrdimensionale Arrays mit optionalen Parametern:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
++BIND9_%_NS_N - BIND9_N NUMERIC
++BIND9_%_NS_%_NAME - BIND9_%_NS_N FQDN
6.5.4. VALUE¶
Diese Spalte enthält die Überprüfungrichtlinie des Inhaltes der Variable. Sie sollte im Interesse einer geringen Fehlerquote möglichst exakt die Eingabemöglichkeiten eingrenzen. Dabei kann auf eine grosse Anzahl von fertigen Definitionen zurückgegriffen, aber auch mittels sogenannter „Regular Expressions“ eigene erstellt werden.
Folgende Definitionen sind bereits vorhanden:
Name |
Bedeutung |
Beispiele |
---|---|---|
NONE |
Keine Überprüfung durchführen |
|
NOTEMPTY |
Inhalt darf nicht leer sein |
foo-12 |
NOBLANK |
Es dürfen keine Leerzeichen enthalten sein |
foo |
ENOBLANK |
Kein Eintrag - oder Eintrag wie unter NOBLANK |
“ “ | foo |
NUMERIC |
Nur Zahlen sind zulässig |
01234 |
ENUMERIC |
Kein Eintrag - oder Eintrag wie unter NUMERIC |
“ “ | 01234 |
NUMERIC_1 |
Nur Zahlen größer gleich 1 |
1234 |
ENUMERIC_1 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_1 |
“ “ | 1234 |
NUMERIC16 |
Nur Zahlen im Bereich 0 - 16 |
01234 … 16 |
NUMERIC_0_16 |
Nur Zahlen im Bereich 0 - 16 |
01234 … 16 |
ENUMERIC_0_16 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_0_16 |
“ “ | 01234 … 16 |
NUMERIC_1_16 |
Nur Zahlen im Bereich 0 - 16 |
1234 … 16 |
ENUMERIC_1_16 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_1_16 |
“ “ | 1234 … 16 |
NUMERIC100 |
Nur Zahlen im Bereich 0 - 100 |
01234 … 100 |
NUMERIC_0_100 |
Nur Zahlen im Bereich 0 - 100 |
01234 … 100 |
ENUMERIC_0_100 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_0_100 |
“ “ | 01234 … 100 |
NUMERIC_1_100 |
Nur Zahlen im Bereich 1 - 100 |
1234 … 100 |
Name |
Bedeutung |
Beispiele |
---|---|---|
ENUMERIC_1_100 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_1_100 |
“ “ | 1234 … 100 |
NUMERIC9999 |
Nur Zahlen im Bereich 0 - 9999 |
01234 … 9999 |
NUMERIC_0_9999 |
Nur Zahlen im Bereich 0 - 9999 |
01234 … 9999 |
ENUMERIC_0_9999 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_0_9999 |
“ “ | 01234 … 9999 |
NUMERIC_1_9999 |
Nur Zahlen im Bereich 1 - 9999 |
1234 … 9999 |
ENUMERIC_1_9999 |
Kein Eintrag - oder Eintrag wie unter NUMERIC_1_9999 |
“ “ | 1234 … 9999 |
DOT_NUMERIC |
Zwei Zahlen durch einen Punkt getrennt |
12.5 |
EDOT_NUMERIC |
Kein Eintrag - oder Eintrag wie unter DOT_NUMERIC |
“ “ | 12.5 |
NUM_HEX |
Hexadezimale Zahl - startend mit 0x |
0xff12 |
NUM_ANY |
Zahlen in numerischer oder hexadezimaler Schreibweise |
123 / 0xff12 |
YESNO |
Nur yes oder no sind erlaubt |
yes / no |
MACADDR |
Mac Adresse einer Netzwerkkarte |
00:00:E8:83:72:92 |
EMACADDR |
Kein Eintrag oder Eintrag wie unter MACADDR |
“ “ | 00:00:E8:83:72:92 |
HOSTNAME |
Hostname bestehend aus Buchstaben, Zahlen und Bindestrich |
foo-1 |
EHOSTNAME |
Kein Eintrag oder Eintrag wie unter HOSTNAME |
“ “ | foo-1 |
DOMAIN |
Domainname inclusive Endung |
bar.local |
EDOMAIN |
Kein Eintrag - oder Eintrag wie unter DOMAIN |
“ “ | bar.local |
Name |
Bedeutung |
Beispiele |
---|---|---|
FQDN |
Vollständiger Internetname - host.domain.location |
foo-1.bar.local |
EFQDN |
Kein Eintrag - oder Eintrag wie unter FQDN |
“ “ | foo-1.bar.local |
OCTET |
Zahl im Bereich von 0 bis 255 |
128 |
OCTET6 |
HEX Wert im Bereich 0 und ffff |
fe80 |
IPADDR |
Gültige IP-Adresse, bestehend aus 4x OCTET |
192.168.0.128 |
EIPADDR |
Kein Eintrag - oder Eintrag wie unter IPADDR |
“ “ | 192.168.0.128 |
IPADDRESSES |
Eine oder mehrere IP-Adressen durch Leerzeichen getrennt |
192.168.0.1 192.168.0.2 192.168.0.3 |
EIPADDRESSES |
Kein Eintrag - oder Eintrag wie unter IPADDRESSES |
“ “ | 192.168.0.1 192.168.0.2 |
IPADDR6 |
Gültige IP-Adresse, bestehend aus bis zu 7x OCTET6 |
fe80::218:7dff:fe12:7e52 |
EIPADDR6 |
Kein Eintrag - oder Eintrag wie unter IPADDR6 |
“ “ | fe80::218:7dff:fe12:7e52 |
IPADDR6COMPAT |
Gültige IP-Adresse, bestehend aus bis zu 6x OCTET6 |
fe80::218:7dff:fe12:7e52 |
EIPADDR6COMPAT |
Kein Eintrag - oder Eintrag wie unter IPADDR6COMPAT |
“ “ | fe80::218:7dff:fe12:7e52 |
IPADDRESSES6 |
Eine oder mehrere IPv6-Adressen |
fe80::218:7dff:fe12:7e52 fe80::218:7dff. |
EIPADDRESSES6 |
Keine oder mehrere IPv6-Adressen |
“ “ | fe80::218:7dff:fe12:7e52 …. |
IPADDR46 |
Eine IPv4- oder IPv6-Adresse |
fe80::218:7dff:fe12:7e52 |
EIPADDR46 |
Keine oder eine IPv4- oder IPv6-Adresse |
“ “ | fe80::218:7dff:fe12:7e52 |
IPADDRESSES46 |
Eine oder mehrere IPv4- oder IPv6-Adressen |
fe80::218:7dff:fe12:7e52 fe80::218:7dff. |
EIPADDRESSES46 |
Keine oder mehrere IPv4- oder IPv6-Adressen |
“ “ | fe80::218:7dff:fe12:7e52 fe80:… |
Name |
Bedeutung |
Beispiele |
---|---|---|
DNS_SPEC |
DOMAIN und IP-Adresse durch Leerzeichen getrennt |
bar.local 192.168.0.1 |
MASK |
Zahl zwischen 0 und 32 |
32 |
NETWORK |
Kombination aus IP-Adresse, Trennstrich und Maske |
192.168.0.0/24 |
NETWORKS |
Ein oder mehrer Netzwerke durch Leerzeichen getrennt |
192.168.0.0/24 192.168.1.0/24 |
ENETWORKS |
Kein Eintrag - oder Eintrag wie unter NETWORKS |
“ “ | 192.168.0.0/24 192.168.1.0/24 |
MULTIPLE_NETWORKS |
Ein oder mehrer Netzwerke durch Leerzeichen getrennt |
192.168.0.0/24 192.168.1.0/24 |
EMULTIPLE_NETWORKS |
Kein Eintrag - oder Eintrag wie unter MULTIPLE_NETWORKS |
“ “ | 192.168.0.0/24 192.168.1.0/24 |
IPADDR_NETWORK |
IP-Adresse und Netzwerk durch Leerzeichen getrennt |
192.168.0.1 192.168.1.0/24 |
EIPADDR_NETWORK |
Kein Eintrag - oder Eintrag wie unter IPADDR_NETWORK |
“ “ | 192.168.0.1 192.168.1.0/24 |
MAILADDR |
Vollständige E-Mail Adresse |
foo@bar.local |
EMAILADDR |
Kein Eintrag - oder Eintrag wie unter MAILADDR |
“ “ | foo@bar.local |
CRONTAB |
Crontab Eintrag: Minute Stunde Tag Monat Wochentag |
15 3 * * fri |
ECRONTAB |
Kein Eintrag - oder Eintrag wie unter CRONTAB |
“ “ | 15 3 * * fri |
DISK |
Festplattenname |
hda, sda, c0d1 |
PARTITION |
Festplattenbereich |
hda1, sda2, c0d1p1 |
REL_PATH |
Relatives Verzeichnis |
install/menu |
Name |
Bedeutung |
Beispiele |
---|---|---|
E_REL_PATH |
Kein Eintrag - oder Eintrag wie unter REL_PATH |
“ “ | install/menu |
ABS_PATH |
Absolutes Verzeichnis |
/var/install/menu |
E_ABS_PATH |
Kein Eintrag - oder Eintrag wie unter ABS_PATH |
“ “ | /var/install/menu |
LOG_INTERVAL |
Als Werte sind daily, weekly oder monthly möglich |
daily / weekly / monthly |
PORT |
Kommunikationsport im Bereich von 1 - 65535 |
3050 |
EPORT |
Kein Eintrag - oder Eintrag wie unter PORT |
“ “ | 3050 |
ETH_BASE_DEV_NAME |
Netzwerk der Ethernet Schnittstelle |
eth0 |
ETH_DEV_NAME |
Erweiterter Name der Netzwerk Ethernet Schnittstelle |
eth0:3 |
TR_BASE_DEV_NAME |
Netzwerk der Tokenring Schnittstelle |
tr2 |
TR_DEV_NAME |
Erweiterter Name der Netzwerk Tokenring Schnittstelle |
tr2:1 |
BR_BASE_DEV_NAME |
Netzwerk der Bridge Schnitstelle |
br1 |
BR_DEV_NAME |
Erweiterter Name der Nertzwerk Bridge Schnittstelle |
br1:2 |
BOND_BASE_DEV_NAME |
Netzwerk der Bonding Schnittstelle |
bond0 |
BOND_DEV_NAME |
Erweiterter Name der Netzwerk Bonding Schnittstelle |
bond0:1 |
XEN_BASE_DEV_NAME |
Netzwerk der XEN Brigde Schnitttelle |
xenbr0 |
XEN_BASE_NAME |
Erweiterter Name der Netzwerk XEN Bridge Schniststelle |
xenbr0:1 |
DUMMY_DEV_NAME |
Platzhalter Schnittstelle (Dummy) |
dummy0 |
Name |
Bedeutung |
Beispiele |
---|---|---|
VENET_BASE_DEV_NAME |
Netzwerk der Venet Schnitstelle |
venet0 |
VENET_DEV_NAME |
Erweiterter Name der Netzwerk Venet Schnittstelle |
venet0:1 |
EN_BASE_DEV_NAME |
Netzwerk der Ethernet Schnittstelle |
enp0s7u10 |
EN_DEV_NAME |
Erweiterter Name der Ethernet Netzwerk Schnittstelle |
enp0s7u10:1 |
WL_BASE_DEV_NAME |
Netzwerk der Wlan Schnittstelle |
wlp0s7u10 |
WL_DEV_NAME |
Erweiterter Name der Wlan Netzwerk Schnittstelle |
enp0s7u10:1 |
VLAN_DEV_NAME |
Netzwerk der Vlan Schnittstelle |
vlan0 |
TUN_DEV_NAME |
Netzwerk der tun Schnittstelle |
tun0 |
TAP_DEV_NAME |
Netzwerk der tap Schnittstelle |
tap0 |
PPP_DEV_NAME |
Netzwerk der ppp Schnittstelle |
ppp0 |
IP_NET_NAME |
Ethernet, Tokenring, Bridge oder Dummy Schnittstelle |
eth0:2 / br1 / tr0 / dummy0 |
EIP_NET_NAME |
Ethernet, Tokenring, Bridge oder Dummy Schnittstelle |
eth0:2 / br1 / tr0 / dummy0 |
IP_ROUTE |
Netzwerkroute (network netmask gateway) |
192.168.1.0 255.255.255.0 192.168.1.254 |
IP_ROUTE_CIDR |
Netzwerkroute (network/cidr gateway) |
192.168.1.0/24 192.168.1.254 |
PASSWD |
Spezielle Regel, die die Sichtbarkeit im ECE beeinflusst. In der Ansicht wird der Wert der Option mit dem Zeichen ‚*‘ maskiert. Die Werteeingabe erfolgt über einen speziellen Dialog zur Passworteingabe. |
********** |
READONLY |
Spezielle Regel, die die Sichtbarkeit im ECE beeinflusst. In der Ansicht wird der Wert der Option inaktiv dargestellt. Eine Bearbeitung des Wertes wird vom Programm unterbunden. |
|
HIDDEN |
Spezielle Regel, die die Sichtbarkeit im ECE beeinflusst. In der Ansicht wird der Wert nicht dargestellt. |
|
CONSOLE_KEYMAP |
Tastaturlayout |
für Deutsch: de-latin1 |
Name |
Bedeutung |
Beispiele |
---|---|---|
CONSOLEFONT_NAME |
Konsolefontname |
lat0-16 |
MODULE_ACTION |
Modul zum laden |
loop |
TIME_ZONE |
Zeitzone |
Europe/Berlin |
BUSID |
BusID der Ethernet Schnittstelle |
0000:??:??.? |
EBUSID |
Kein Eintrag - oder Eintrag wie unter BUSID |
“ “ | 0000:??:??.? |
BUSID_LOCAL_CUI |
BusID der Ethernet Schnittstelle |
0000:??:??.? |
EBUSID_LOCAL_CUI |
Kein Eintrag - oder Eintrag wie unter BUSID_LOCAL_CUI |
“ “ | 0000:??:??.? |
MACADDR_LOCAL_CUI |
Macaddr der Ethernet Scnnittselle |
00:00:E8:83:72:92 |
EMACADDR_LOCAL_CUI |
Kein Eintrag - oder Eintrag wie unter MACADDR_LOCAL_CUI |
“ “ | 00:00:E8:83:72:92 |
IP_NET_NAME_LOCAL_CUI |
Name der Netzwerk Schnittstelle |
net0, lan0 |
EIP_NET_NAME_LOCAL_CUI |
Kein Eintrag - oder ein Eintrag wie IP_NET_NAME_LOCAL_CUI |
“ “ | net0, lan0 |
UDEV_DEV_NAME |
wie EN_DEV_NAME, WL_DEV_NAME |
Da auch mit diesen Möglichkeiten nicht jeder Anwendungsfall abzudecken ist, gibt es die Möglichkeit, eigene Überprüfungen zu definieren. Diese werden durch die Buchstaben “ RE:“ für Regular Expressions eingeleitet.
Beispiel:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
COLOR - - RE:red|green|blue
So kann eine einfache Parameterauswahl realisiert werden. Alle anderen
Eingaben als „red“, „green“ oder „blue“ werden abgelehnt. Ein
komfortablerer Weg stellt der Einsatz einer /etc/check.d/$package.exp
Datei dar. In ihr können neben den Regular Expressions eigene
Fehlermeldungen definiert werden.
Warnung
Eigene Regular Expressions in der Datei /etc/check.d/$package.exp
müssen den Paketnamen als Präfix enthalten.
Beispiel:
FOO_COLOR = 'red|green|blue' : 'only red, green or blue are allowed'
In den regulären Ausdrücken können auch Referenzen auf bereits
existierende Definitionen enthalten sein. Dadurch ist es einfacher,
reguläre Ausdrücke zu konstruieren. Eingefügt werden die Referenzen
einfach durch ‚(RE:Referenz
).
Beispiel:
FOO_IP_ROUTE = '(RE:IPADDR)[[:space:]]+(RE:IPADDR)[[:space:]]+(RE:IPADDR)'
: 'no valid route specification (network netmask gateway)'
FOO_DOT_NUMERIC = '(RE:NUMERIC).(RE:NUMERIC)'
: 'should be numeric (decimal) with dot e.g. 5.0'
Die speziellen Regeln PASSWD
, READONLY
und HIDDEN
sind lediglich für
den ECE von Bedeutung. Für eischk stellen sie keine Einschränkung des
Wertebereichs dar. Deshalb werden sie in der Datei /etc/check.d/$package
häufig in Kombination mit anderen Regeln verwendet.
Beispiel:
# Variable: OPT_VARIABLE: VARIABLE_N: VALUE:
FOO_DEBUG - - YESNO
FOO_DEBUG - - HIDDEN
6.5.5. Fehlermeldungen¶
Findet die Prüfung einen Fehler, erfolgt die Ausgabe der Fehlermeldung auf folgende Art:
Error: wrong value of variable HOSTNAME: '' (may not be empty)
Error: wrong value of variable MOUNT_OPT: 'rx' (user supplied regular expression)
Beim ersten Fehler wurde der Ausdruck in einem exp file definiert und ein Hinweis auf den Fehler wird mit ausgegeben. Im zweiten Falle wurde der Ausdruck direkt im *.txt File spezifiziert, deshalb gibt es keinen zusätzlichen Hinweis auf die Fehlerursache.
6.5.6. Definition regulärer Ausdrücke¶
Reguläre Ausdrücke sind wie folgt definiert:
Regulärer Ausdruck: Eine oder mehrere Alternativen, getrennt durch ‘|’, z.B. ‘ro|rw|no’. Trifft eine der Alternativen zu, trifft der ganze Ausdruck zu (hier wären ‘ro’, ‘rw’ und ‘no’ gültige Ausdrücke).
Eine Alternative ist eine Verkettung mehrerer Teilstücke, die einfach aneinandergereiht werden.
Ein Teilstück ist ein „Atom“, gefolgt von einem einzelnen ‘*’, ‘+’, ‘?’ oder ‘{min, max}’. Die Bedeutung ist wie folgt:
‘a*’ - beliebig viele a’s einschliesslich kein a
‘a+’ - mindestens ein a, sonst beliebig viele a’s
‘a?’ - kein oder ein a
‘a{2,5}’ - zwei bis 5 a’s
‘a{5}’ - 5 a’s
‘a{2,}’ - mindestens 2 a’s
Ein „Atom“ ist ein
regulärer Ausdruck eingeschlossen in Klammern, z.B. (a|b)+ trifft auf eine beliebige Zeichenkette zu, die mindestens ein a oder b enthält, sonst aber beliebig viele und in beliebiger Reihenfolge
ein leeres Paar Klammern steht für einen „leeren“ Ausdruck
ein Ausdruck mit eckigen Klammern ‘[]’ (siehe weiter unten)
ein Punkt ‘.’, der auf irgend ein einzelnes Zeichen zutrifft, z.B. ‘.+’ trifft auf eine beliebige Zeichenkette zu, die mindestens ein Zeichen enthält
ein ‘ˆ’ steht für den Zeilenanfang, z.B. ‘ˆa.*’ trifft auf eine Zeichenkette zu, die mit einem a anfängt und in der beliebige Zeichen folgen, ‘a’ oder ‘adkadhashdkash’
ein ‘$’ steht für das Zeilenende
ein ‘\’‚ gefolgt von einem der Sonderzeichen ‘ˆ.[$()|*+?{’ steht für genau das zweite Zeichen ohne seine spezielle Bedeutung
ein normales Zeichen trifft auf genau das Zeichen zu, z.B. ‘a’ trifft auf genau ‘a’ zu.
Ein Ausdruck mit rechteckigen Klammern bedeutet folgendes
‘[x-y]’ - trifft auf irgend ein Zeichen zu, das zwischen x und y liegt, z.B. ‘[0-9]’ steht für alle Zeichen zwischen 0 und 9; ‘[a-zA-Z]’ für alle Buchstaben, egal ob gross oder klein
‘[ˆx-y]’ - trifft auf irgendein Zeichen zu, das nicht im angegebenen Intervall liegt
‘[:character_class:]’ - trifft auf ein Zeichen der Zeichen-Klasse zu. Relevante Standardzeichenklassen sind: alnum, alpha, blank, digit, lower, print, punct, space, upper, xdigit.
6.5.7. Beispiele für Reguläre Ausdrücke¶
Sehen wir uns das mal an einigen Beispielen an:
Numerisch: Ein numerischer Wert besteht aus mindestens einer, aber beliebig vielen Zahlen. Mindestens ein, aber beliebig viele drückt man mit ’+’ aus, eine Zahl hatten wir schon als Beispiel. Zusammengesetzt ergibt das:
NUMERIC = '[0-9]+' oder alternativ
NUMERIC = '[[:digit:]]+'
NOBLANK: Ein Wert, der keine Leerzeichen enthält ist ein beliebiges Zeichen (außer dem Leerzeichen) und davon beliebig viele:
NOBLANK = '[^ ]*'
bzw. wenn der Wert zusätzlich auch nicht leer sein soll:
NOBLANK = '[^ ]+'
Disk und Partition: Gültige Bezeichner für eine Disk beginnen mit hd bei IDE-Disks bzw sd bei SCSI-Disks. Dann folgen Buchstaben von a-z (a für die erste Disk, b für die 2., …) und bei Partitionen die Zahlen 1-8 (1-4 für die ersten 4 Partitionen, die Primär bzw. Extended (nur eine) sein können und 5-8 für die logischen Partitionen innerhalb einer extended Partition). Die Ausdrücke sehen dann wie folgt aus:
DISK = '(hd|sd)[a-z]'
PARTITION = '(hd|sd)[a-z][1-8]'
Sehen wir uns das ganze nochmal am Beispiel der IP-Addresse an. Eine IP-Adresse besteht aus 4 Octets, die mit einem ‚.‘ getrennt sind. Ein Octet kann eine Zahl zwischen 0 und 255 sein. Definieren wir als erstes ein Octet. Es kann
eine Zahl zwischen 0 und 9 sein: [0-9] eine Zahl zwischen 00 und 99: [0-9][0-9] eine Zahl zwischen 100 und 199: 1[0-9][0-9] eine Zahl zwischen 200 und 249: 2[0-4][0-9] eine Zahl zwischen 250 und 255 sein: 25[0-5]
Da sich die ersten drei Teile stark ähneln, kann man sie zusammenfassen:
ein Zahl zwischen 0 und 199: 1?[0-9]?[0-9] (die ersten beiden Stellen können, aber müssen nicht da sein)
Das ganze sind Alternativen, also fassen wir sie einfach mittels ‚|‘ zu einem Ausdruck zusammen: ‚1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]‘ und haben damit ein Octet. Daraus können wir nun eine IP-Adresse machen, 4 Octets mit Punkten voneinander getrennt (der Punkt muss mittels backslash gequotet werden, da er sonst für ein beliebiges Zeichen steht). Basierend auf der Syntax der Exp-Files sieht das ganze dann wie folgt aus:
OCTET = '1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]'
IPADDR = '((RE:OCTET)\.){3}(RE:OCTET)'
6.5.8. Erweiterte Prüfungen der Konfiguration¶
Manchmal ist es notwendig, komplexere Überprüfungen durchzuführen. Beispiele für solche komplexeren Dinge wären z.B. Abhängigkeiten zwischen Paketen oder Bedingungen, die nur erfüllt sein müssen, wenn Variablen bestimmte Werte annehmen.
Um diese Überprüfungen durchführen zu können, kann man in
/etc/check.d/$package.ext
kleinere Tests schreiben. Die Sprache
besteht aus folgenden Elementen:
Schlüsselwörter:
Kontrollfluss:
if (expr) then statement else statement fi
foreach var in set_var do statement done
foreach var in var_n do statement done
Aktionen:
warning „warning“
error „error“
fatal_error „fatal error“
set var = value
stat (filename, res)
split (string, set_variable, character)
Datentypen: strings, numerische Werte, Versionsnummern, Arrays
Logische Operationen: <, ==, >, !=, !, &&, ||, =
6.5.8.1. Kommunikation mit dem Nutzer: warning, error, fatal_error¶
Mit Hilfe dieser drei Funktionen kann man Nutzer warnen, einen Fehler signalisieren oder die Prüfung sofort abbrechen. Das Format sieht wie folgt aus:
warning „text“
error „text“
fatal_error „text“
Im Text kann man auf Variablen Bezug nehmen, indem man einfach den Namen mit einem vorangestellten ‚$‘ oder ‚%‘ Zeichen in den Text schreibt (evtl. in eingeschlossen, um den Variablenamen vom umgebenden Text abzugrenzen). eischk versucht den darauffolgenden Text (Ziffern, Zahlen, ‚_‘) als Variablennamen zu interpretieren und setzt bei einem vorangestellten ‚$‘ den Inhalt der Variablen an dieser Stelle ein, wenn Sie definiert ist, bzw bei einem vorangestellten ‚%‘ den vollständigen Namen der aktuellen %-Variable. Sonst steht der originale Text da. Will man wirklich ein ‚$‘ oder ein ‚%‘ im Text haben, schreibt man ‚$$‘ bzw. ‚%%‘.
6.5.8.2. Zuweisungen¶
Benötigt man aus irgend einem Grund eine temporäre Variable, kann man
diese einfach mit set var [= value]
anlegen. Die Variable darf keine
Config-Variable sein. Lässt man den „= value“ Teil weg, wird die
Variable einfach auf „yes“ gesetzt, so dass man sie hinterher einfach
in einer if-Anweisung testen kann. Wird ein Zuweisungsteil angegeben,
kann hinter dem Gleichheitszeichen alles stehen, normale Variablen,
indizierte Variablen, Zahlen, Zeichenketten, Versionen.
6.5.8.3. Arrays¶
Will man auf einzelne Elemente einer %-Variablen (eines Arrays) zugreifen, kann man das wie gewohnt mit %_var[index] tun, wobei für jedes % Zeichen ein [ Index ] auftauchen muss.
6.5.8.4. Abfragen von Eigenschaften einer Datei - stat¶
stat() ermöglicht es, Eigenschaften einer Datei abzufragen. Zur Verfügung gestellt wird im Augenblick lediglich die Größe einer Datei, andere Attribute sind aber leicht hinzuzufügen. Abfragen sehen wie folgt aus (wobei die verwendeten Parameter nur Beispiele sind):
stat ("unix/Makefile", test)
Danach sind zwei Variablen definiert:
- test_resResultat des Systemrufs stat() („OK“, wenn Systemruf
erfolgreich, sonst Fehlermeldung des Systemrufs)
test_size : Größe der Datei
Das könnte dann z.B. so aussehen:
stat ("unix/Makefile", test)
if ("$test_res" == "OK")
then
warning "test_size = $test_size"
else
error "Error '$test_res' while trying to get size of ..."
fi
6.5.8.5. Auseinandernehmen von Parametern - split¶
Oftmals werden Variablen mit mehreren Parametern belegt, die dann in Startup-Scripten erst wieder auseinandergenommen werden. Will man diese bereits vorher auseinandernehmen und Tests mit ihnen durchführen, nimmt man split() .
split (string, %_var, character)
Der String kann durch eine Variable, %-Variable oder direkt als String angegeben werden. eischk zerlegt ihn an den Stellen, an denen das Trennzeichen auftaucht und erzeugt je eine Instanz der %-Variablen. Über diese kann man dann hinterher Tests laufen lassen. Steht zwischen zwei Trennzeichen nichts, wird eine Instanz mit einer leeren Zeichenkette als Wert erzeugt. Ausnahme ist ‚ ‚, hier werden alle whitespaces konsumiert und keine leeren Variablen erzeugt.
Sollen die bei der Zerlegung entstandenen Elemente in einem numerischen Kontext verwendet werden (z.B. als Index), muss das beim Aufruf von Split spezifiziert werden. Das geschieht durch das zusätzliche Attribut ‚numeric‘. Der Aufruf sieht dann wie folgt aus:
split (string, %_var, character, numeric)
6.5.8.6. Kontrollfluss¶
if (expr)
then
statement
else
statement
fi
Eine klassische if
-Konstruktion wie man sie kennt. Ist die Bedingung
wahr, wird der then
-Teil ausgeführt, ist die Bedingung falsch, wird
der else
-Teil ausgeführt.
Will man Tests über %-Variablen durchführen, muss man jede einzelne Variable testen. Dazu gibt es das foreach -Statement in zwei Varianten:
foreach loop_var in set_var
do
statement
done
Diese Schleife iteriert über alle %-Variablen, angefangen bei eins bis
zum in der dazugehörigen (in /etc/check.d/$package
stehenden)
Variable_N
stehenden Index n. Die Laufvariable loop_var nimmt dabei
die jeweiligen Werte der %-Variablen an.
Das Statement kann dabei eine der oben beschriebenen Funktionen if ,
foreach , warning , error oder fatal_error
sein.
Will man genau eine %-Variable testen, kann man diese mittels var_%$index
auswählen. Der index kann dabei eine normale Variable, ein
String oder wiederum ein indiziertes Array sein.
foreach loop_var in var_n
do
statement
done
Diese Schleife läuft von 1 bis var_n. Man kann die Schleifenvariable loop_var dazu benutzen, um _% Variablen zu indizieren. Will man also nicht nur über eine _% Variable iterieren, sondern über mehrere gleichzeitig, nimmt man diese Variante der Schleife und verwendet die loop_var zum Indizieren mehrerer _% Variablen.
6.5.8.7. Expressions¶
Die Expressions erlauben so gut wie alles, was man von einer Programmiersprache gewöhnt ist. Ein in einem Ausdruck auftauchender Wert ‚val‘ kann eine Variable, ein String oder ein indiziertes Array sein. Variablen in Strings werden dabei wie oben beschrieben ersetzt. Ein Test auf die Gleichheit zweier Variablen könnte also so aussehen:
var1 == var2
"$var1" == "$var"
Zu beachten ist dabei, dass der Vergleich in Abhängigkeit vom Typ der
Variable erfolgt, der in /etc/check.d/$package
festgelegt wurde.
Variablen, die als Typnamen einen mit NUM beginnenden Namen haben,
erhalten einen numerischen Typ. Ist einer der beiden Variablen
numerisch, erfolgt der Vergleich auf numerischer Basis, d.h. die
Zeichenketten werden in Zahlen umgewandelt und dann vergleichen. Sonst
erfolgt der Vergleich auf String-Basis; ein Vergleich von ‚05‘ und ‚5‘
geht ergibt ungleich, ein Vergleich von ‚18‘ und ‚9‘ ergibt ‚18‘ <
‚9‘.
Für den Vergleich von Versionen wird das Hilfskonstrukt numeric(version) eingeführt, welches den numerischen Wert für einen Versionsstring für Vergleichszwecke bestimmt . numeric(version) == sub_version + 1000 * minor_version + 10000 * major_version:
Eine vollständige Auflistung aller Ausdrücke ist in der folgenden Tabelle zu finden.
expr |
true if |
id |
id == ‚yes‘ |
val == val |
strings/numerische Werte sind identisch |
val != val |
strings/numerische Werte sind verschieden |
val == number |
numerischer Wert von val == number |
val != number |
numerischer Wert von val != number |
val < number |
numerischer Wert von val < number |
val > number |
numerischer Wert von val > number |
val == version |
numeric(val) == numeric(version) |
val < version |
numeric(val) < numeric(version) |
val > version |
numeric(val) > numeric(version) |
( expr ) |
Ausdruck in Klammern ist wahr |
expr && expr |
beide Ausdrücke sind wahr |
expr || expr |
mind. einer der beiden Audrücke ist wahr |
6.6. Selbstdefinierte Dialoge im ECE¶
Um die Eingabe von Werten in der eisfair-Konfiguration noch einfacher und sicherer zu gestalten, sieht der eisfair Konfigurationseditor (ECE) eine Möglichkeit vor, die einfache Eingabezeile zur Parameterbearbeitung gegen selbstdefinierte Dialoge zu tauschen. In solchen Dialogen können Werte z.B. als Auswahllisten oder in jeder anderen denkbaren Form dem Anwender verfügbar gemacht werden.
Damit der ECE einen Dialog verwendet müssen die folgenden Bedingungen erfüllt sein:
Zum einen muss in der Datei /etc/check.d/$package
eine Prüfregel
eingetragen werden, die der Variablen einen eindeutigen symbolischen
Typnamen zuordnet. Kann das mit einer speziellen Typprüfung verbunden
werden, dann steht ein solcher Name oftmals ohnehin zur Verfügung,
anderenfalls muss eine „leere“ Prüfregel definiert werden.
Beispiel für eine Datei /etc/check.d/ $package für einen ECE-Dialog :
FOO_NETWORK - - IPADDR
FOO_NETWORK - - FOO_IP
FOO_DIR_N - - NUMERIC
FOO_DIR_%_ACCESS - FOO_DIR_N FOO_ACCESS
In dem oben aufgeführten Beispiel wird angenommen, dass ein Paket FOO
für die Konfigurationsvariable FOO_NETWORK
einen speziellen Dialog zur
Eingabe oder Auswahl einer IP-Adresse definieren möchte. Als Prüfregel
kommt dabei die in der Basis definierte Regel IPADDR zum Einsatz,
weshalb eine weitere Regel für die selbe Variable eingefügt wurde, die
lediglich einen Bezeichner (FOO_IP) definiert (IPADDR wäre nicht
eindeutig!).
Zudem kennt die Konfiguration des FOO-Pakets die Variable
FOO_DIR_%_ACCESS
, welche ebenfalls einen Dialog erhalten soll. Hier
gibt es aber bereits die paketspezifische Prüfregel FOO_ACCESS
, die
eindeutig genug ist, um direkt als Bezeichner verwendet werden zu
können.
Selbstverständlich müssen für FOO_IP
und FOO_ACCESS
ebenfalls Einträge
in der Datei /etc/check.d/$package.exp
angelegt werden.
Beispiel für eine Datei /etc/check.d/$package.exp
für einen ECE-Dialog :
FOO_IP = '(RE:NONE)'
: ''
FOO_ACCESS = 'none|read|write'
: 'only none, read or write are allowed'
Zu guter letzt können nun im Verzeichnis /var/install/dialog.d
shell-
Skripte erstellt werden, die vom ECE verwendet werden sollen. Damit
die Zuordnung zu den Variablen funktioniert sind die Namen der Skripte
so zu wählen, dass sie den zuvor definierten Typbezeichnern
entsprechen. Im Beispiel wären dies: FOO_IP.sh und FOO_ACCESS.sh
(wobei die Groß- Kleinschreibung zu beachten ist!).
Die Skripte selbst können komplexe Programme enthalten und müssen dabei der CUI Skript-Spezifikation entsprechen. Die Syntax und das erforderliche Hintergrundwissen vermittelt das Dokument ‚‘libcuidoc‘‘, das ebenfalls auf der Webseite des eisfair-Projekts zu finden ist. Neben der C-API der libcui wird dort auch die Skript-Schnittstelle beschrieben und eine Referenz der verfügbaren Skript-Befehle geliefert.
An dieser Stelle sollen lediglich Beispiele für Skripte vorgestellt werden, mit denen man Auswahllisten im ECE realisieren kann. Diese Skripte können kopiert und auf vergleichbare Fälle angepasst werden:
6.6.1. ece_select_list_dlg¶
Der in der ecelib definierte Dialog „ece_select_list_dlg“ implementiert eine einfache Auswahlliste, die zentriert über dem Editorfenster angezeigt wird. Der Anwender kann dabei aus einer Reihe möglicher Werte wählen und den gewünschten Wert (z.B. mit Enter) bestätigen. Die Auswahl wird dann in die bearbeitete Konfigurationsvariable des ECE übertragen.
Beispiel für die Verwendung des Dialogs ece_select_list_dialog :
#! /bin/sh
. /var/install/include/cuilib
. /var/install/include/ecelib
#-----------------------------------------------------------------
# exec_dailog
# ece --> request to create and execute dialog
# $p2 --> main window handle
# $p3 --> name of config variable
#-----------------------------------------------------------------
exec_dialog()
{
local win="$p2"
sellist="BLACK,RED,GREEN,BROWN,BLUE,MAGENTA,CYAN,LIGHTGRAY,
DARKGRAY,LIGHTRED,LIGHTGREEN,YELLOW,LIGHTBLUE,
LIGHTMAGENTA,LIGHTCYAN,WHITE"
ece_select_list_dlg "$win" "Colors" "$sellist"
}
#-----------------------------------------------------------------
# main routine
#-----------------------------------------------------------------
cui_init
cui_run
exit 0
#-----------------------------------------------------------------
# end
#-----------------------------------------------------------------
Bei diesem Beispiel wird folgende Auswahlliste ausgegeben:
+----------[ Colors ]-----------+
| |
| +-------------------------+^| |
| | BLACK | | |
| | RED | | |
| |<GREEN =================>| | |
| | BROWN | | |
| | BLUE | | |
| | MAGENTA | | |
| | CYAN | | |
| +-------------------------+v+ |
| [< OK >] [ Cancel ] |
| |
+-------------------------------+
6.6.2. ece_comment_list_dlg¶
Der Dialog „ece_comment_list_dlg“ ist eine Erweiterung des „ece_select_list_dlg“ Dialogs. Hier ist es möglich neben den Auswahloptionen Kommentare anzugeben, die gemeinsam mit den Auswahlwerten in einer zweispaltigen Auswahlliste dargestellt werden. Auf diese Weise sieht der Anwender nicht nur die Optionen (die für sich gesehen u.U. vergleichsweise nichtssagend sind), sondern auch einen erklärenden Text, der die Auswahl erleichtert.
Beispiel für die Verwendung des Dialogs ece_comment_list_dialog :
#!/bin/sh
. /var/install/include/cuilib
. /var/install/include/ecelib
#-----------------------------------------------------------------
# exec_dailog
# ece --> request to create and execute dialog
# $p2 --> main window handle
# $p3 --> name of config variable
#-----------------------------------------------------------------
exec_dialog()
{
local win="$p2"
sellist="option1|Dies ist Option1,option2|Dies ist Option2,
option3|Dies ist Option3,option4|Dies ist Option4"
ece_comment_list_dlg "$win" "Optionen" "$sellist"
}
#-----------------------------------------------------------------
# main routine
#-----------------------------------------------------------------
cui_init
cui_run
exit 0
#-----------------------------------------------------------------
# end
#-----------------------------------------------------------------
Bei diesem Beispiel wird folgende Auswahlliste ausgegeben:
+-------------[ Optionen ]----------------+
| |
| +-----------------------------------+^| |
| | option1 | Dies ist Option1 | | |
| | option2 | Dies ist Option2 | | |
| |<option3 ===| Dies ist Option3 ===>| | |
| | option4 | Dies ist Option4 | | |
| +-----------------------------------+v+ |
| [< OK >] [ Cancel ] |
| |
+-----------------------------------------+
6.6.3. ece_select_cblist_dlg¶
Der in der ecelib definierte Dialog „ece_select_cblist_dlg“ implementiert eine Auswahlliste unter Nutzung von Check Boxen, die zentriert „uber dem Editorfenster angezeigt wird. Der Anwender kann dabei einer Reihe möglicher Werte unter Nutzung der Cursortasten ansteuern und über die Space Taste auswählen. Ausgewählte Werte werden mit [x] markiert. Nicht ausgewählte Werte haben die Markierung [ ]. Die gewünschten Werte können (z.B. mit Enter) bestätigen werden. Die Auswahl wird dann in die bearbeitete Konfigurationsvariable des ECE übertragen.
Beispiel für die Verwendung des Dialogs ece_select_cblist_dialog:
#!/bin/sh
. /var/install/include/cuilib
. /var/install/include/ecelib
#-----------------------------------------------------------------
# exec_dailog
# ece --> request to create and execute dialog
# $p2 --> main window handle
# $p3 --> name of config variable
#-----------------------------------------------------------------
exec_dialog()
{
local win="$p2"
sellist='apache2,ldapserver,mail,mini_httpd,partimg,pure-ftpd,ssmtp'
ece_select_cblist_dlg "$win" "Select one or more elements from a list" "$sellist"
}
#-----------------------------------------------------------------
# main routine
#-----------------------------------------------------------------
cui_init
cui_run
exit 0
#-----------------------------------------------------------------
# end
#-----------------------------------------------------------------
Bei diesem Beispiel wird folgende Auswahlliste ausgegeben:
+-[ Select one or more elements from a list ]-+
| |
| [x] apache2 |
| [ ] ldapserver |
| [ ] mail |
| [ ] mini_httpd |
| [ ] partimg |
| [x] pure-ftpd |
| [ ] ssmtp |
| |
| [< OK >] [ Cancel ] |
| |
+---------------------------------------------+
Für maximal 15 Elemente ist Platz auf einem 80/25 Display, daher wird bei mehr als 15 Elemente eine Fehlermeldung erzeugt:
+----[ Checkbox selection ]----+
| |
| Too many elements (16/15). |
| |
| [< OK >] |
+------------------------------+
Es können selbstverständlich auch längere Elemente angezeigt und ausgewählt werden, allerdings ist die Ausgabe auf 58 Zeichen begrenzt. Die restlichen Zeichen werden durch ein .. angedeutet.
Beispiel:
+-----------[ Select one or more elements from a list ]------------+
| |
| [ ] dies ist ein ziemlich langer Text der auch ziemlich viel U..|
| [ ] dies nicht |
| |
| [< OK >] [ Cancel ] |
| |
+------------------------------------------------------------------+
Warnung
Es wird nicht geprüft, ob ein Element mehrfach vorkommt.
Mittels der Variablen ECE_SELECT_CBLIST_VAL_SEPARATOR kann der Separator der Select-Liste eingestellt werden.
ECE_SELECT_CBLIST_VAL_SEPARATOR=':'
setzt z.B. den Separator auf den Doppelpunkt.