INHALT
======

1  eisman - Paketmanager fuer eisfair

2  Anwenderschnittstelle
   2.1  Uebersicht der Kommandozeilenbefehle
   2.2  eisman help
   2.3  eisman init
   2.4  eisman update
   2.5  eisman upgrade
   2.6  eisman install
   2.7  eisman uninstall
   2.8  eisman query
   2.9  eisman search
   2.10 eisman sections
   2.11 eisman check
   2.12 eisman usage
   2.13 eisman unlock
   2.14 eisman stats
   2.15 eisman localdir
   2.16 eisman flushurl
   2.17 eisman run
   2.18 eisman checklock
   2.19 eisman repair
   2.20 eisman mirror
   2.21 eisman version

3  Interne Struktur: Verzeichnisse und Dateien
   3.1  Verzeichnis /usr/bin
   3.2  Verzeichnis /usr/share/eisman
   3.3  Verzeichnis /var/install/include
   3.4  Verzeichnis /var/lib/eisman
   3.5  Verzeichnis /var/lib/eisman/info
   3.6  Verzeichnis /var/lib/eisman/cache

4  Interne Struktur: eisman Datenbanken
   4.1  Das Record-Format
      4.1.1  Der Index-Bereich
      4.1.2  Feldnamen
      4.1.3  Separator
   4.2  Konvertierung in das Record-Format
      4.2.1  Zeichensatzkodierung
      4.2.2  Zeilenkommentare
      4.2.3  Felder einlesen
      4.2.4  Paketverlinkung
   4.3  Datenbankformat

5  Interne Struktur: Aufrufhierarchie
   5.1  Aufrufhierarchie und Kapselung
   5.2  Die "run"-Schnittstelle


1 eisman - Paketmanager fuer eisfair
====================================

eisman ist eine Neuimplementierung eines Paketmanagers fuer eisfair.
Das Paket hat zum Ziel, moeglichst weitgehend die bisherige Funktion
des Paketmanagers abzudecken und zugleich neue Konzepte einzufuehren,
wie sie von anderen Paketmanagern her bereits bekannt sind.

Der Paketmanager ist in das eisfair-Menue integriert worden und sollte
sich weitgehend so bedienen lassen, wie das von der bisherigen Loesung
bereits bekannt ist. Allerdings bietet eisman auch fuer die Kommando-
zeile ein Benutzer-Interface an, das dem Anwender Zugang zu weiterfueh-
renden Funktionen erlaubt.

Im Folgenden findet sich eine Dokumentation der Software sowohl aus
Anwendersicht als auch aus Entwicklersicht.


2 Anwenderschnittstelle
=======================

2.1 Uebersicht der Kommandozeilenbefehle
---------------------------------------

Der Aufruf von eisman erfolgt immer ueber das Programm "eisman", dem ein
Kommando und u.U. eine Reihe weiterer Kommandospezifischer Argumente
mitgegeben werden. Beispiel:

   eis # eisman init

Die folgenden eisman Kommandos sind verfuegbar:

   help       : Zeige eine Uebersicht ueber alle verfuegbaren Befehle.
   init       : eisman Installation einrichten und die Datenbank der
                installierten Pakete aus den unter /var/install/packages
                gespeicherten Informationen generieren.
   update     : Lokale Datenbank der verfuegbaren Pakete aus den Paket-
                quellen neu generieren.
   install    : Ein oder mehrere Pakete installieren bzw. aktualisieren.
   uninstall  : Ein Paket (ggf. rekursiv) deinstallieren.
   query      : Paketdatenbanken abfragen.
   search     : In den Paketdatenbanken nach Paketen anhand von Schluessel-
                worten suchen.
   sections   : Die Liste der Verfuegbaren Paketrubriken abrufen.
   check      : Den Installationsstatus eines Paketes abfragen.
   upgrade    : Nach neuen Paketversionen suchen und Updates installieren.
   usage      : Alle Pakete suchen, die ein bestimmtes Paket erfordern.
   unlock     : Verriegelung des Paketmanagers aufheben.
   stats      : Statistische Informationen zur lokalen Installation ab-
                rufen.
   localdir   : Alle Pakete unterhalb eines angegebenen Verzeichnisses
                zur Datenbank der verfuegbaren Pakete hinzufuegen.
   flushurl   : Pakete eine gegebenen URL aus der Datenbank der verfueg-
                baren Pakete entfernen.
   run        : Erweiterungsskript exklusiv ueber eisman ausfuehren
   checklock  : Pruefen ob laufende Instanz von eisman die Zugriffssperre
                besitzt. Lediglich aus einem Erweiterungsskript heraus
                sinnvoll.
   version    : Aktuelle Version des Paketmanagers ausgeben.


2.2 eisman help
---------------

Der Befehl listet eine Uebersicht aller eisman-Kommandos auf der Konsole
auf.

Aufruf:
   eisman help


2.3 eisman init
---------------

Falls es sich um eine erstmalige Installation von eisman handelt, initi-
alisiert der Befehl die lokale Umgebung und generiert die Datenbank der
installierten Pakete. Falls es sich um ein Update des Paketemanagers
handelt, wird geprueft, ob das Layout der vorliegenden Paketdatenbanken
mit der neuen Version kompatibel ist. Im Bedarfsfall werden die Daten-
banken automatisch konvertiert.
Der Befehl muss nach einer Neuinstallation bzw. nach einem Update ein-
malig aufgerufen werden.

Aufruf:
   eisman init [<Optionen>]

Optionen:
   --help     : Gibt Informationen zum Befehl auf der Konsole aus.


2.4 eisman update
-----------------

Der Befehl dient zur Aktualisierung der Paketquellen. Er muss vor einer
Installation oder eine Suche nach Updates mindestens einmalig aufgerufen
werden. Die eisfair-Umgebung bietet die Moeglichkeit, den Befehl als
cron-Job einzurichten, so dass der manuelle Aufruf in den meisten Faellen
entfallen kann. Falls an der URL-Konfiguration etwas geaendert wurde,
muss der Befehl ebenfalls erneut aufgerufen werden.

Der Vorgang dauert beim ersten Aufruf unter Umstaenden einige Minuten, da
viele Informationen von den Download-Servern gelesen und lokal gespeichert
werden muessen. Bei wiederholten Aufrufen dagegen laeuft der Befehl ver-
gleichsweise schnell durch.

Aufruf:
   eisman update [<Optionen>]

Optionen:
   --help        : Gibt Informationen zum Befehl auf der Konsole aus.
   --no-progress : Unterdrueckt die Ausgabe der Fortschrittsanzeige.


2.5 eisman upgrade
------------------

Es werden auf der Basis der Datenbank der verfuegbaren Pakete alle an-
stehenden Updates aufgelistet und entsprechend ihrer Reihenfolge auto-
matisch installiert. Soll auf Pakete aktualisiert werden, die den
Status "unstable" tragen, muss dies explizit angegeben werden. Das
ist jedoch nur in Sonderfaellen (z.B. bei der Paketentwicklung) ratsam.
Da die Abarbeitung des Befehls einige Zeit in Anspruch nehmen kann, wird
waehrenddessen auf der Konsole eine Animation angezeigt, die dem Anwender
signalisiert, dass der Vorgang aktiv ist.

Aufruf:
   eisman upgrade [<Optionen>]

Optionen:
   --unstable       : Es werden auch Pakete beruecksichtigt, die nicht den
                      Status "stable" besitzen. Falls ein zu installie-
                      rendes Paket wiederum ein nicht-"stable" Paket in
                      seiner Abhaengigkeitsliste hat, kann es auch ohne
                      die Angabe dieser Option zur Installation von
                      nicht-"stable"-Paketen kommen.
   --no-svn         : Es sollen alle Pakete ausgelassen werden, deren
                      Versionsnummer den Postfix 'svn' enthaelt.
   --listonly       : Gibt die gefundenen Updates lediglich als Liste
                      aus, fuehrt jedoch keine Installation durch. Die
                      Ergebnisliste kann anschliessend z.B. in einem
                      Paketbrowser zur manuellen Aktualisierung ange-
                      boten werden.
   --no-wait-anim   : Unterdrueckt die Anzeige der Animation.
   --output=<Datei> : Leitet die Ausgabe der Paketliste in eine Datei um.
                      Diese Option ist nur zusammen mit der Option
                      --listonly von Bedeutung.
   --help           : Gibt Informationen zum Befehl auf der Konsole aus.


2.6 eisman install
------------------

Der Befehl fuehrt die Installation von einem oder mehreren Paketen aus.
Die Liste der tatsaechlich zu installiedernden Pakete setzt sich dabei
aus den auf der Kommandozeile angegebenen Paketen und den daraus rekursiv
ermittelten weiterfuehrenden Paketabhaengigkeiten zusammen. Diese Liste
wird zunaechst auf der Konsole ausgegeben und nach Bestaetigung des Anwenders
erst vollstaendig heruntergeladen und anschliessend automatisch installiert.

Die Installation der Pakete erfolgt in umgekehrter Reihenfolge der Ab-
haengigkeiten, so dass selbst nach einem Abbruch der Installation das Sys-
tem in einem konsistenten Zustand zurueckbleibt.

Aufruf:
   eisman install [<Optionen>] <Paketliste>

Optionen:
   --unstable       : Erlaube die Installation von "unstable"-Paketen.
                      Falls ein zu installierendes Paket wiederum ein
                      nicht-"stable" Paket in seiner Abhaengigkeitsliste
                      hat, kann es auch ohne die Angabe dieser Option
                      zur Installation von nicht-"stable"-Paketen kommen.
   --auto           : Fuehrt die Aktion ohne weitere Benutzerbestaetigung
                      aus.
   --listonly       : Gibt die gefundenen Updates lediglich als Liste
                      aus, fuehrt jedoch keine Installation durch.
   --no-wait-anim   : Unterdrueckt die Anzeige der Animation.
   --output=<Datei> : Leitet die Ausgabe der Paketliste in eine Datei um.
   --url=<url>      : Begrenze die Paketsuche auf eine vorgegebene URL.
                      Dies hat auf die Suche nach Abhaengigkeiten jedoch
                      keinen Einfluss. Hier werden generell alle URLs
                      zugelassen.
   --help           : Gibt Informationen zum Befehl auf der Konsole aus.


Paketliste:
   Die Angabe eines Paketes innerhalb der Paketliste kann in den folgenden
   Formen erfolgen:

   * Pakete ohne Angabe einer Version: <paketname>
   * Pakete mit Angabe einer Version: <paketname>=<version>

   Paketnamen und Version sind dabei mit dem Zeichen '=' ohne weitere
   Leerzeichen zu verbinden.

   Bezeichnet <paketname>=<version> ein unstable-Paket, dann muss die
   Installation mit dem Schalter '--unstable' erfolgen. eisman bevorzugt
   immer die Installation von stabilen Paketen, solange die Anforderungen
   an die Version erfuellt sind.


Beispiele:
   Installation des Pakets "mc":

      eis # eisman install mc

   Installation des Pakets "mc" in der Version 2.6.2:

      eis # eisman install mc=2.6.2

   Installation mehrerer Pakete:

      eis # eisman install libpng-dev libz-dev


2.7 eisman uninstall
--------------------

Hiermit wird ein Paket vom System entfernt. Dabei muss sichergestellt
sein, dass das jeweiligen Pakete nicht von anderen Paketen benoetigt wird.
Anderenfalls bricht die Deinstallation mit einem Fehler ab.

In Ausnahmefaellen (z.B. falls ein Defekt der Paketkonsistenz vorliegt)
kann die Deinstallation eines Pakets mit der Option --force erzwungen
werden. Dies ist jedoch nur mit Vorsicht anzuwenden, da anderenfalls
Fehler in der Datenbank zurueckbleiben. Eine vergleichbare Situation er-
gibt sich im Fall einer Paketaktualisierung. Auch hier muss das Paket
trotz gegebener Abhaengigkeiten deinstalliert werden koennen. Zu diesem
Zweck existiert die Option --update, die jedoch nicht zur manuellen Ver-
wendung bestimmt ist.

Mit dem optionalen Schalter --recursive kann nicht nur ein Paket selbst,
sondern alle Pakete, auf die das Paket als einziges Abhaengigkeiten
besitzt gemeinsam deinstalliert werden. Dabei ist zu beachten, dass ein
Paket, in dessen Paketbeschreibung eine Abhaengigkeit fehlt, unter
Umstaenden nach einer solchen Deinstallation nicht mehr richtig
funktioniert, da ihm dann eine Komponente fehlt. Daher bitte die Liste
der zu deinstallierenden Pakete sichten, bevor die Deinstallation tat-
saechlich durchgefuehrt wird.

Aufruf:
   eisman uninstall [<Optionen>] <Paket>

Optionen:
   --force          : Erzwingt die Deinstallation eines Pakets.
   --update         : Signalisiert die Deinstallation im Rahmen eines
                      Updates. Nicht fuer den manuellen Aufruf bestimmt.
   --auto           : Fuehrt die Aktion ohne weitere Benutzerbestaetigung
                      aus.
   --recursive      : Ermittle die Liste freier Pakete rekursiv.
   --listonly       : Gibt die gefundenen Updates lediglich als Liste
                      aus, fuehrt jedoch keine Deinstallation durch.
   --no-wait-anim   : Unterdrueckt die Anzeige der Animation.
   --output=<Datei> : Leitet die Ausgabe der Paketliste in eine Datei um.
   --help           : Gibt Informationen zum Befehl auf der Konsole aus.


2.8 eisman query
----------------

Der Befehl ist ein vielseitiges Werkzeug zur Abfrage der Paketdatenbanken.
Unter Angabe eines Paketnamens kann nach diesem gesucht werden. Wird kein
Paketnamen angegeben, werden alle Pakete aufgelistet, die den uebrigen
Suchkriterien entsprechen.

Die Ergebnismenge kann durch die Angabe weiterer Suchkriterien begrenzt
werden. So koennen z.B. die Sektionen aufgelistet werden, in denen die Suche
stattfinden soll. Alternativ koennen auch Sektionen gezielt von der Suche
ausgeschlossen oder nach einer URL gefiltert werden.

Standardmaessig werden die Datenfelder "name", "version", "short", "date",
"url" und "status" aufgelistet. Es kann jedoch auch eine davon abweichende
Liste von Datenfeldern angefordert werden (siehe unten).

Normalerweise erfolgt die Abfrage in der Datenbank der verfuegbaren
Befehle. Alternativ kann die Datenbank auch explizit angegeben werden.
Dazu stehen die Optionen "--installed" und "--outdated" zur Verfuegung.

Auch liefert die Abfrage normalerweise nur stabile Pakete zurueck. Sollen
auch Pakete mit unstable-Status angezeigt werden, muss dies mit --unstable
angefordert werden.

Aufruf:
   eisman query [<Optionen>] [<Paketname> [<Version>] ]

Optionen:
   --excl-sections <Liste> : Kommaseparierte Liste von Sektionen, die von
                             der Suche ausgenommen sein sollen.
   --sections      <Liste> : Kommaseparierte Liste von Sektionen, in denen
                             die Abfrage stattfinden soll.
   --fields        <Liste> : Kommaseparierte Liste von Feldnamen (siehe
                             unten).
   --unstable              : Auch Pakete beruecksichtigen, deren Status
                             nicht "stable" ist.
   --installed             : Abfrage in der Datenbank der installierten
                             Pakete durchfuehren.
   --outdated              : Abfrage in der Datenbank der veralteten
                             Pakete durchfuehren.
   --output=<Datei>        : Leitet die Ausgabe der Ergebnisliste in eine
                             Datei um.
   --url=<url>             : Begrenze die Abfrage auf eine vorgegebene URL.
   --help                  : Gibt Informationen zum Befehl auf der
                             Konsole aus.

Liste moeglicher Feldnamen:
   name       : Namen des Pakets
   version    : Version des Pakets
   short      : Kurzbeschreibung
   date       : Datum der Paketerstellung
   author     : Namen (und E-Mail Adresse) des Paketbetreuers
   section    : Sektion, zu der das Paket gehoert
   space      : Erforderlicher Speicherplatz in MB
   url        : Die URL von der das Paket geladen wird
   status     : Der Status des Pakets
   sha1sum    : SHA-1 Hash aus dem Paketarchiv berechnet
   sha256sum  : SHA-2 Hash aus dem Paketarchiv berechnet
   replaces   : Pakete, die durch das Paket ersetzt werden
   require    : Liste der Abhaengigkeiten (ggf. mehrzeiliges Ergebnis)
   link       : Liste der verknuepften Pakete (ggf. mehrzeiliges Ergebnis)
   exclude    : Gemeinsame Installation mit anderem Paket verhindern
   text       : Langbeschreibung des Pakets (ggf. mehrzeiliges Ergebnis)
   hint       : Hinweis zum Paketverbleib (nur outdated.db)
   substitude : Hinweis auf Ersatzpaket (nur outdated.db)

Paketnamen und Version:
   Die Angabe kann unter Verwendung von Wildcards erfolgen
   * -> Platzhalter fuer eine beliebige Anzahl von Zeichen
   ? -> Platzhalter fuer genau ein Zeichen


2.9 eisman search
-----------------

Der Befehl arbeitet analog zu "eisman query", mit dem Unterschied, dass
der angegebene Suchbegriff auch ein Teil eines Paketnamens sein kann.
Ist ein Paketnamen nicht genau bekannt, bietet sich die Suche mit
"eisman search" an. Intern wird der Suchbegriff vor dem ersten und hinter
dem letzten Zeichen mit dem Wildcard '*' versehen, bevor die Anfrage
an "eisman query" weitergereicht wird.

Aufruf:
   eisman search [<Optionen>] Suchbegriff

Optionen:
   --excl-sections <Liste> : Kommaseparierte Liste von Sektionen, die von
                             der Suche ausgenommen sein sollen.
   --sections      <Liste> : Kommaseparierte Liste von Sektionen, in denen
                             die Abfrage stattfinden soll.
   --fields        <Liste> : Kommaseparierte Liste von Feldnamen (siehe
                             unten).
   --unstable              : Auch Pakete beruecksichtigen, deren Status
                             nicht "stable" ist.
   --installed             : Abfrage in der Datenbank der installierten
                             Pakete durchfuehren.
   --outdated              : Abfrage in der Datenbank der veralteten
                             Pakete durchfuehren.
   --output=<Datei>        : Leitet die Ausgabe der Ergebnisliste in eine
                             Datei um.
   --url=<url>             : Begrenze die Abfrage auf eine vorgegebene URL.
   --help                  : Gibt Informationen zum Befehl auf der
                             Konsole aus.

Liste moeglicher Feldnamen:
   (siehe "eisman query")


2.10 eisman sections
--------------------

Listet die Sektionen auf, zu denen in der entsprechenden Datenbank Pakete
gefunden werden konnten. Normalerweise greift die Abfrage auf die Daten-
bank der verfuegbaren Pakete zu. Mittels der Option "--installed" kann
jedoch auch auf die Datenbank der installierten Pakete zugegriffen werden.

Als zusaetzliches Selektionskriterium kann eine URL angegeben werden, so
dass lediglich Pakete dieser URL bei der Abfrage beruecksichtigt werden.

Aufruf:
  eisman sections [<Optionen>]

Optionen:
   --installed             : Verwendet die Datenbank der installierten
                             Pakete anstelle der der verfuegbaren Pakete.
   --unstable              : Schliesst auch nicht-"stable"-Pakete in die
                             Abfrage mit ein-
   --url=<url>             : Begrenze die Abfrage auf eine vorgegebene URL.
   --help                  : Gibt Informationen zum Befehl auf der
                             Konsole aus.


2.11 eisman check
-----------------

Fuehrt eine Pruefung durch, die besagt, ob ein Paket installiert ist oder
nicht und ob die optional angegebene Version neuer oder aelter als der
installierte Stand ist. Ohne die Option "--diff" liefert das Kommando
das folgende Ergebnis:
    "new"           - Die Version ist neuer als das installierte Paket.
    "old"           - Die Version ist aelter als das installierte Paket.
    "installed"     - Die Version entspricht dem des insterllierten Paketes.
    "not-installed" - Das Paket ist nicht installiert.

eisman check --diff VERSION1 VERSION2 vergleicht Versionsnummern unter
Beachtung bestimmter, z.T. eisfair spezifischer Regeln. Ergebnis:
    "new"           - Version 1 ist neuer als Version 2.
    "old"           - Version 1 ist aelter als Version 2.
    "installed"     - Beide Versionen stimmen ueberein.

Aufruf:
   eisman check <Paketnamen> [ <Version> ]
   eisman check --diff <Version 1> <Version 2>

Beispiele:
   Aufruf                                              Ergebnis/Ausgabe
   eisman check mariadb                                        installed
   Das Paket "mariadb" ist aktuell installiert

   eisman check mariadb 1.2.3                                  old
   Das Paket "mariadb" ist installiert und neuer als die hier
   angegebene Version 1.2.3

   eisman check --diff 1.2.3 1.2.4                             old
   Die Version 1.2.3 ist aelter, als die Version 1.2.4.

   eisman check --diff 1.2.3 1.2                               new
   Die Version 1.2.3 ist neuer, als die Version 1.2
   (ergaenzt zu 1.2.0).

   eisman check --diff 1.2.0 1.2                               installed
   Die Version 1.2.0 ist identisch mit der Version 1.2
   (ergaenzt zu 1.2.0).

   eisman check --diff 2.7.9 2.7.9svn2017-01-13                new
   Die Version 2.7.9 ist neuer als die SVN- bzw. Testversion
   aus dem Subversion Repository Build vom 13.01.2017.

   eisman check --diff 2.7.9svn2017-01-13 2.7.9svn2017-01-14   old
   Die am 13.01.2017 erstellt Version ist aelter als
   die am 14.01.2017 erstellte Version. 


2.12 eisman usage
-----------------

Zeigt in einer Baumstruktur alle Pakete auf, die auf ein das angegebene
Paket ein Abhaengigkeit definiert haben. Auf diese Weise kann man
einfach herausfinden, ob eine bestimmte Komponente deinstalliert werden
kann oder wer diese Komponente noch verwendet.

Aufruf:
   eisman usage [<Optionen>] <Paket>

Optionen:
   --help     : Gibt Informationen zum Befehl auf der Konsole aus.


2.13 eisman unlock
------------------

Damit immer nur ein Anwender zugleich Aenderungen an den Paketdatenbanken
(z.B. durch Installation oder Deinstallation) vornehmen kann, schreibt
eisman unter /run/lock eine Lock-Datei, die die Funktion einer Semaphore
wahrnimmt.

Falls nun - was in der Praxis kaum vorkommen duerfte - eine Operation von
eisman abgebrochen wurde und die Verriegelung dabei nicht entfernt
werden konnte, dann kann dies mit o.g. Befehl manuell erfolgen. Zuvor
ist jedoch zu pruefen, ob nicht doch entweder ein anderer Anwender oder ein
Hintergrundprozess (cron-Job) eine eisman-Instanz gestartet hat.

Aufruf:
   eisman unlock


2.14 eisman stats
-----------------

Der Befehl kann einige Statistiken ueber die aktuellen Paketdatenbanken
erstellen. Ohne weitere Angabe von Optionen erhaelt man dabei die Anzahl
der verfuegbaren Pakete und die Anzahl der installierten Pakete. Zudem wird
angegeben, wann zuletzt die Datenbanken aktualisiert worden sind.

Mittels weiterer Optionen koennen weitere Statistiken erstellt werden, die
jedoch sehr viel Zeit in Anspruch nehmen und nicht fuer den regelmaessigen
Gebrauch gedacht sind.

Aufruf:
   eisman stats [<Optionen>]

Optionen:
   --print-age-stats     : Altersverteilung der Pakete ermitteln und
                           darstellen.
   --print-require-stats : Konsistenz der Paketabhaengigkeiten pruefen
                           und Anzahl der Inkonsistenzen zeigen.
   --help                : Gibt Informationen zum Befehl auf der
                           Konsole aus.


2.15 eisman localdir
--------------------

Der Befehl sucht alle Paket-Info-Dateien (*.info) unterhalb des angegebenen
Verzeichnisses und uebertraegt die daraus gewonnenen Informationen in die
Datenbank der verfuegbaren Pakete. Dies wird zur Vorbereitung einer In-
stallation von lokal vorliegenden Paketen verwendet. Anschliessend kann die
Paketauswahl mit "eisman query" unter Angabe der URL aufgebaut werden.
(Siehe dazu das Skript /var/install/bin/install-local-package.)

Aufruf:
   eisman localdir [<Optionen>] <Pfad>

Optionen:
   --help     : Gibt Informationen zum Befehl auf der Konsole aus.


2.16 eisman flushurl
--------------------

Loescht alle Pakete aus der Datenbank der verfuegbaren Pakete, die zu der
angegebenen URL gehoeren. Diese Funktion wird beispielsweise verwendet, um
nach einer lokalen Installation oder nach der Installation von einer URL,
die nicht permanent im Paketindex ist, die zusaetzlich zur Dantebank hinzu-
gefuegten Pakete ohne einen Aufruf von "eisman update" wieder entfernen
zu koennen.

Aufruf:
   eisman flushurl [<Optionen>] <URL>

Optionen:
   --help     : Gibt Informationen zum Befehl auf der Konsole aus.

Hinweis:
   Um z.B. nach einem Aufruf von "eisman localdir" die Pakete wieder zu
   loeschen, ist das lokale Verzeichnis wie folgt in eine URL umzuformen:

   url="file://$(realpath ${local_dir})"


2.17 eisman run
---------------

Mittels "eisman run" kann ein unter /var/install/eisman_run.d abgelegtes
Erweiterungsskript ausgefuehrt werden. Dies kann z.B. ein Skript zur loka-
len Installation von Paketen sein o.ae.
Der Vorteil dieser Aufrufschnittstelle ist, dass ein Skript, das darueber
gestartet wurde, exklusiv ablaeuft und den Paketmanager fuer andere Anwender
sperrt, bis das Skript wieder beendet wird. Damit kann z.B. eine Modifi-
kation der Paketdatenbanken in mehreren Schritten erfolgen, ohne dass
dieser Prozess durch weitere eisman-Aufrufe behindert werden kann.

Der Name des Skripts entspricht dabei dem Namen des Befehls, jedoch mit
der Endung ".sh".

Beispiel:
   "eisman run skeleton" ruft das Skript /var/lib/eisman_run.d/skeleton.sh
   auf.

Aufruf:
   eisman run <Befehl> [<Optionen>]

Befehl:
   Der Name des Erweiterungsskripts entspricht dem Namen des Befehls,
   jedoch mit der Endung ".sh". Existiert das Skript, so kann es ueber
   eisman aufgerufen werden. Existiert es nicht, erfolgt eine Fehler-
   meldung.
   Beispiel: eisman run skeleton  ->  /var/lib/eisman_run.d/skeleton.sh

Optionen:
   Die Optionen sind abhaengig vom jeweiligen Befehl. In der Regel sollten
   Erweiterungsskripte jedoch mindestens die Option --help unterstuetzen.
   --help     : Gibt Informationen zum Befehl auf der Konsole aus.

Eine Vorlage fuer Erweiterungsskripte befindet sich im angegebenen Skript-
Verzeichnis und traegt den Namen "skeleton.sh".


2.18 eisman checklock
---------------------

Prueft, ob die laufende Instanz von eisman die Zugriffssperre besitzt oder
nicht. Der Aufruf dieses Befehls ist lediglich aus einem Erweiterungsskript
heraus sinnvoll, um zu pruefen, ob das Skript direkt, oder ueber das eisman
Frontend aufgerufen wurde. Um die Exklusivitaet sicherzustellen muss das
Skript im ersten Fall eine weitere Instanz von sich selbst ueber die "run"
Schnittstelle aufrufen. Ein entsprechender Code-Abschnitt im Erweiterungs-
skript kann wie folgt aussehen:

   # check if we are running under eisman control. If not use eisman
   # frontend to run the script using the run command
   if ! eisman checklock
   then
       # not running under eisman control!
       eisman run skeleton "${@}"
       exit $?
   fi

Aufruf:
   eisman checklock

Der Befehl liefert ueber den exit-Code das Ergebnis der Pruefung zurueck.


2.19 eisman repair
------------------

Prueft die Datenbank der installierten Pakete auf Fehler hinsichtlich
nicht korrekt aufgeloester Verweise. Dies wird erreicht, indem eisman
alle "require" und "link" Eintraege mit der Liste der installierten
Pakete vergleicht.

Werden fehlende Pakete gefunden, versucht einman diese zu installieren.

Aufruf:
   eisman repair [<Optionen>]

Optionen:
   --ignore <package> : Das Paket mit dem angegebenen Namen unbeachtet
                        lassen. Die Option kann mehrfach angegeben werden.
   --help             : Gibt Informationen zum Befehl auf der Konsole aus.


2.20 eisman mirror
------------------

Legt im angegebenen Verzeichnis eine lokale Kopie der Paketserver an, die
ueber die aktuelle URL-Konfiguration in den Index eingebunden werden.
Existiert in dem Verzeichnis bereits eine lokale Kopie, so wird diese
mit dem aktuellen Index lediglich abgeglichen. D.h, es werden aktuellere
Versionen existierender Pakete bzw. neu hinzugekommene Pakete herunter-
geladen und hinzugefuegt.

Zugleich wird eine neue Index-Datei angelegt, die die Pakete innerhalb
des Spiegels, die auch im globalen Index vorkommen, lokal referenziert.
Pakete, die länger als 90-Tage nicht im Index auftauchen, werden geloescht.

Aufruf:
   eisman mirror [<Optionen>] <Pfad/zum/lokalen/Paketverzeichnis>

Optionen:
   --relocate <url>   : Schreibt das lokale Verzeichnis innerhalb der
                        Index-Datei in die angegebene url um.
   --no-progress      : Unterdrueckt die Ausgabe der Fortschrittsanzeige.
   --help             : Gibt Informationen zum Befehl auf der Konsole aus.


2.21 eisman version
-------------------

Gibt die aktuelle Version des Paketmanagers auf der Konsole aus.

Aufruf:
   eisman version


3 Interne Struktur: Verzeichnisse und Dateien
=============================================

Im Folgenden ist eine Uebersicht ueber die Dateien zusammengestellt, aus
denen eisman besteht, bzw. in denen eisman seine Daten verwaltet.

3.1 Verzeichnis /usr/bin
------------------------

eisman
   Das zentrale eisman-Frontend, ueber das alle Kommandos abgewickelt
   werden und in dem das Locking durchgefuehrt wird.


3.2 Verzeichnis /usr/share/eisman
---------------------------------

In dem Verzeichnis liegen die Skripte, die die eigentliche Funktion von
eisman ausmachen. Keines dieser Skripte ist dazu bestimmt, von extern
direkt aufgerufen zu werden! Der Aufruf erfolg immer ueber das Frontend
'eisman'.

eisman_check_version.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman check" entsprechen.

eisman_download.sh
   Ist im Rahmen einer Installation dafuer zustaendig, ein Paketarchiv von
   einem Paketserver zu laden, den Download-Fortschritt entsprechend dar-
   zustallen und Fehlersituationen zu behandeln.

eisman_find_upgradables.sh
   Fuehrt die Suche nach Paketen aus, die gegenueber den installierten
   Paketen neuere Versionen aufweisen. Das Skript gibt die Ergebnisse
   zur weiteren Verwendung ueber stdio aus.

eisman_flushurl.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman flushurl" entspre-
   chen.

eisman_info_to_db.sh
   Liest die Informationen aus einer Paket-Info-Datei aus und uebertraegt
   diese in das interne Datenbankformat. Der daraus resultierende Daten-
   satz kann anschliessend in eine Datenbank uebertragen werden.

eisman_init.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman init" entsprechen.
   Verwendet 'eisman_info_to_db.sh' zum Erstellen der Datenbank der in-
   stallierten Pakete.

eisman_install.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman install" entspre-
   chen. Verwendet 'eisman_tree.sh' fuer die Paketsuche.

eisman_localdir.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman localdir" entspre-
   chen. Verwendet 'eisman_info_to_db.sh' zum Hinzufuegen lokaler Paket-
   Info-Dateien zur Datenbank der verfuegbaren Pakete.

eisman_query.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman query" entspre-
   chen.

eisman_rtree.sh
   Sucht rekursiv nach Paketen, die aufgrund entfallender Paketabhaengig-
   keiten im Falle einer Deinstallation ebenfalls deinstalliert werden
   koennen. Das Skript erhaelt einen Paketnamen als Uebergabeargument und
   liefert eine Ergebnisliste ueber stdio.

eisman_search.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman search" entspre-
   chen. Verwendet 'eisman_query.sh' zur Durchfuehrung der Datenbankab-
   frage.

eisman_sections.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman sections" entspre-
   chen.

eisman_stats.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman stats" entsprechen.

eisman_tree.sh
   Sucht rekursiv nach Paketen, die aufgrund von Paketabhaengigkeiten oder
   ahfgrund von Paketverknuepfungen installiert werden muessen. Das Skript
   erhaelt eine Liste von Paketen als Uebergabeargument und liefert eine
   Ergebnisliste ueber stdio.

eisman_uninstall.sh
   Deinstalliert ein einzelnes Paket. Wird von eisman_uninstall_r.sh als
   Unterfunktion verwendet.

eisman_uninstall_r.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman uninstall" entspre-
   chen. Verwendet im Falle einer Rekursiven Deinstallation das Skript
   'eisman_rtree.sh' zum Auffinden weiterer deinstallierbarer Pakete und
   das Skript 'eisman_uninstall.sh' zur tatsaechlichen Deinstallation.

eisman_update.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman sections" entspre-
   chen. Verwendet das Skript 'eisman_info_to_db.sh' um die Informationen
   neuer Pakete aus der Paket-Info-Dateien auszulesen und in das interne
   Format unter /var/lib/eisman/info (Info-Cache) zu kopieren.

eisman_upgrade.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman sections" entspre-
   chen. Verwendet 'eisman_find_upgradables.sh' zur Suche nach moeglichen
   Updates und 'eisman_install.sh' zu deren Installation.

eisman_usage.sh
   Fuehrt die Funktionen aus, die dem Kommando "eisman usage" entsprechen.


3.3 Verzeichnis /var/install/include
------------------------------------

eismanlib
   Enthaelt globale Definitionen und eine Sammlung von Funktionen, die von
   eine Vielzahl der eisman-Skripte gemeinsam genutzt werden.


3.4 Verzeichnis /var/lib/eisman
-------------------------------

dbversion
   Enthaelt die Layout-Version der eisman-Datenbanken. Wird von "eisman init"
   ausgelesen und ggf. in ein neuers Format konvertiert. Downgrades sind
   nicht vorgesehen!

installed.db
   Datenbank der installierten Pakete. Die Datensaetze in der Datenbank sind
   nicht sortiert. Das zuletzt installierte Paket steht immer ganz unten
   in der Datei. Siehe Kapitel "Datenbankformat" um naeheres zum Aufbau der
   Datenbanken zu erfahren.

packages.db
   Datenbank der verfuegbaren Pakete. Die Datenbank wird beim Aufruf von
   'eisman update' neu generiert. Sie ist nach URL-Prioritaeten sortiert.
   Siehe Kapitel "Datenbankformat" um naeheres zum Aufbau der Datenbanken
   zu erfahren.

outdated.inc.db
   Datenbank der fest hinterlegten veralteten Pakete. Die Datenbank enthaelt
   Eintragungen, die auf ein eventuell verfuegbares Alternativpaket hin-
   weisen und einen textuellen Kurzhinweis liefern.

outdated.db
   Datenbank der veralteten Pakete. Die Datenbank enthaelt Eintragungen,
   die auf ein eventuell verfuegbares Alternativpaket hinweisen und einen
   textuellen Kurzhinweis liefern. Diese Datenbank wird durch den Aufruf
   von "eisman update" sowohl aus der Datei outdated.inc.db als auch aus
   den "replaces" Eintragungen innerhalb der packages.db erzeugt.


3.5 Verzeichnis /var/lib/eisman/info
------------------------------------

Unterhalb dieses Verzeichnisses befindet sich der Info-Cache. Dort sind
alle Informationen der bislang bekannten Paket-Info-Dateien bereits im
Format der eisman-Datenbanken gespeichert. Wird die Paketdatenbank neu ge-
neriert, dann werden die Datensaetze (ensprechend dem aktuellen Index) aus
dem Info-Cache entnommen und in die Datenbank der verfuegbaren Pakete ueber-
tragen. Lediglich der URL-Eintrag wird bei der Uebertragung an den im Index
vorgefundenen Wert angepasst. Es liegt also zu jedem Paket pro Version
genau ein Datensatz im Info-Cache!

Fehlt ein Datensatz im Info-Cache, so muss von "eisman update" die ent-
sprechende Paket-Info-Datei heruntergeladen, konvertiert und im Cache ab-
gelegt werden. Alte Pakete, die ueber laengere Zeit nicht mehr im Paketindex
aufgefuehrt wurden, werden nach 90-Tagen aus dem Info-Cache geloescht.

Die Verzeichnisstruktur sieht wie folgt aus:

/var/lib/eisman/info/
   <paketname 1>
       <version 1>
          <paketname 1>.<archivformat>.rec
       <version 2>
          <paketname 1>.<archivformat>.rec
       ...
       <version n>
          <paketname 1>.<archivformat>.rec
   <paketname 2>
       <version 1>
          <paketname 2>.<archivformat>.rec
       <version 2>
          <paketname 2>.<archivformat>.rec
       ...
       <version n>
          <paketname 2>.<archivformat>.rec
   ...
   <paketname n>
       <version 1>
          <paketname n>.<archivformat>.rec
       <version 2>
          <paketname n>.<archivformat>.rec
       ...
       <version n>
          <paketname n>.<archivformat>.rec

Falls das Archivformat zu einem beliebigen Zeitpunkt umgestellt wurde
oder falls das selbe Paket in der selben Version z.B auf verschiedenen
Paketservern in unterschiedlichen Archivformaten liegt, dann kann es vor-
kommen, dass mehr als eine .rec-Datei im jeweiligen Verzeichnis liegt.


3.6 Verzeichnis /var/lib/eisman/cache
-------------------------------------

Dieses Verzeichnis enthaelt den Download-Cache. Hier werden vor einer In-
stallation alle Paketarchive abgelegt, die bereits heruntergeladen worden
sind. Erst wenn der Download aller Pakete vollstaendig abgeschlossen werden
konnte wird die Installation durchgefuehrt. Dabei wird jedes Paket, das er-
folgreich installiert werden konnte, aus dem Cache entfernt.

Nach einem Abbruch kann die Installation erneut gestartet werden, ohne dass
der Download der verbleibenden Pakete wiederholt werden muss. Idealerweise
ist nach erfolgreicher Installation der Download-Cache jedoch komplett leer.

Das Ablageschema der Paketarchive ist mit dem im Info-Cache vergleichbar:

/var/lib/eisman/cache/
   <paketname 1>
       <version 1>
          <Paketarchiv>
   ...
   <paketname n>
       <version 1>
          <Paketarchiv>

Da der "alte" Paketmanager die Paketarchive immer im Verzeichnis /tmp ab-
gelegt hatte und sich einige Pakete waehrend der Ausfuehrung von
/tmp/preinstall.sh auf diese Position verlassen, wird waehrend dieser Phase
der Installation ein symbolischer Link auf das Paketarchiv im Verzeichnis
/tmp angelegt und anschliessend wieder entfernt.


4 Interne Struktur: eisman Datenbanken
======================================

4.1 Das Record-Format
---------------------

Sowohl die Dateien im Info-Cache als auch die einzelnen Datensaetze inner-
halb der Paketdatenbanken folgen dem eisman-eigenen Record-Format. Das
Format wurde so gewaehlt, dass es einerseits die Daten rein textuell (d.h.
nicht binaer) repaesentiert, andererseits jedoch mit grep auf schnelle und
einfache Weise zerlegt d.h. abgefragt werden kann.

Trotz der Tatsache, dass die Datenbanken im ASCII-Format gehalten und damit
mit jedem Text-Editor eingesehen und bearbeitet werden koennen, handelt es
sich um Dateien, die lediglich von eisman gelesen und geschrieben werden.
Eine manuelle Bearbeitung ist nicht vorgesehen und nur in Ausnahmefaellen
sinnvoll.

Eine Zeile im Record-Format hat den folgenden Aufbau:

   <Index-Bereich><Feldname><Daten>

Ein Datensatz wiederum besteht aus einer aufeinanderfolgenden Serie von
Record-Zeilen, die mit einem Separator abgeschlossen sind:

   <Index-Bereich><Feldname 1><Daten>
   <Index-Bereich><Feldname 2><Daten>
   <Index-Bereich><Feldname 3><Daten>
   ...
   <Index-Bereich><Feldname n><Daten>
   <Index-Bereich>-----------------------------------------------------

Hier das Beispiel eines realen Datensatzes (horizontal gekuerzt):

   [utils][chroot][1.1.0][s][http://pack-eis.de]name       chroot     ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]version    1.1.0      ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]short      ChangeRoot ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]date       2015-05-17 ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]author     Juergen Edn...
   [utils][chroot][1.1.0][s][http://pack-eis.de]section    utils      ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]space      1          ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]sha1sum               ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]sha256sum             ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]url        http://pack...
   [utils][chroot][1.1.0][s][http://pack-eis.de]status     stable     ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]require    base 2.6.3 ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]link       chroot-dev ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]text                  ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]text       Manage Chan...
   [utils][chroot][1.1.0][s][http://pack-eis.de]text                  ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]text                  ...
   [utils][chroot][1.1.0][s][http://pack-eis.de]----------------------...

   <--------------Index-Bereich----------------><-Feldname-><---Daten--->


4.1.1 Der Index-Bereich
-----------------------

Der Index-Bereich existiert zur schnellen Filterung des Datenbestandes
mittels des Tools "grep". Er enthaelt ausgesuchte Paketinformationen in
vertikaler Anordnung. Dabei ist jedes Index-Feld in eckige Klammern
eingeschlossen und enthaelt in jeder Zeile eines Datensatzes den selben
Wert.

Die Belegung der Index-Felder ist dabei wie folgt:

   [utils][chroot][1.1.0][s][http://pack-eis.de]name       chroot
      |       |      |    |         |
      |       |      |    |         +----------> Paketquelle
      |       |      |    +--------------------> Paketstatus (u oder s)
      |       |      +-------------------------> Paketversion
      |       +--------------------------------> Paketname
      +----------------------------------------> Paketsektion

Das Index-Feld der Paketquelle enthaelt nicht die vollstaendige URL eines
Paketarchivs, sondern lediglich einen gekuerzten Teil, der die Quelle,
nicht aber das jeweilige Paket identifiziert.


4.1.2 Feldnamen
---------------

Feldnamen entsprechen den Spaltenueberschrifen einer Tabelle. Sie haben im
Record-Format einen Bereich fester Breite von 11 Zeichen zur Verfuegung,
wobei die maximale Laenge eines Namens max. 10 Zeichen betraegt. Der ver-
bleibende Bereich wird mit Leerzeichen aufgefuellt.

Im Fall eines einzeiligen Datenwertes darf ein Feldname innerhalb eines
Datensatzes nur einmalig vorkommen. Falls ein Datenfeld dagegen einen mehr-
zeiligen Wert enthaelt, folgen mehrere Zeilen des selben Feldnamens un-
mittelbar aufeinander.

Bislang sind die folgenden Feldnamen bekannt:

   name       : Namen des Pakets,
                einzeilig,
                entspricht dem Tag <name> in der Paket-Info-Datei.

   version    : Version des Pakets
                einzeilig,
                entspricht dem Tag <version> in der Paket-Info-Datei.

   short      : Kurzbeschreibung
                einzeilig,
                entspricht dem Tag <short> in der Paket-Info-Datei.

   date       : Datum der Paketerstellung
                einzeilig,
                entspricht dem Tag <date> in der Paket-Info-Datei.

   author     : Namen (und E-Mail Adresse) des Paketbetreuers
                einzeilig,
                entspricht dem Tag <author> in der Paket-Info-Datei.

   section    : Sektion, zu der das Paket gehoert
                einzeilig,
                entspricht dem Tag <section> in der Paket-Info-Datei.

   space      : Erforderlicher Speicherplatz in MB
                einzeilig,
                entspricht dem Tag <space> in der Paket-Info-Datei.

   url        : Die URL von der das Paket geladen wird
                einzeilig,
                keine Entsprechung in der Paket-Info-Datei.

   status     : Der Status des Pakets
                einzeilig,
                entspricht dem Tag <status> in der Paket-Info-Datei.

   sha1sum    : SHA-1 Hash aus dem Paketarchiv berechnet
                einzeilig,
                entspricht dem Tag <sha1sum> in der Paket-Info-Datei.

   sha256sum  : SHA-2 Hash aus dem Paketarchiv berechnet
                einzeilig,
                entspricht dem Tag <sha256sum> in der Paket-Info-Datei.

   replaces   : Liste der Ersetzungen, die durch dieses Paket erfolgen,
                mehrzeilig,
                entspricht dem Tag <replaces> in der Paket-Info-Datei.

   require    : Liste der Abhaengigkeiten (ggf. mehrzeiliges Ergebnis)
                mehrzeilig,
                entspricht den Tags <require-package> und <require-lib>
                in der Paket-Info-Datei.

   link       : Liste der verknuepften Pakete (ggf. mehrzeiliges Ergebnis)
                mehrzeilig,
                entspricht dem Tag <linked-package> in der Paket-Info-Datei.

   exclude    : Name des auszuschließenden Paketes. Pakete müssen sich
                gegenseitig ausschließen, damit dies funktioniert.
                mehrzeilig,
                entspricht dem Tag <exclude-package> in der Paket-Info-Datei.

   text       : Langbeschreibung des Pakets (ggf. mehrzeiliges Ergebnis)
                mehrzeilig,
                entspricht dem Tag <description> in der Paket-Info-Datei.

   hint       : Hinweis zum Paketverbleib (nur outdated.db)
                einzeilig,
                keine Entsprechung in der Paket-Info-Datei.

   substitude : Hinweis auf Ersatzpaket (nur outdated.db)
                einzeilig,
                keine Entsprechung in der Paket-Info-Datei.


4.1.3 Separator
---------------

Dem Separator kommt bei der Datenbankabfrage eine besondere Bedeutung zu.
Damit er korrekt erkannt wird, muss er aus genau 57 Minuszeichen bestehen
und den Bereich des Feldnamens mit einschliessen.
Fuer eisman gibt es eine entsprechend vordefinierte Variable in der Datei
'eismanlib'.


4.2 Konvertierung in das Record-Format
--------------------------------------

Da die Paketdaten ueblicherweise nicht schon im Record-Format vorliegen,
sondern eisman sich der Paket-Info-Dateien bedienen muss, um die Datensaetze
zu erzeugen, kommt dem Konvertierungsvorgang eine besondere Bedeutung zu.

Abgesehen von dem Feld "url" und den beiden Felder "hint" und "substitude",
die lediglich in der Datenbank "outdated.db" vorkommen, haben alle uebrigen
Felder eine Ensprechung in der (XML-basierten) Paket-Info-Datei. Bedauer-
licherweise liegen die Paket-Info-Dateien jedoch, historisch bedingt, in
recht unterschiedlichen Formen und Formaten vor, so dass einige Konver-
tierungen und Ausnahmebehandlungen erforderlich sind, um weitestgehend
alle Faelle fehlerfrei abdenken zu koennen.


4.2.1 Zeichensatzkodierung
--------------------------

Paket-Info-Dateien sollten das us-ascii-Format besitzen, damit sie unab-
haengig vom eingestellten Locale des jeweiligen Rechners fehlerfrei be-
arbeitet werden koennen.

Dem ist jedoch in einigen Faellen nicht so. Darum wird im ersten Schritt
die Datei in das korrekte Format gebracht. Dabei gehen jedoch Umlaute und
Sonderzeichen verloren!

Encoding --> us-ascii!


4.2.2 Zeilenkommentare
----------------------

In Unkenntnis des XML-Formats haben einige Paketautoren einige Zeilen in-
nerhalb der Paket-Info-Datei mit dem '#'-Zeichen auskommentiert. Diese
Zeilen werden nach der Zeichenkonvertierung aus der Datei entfernt!

Eine Ausnahme stellt dabei jedoch der Abschnitt <description> dar! In
diesem koennen Zeilen vorkommen, die mit dem '#'-Zeichen beginnen und
dennoch nicht als Kommentar gemeint sind. Darum bleibt dieser Teil unver-
aendert!


4.2.3 Felder einlesen
---------------------

Nun werden die Felder gemaess ihrer Entsprechungen (siehe Kapitel "Feldnamen")
aus der Datei ausgelesen. Lediglich die Felder "name" und "version" sind
obligatorisch, damit der Datensatz von eisman akzeptiert wird, alle uebrigen
Felder werden mit Standardwerten belegt, falls sie nicht vorhanden sind.

   name       : obligatorisch
   version    : obligatorisch
   short      : Standardwert="${name} package"
   date       : Standardwert=""
   author     : Standardwert=""
   section    : Standardwert="unknown"
   space      : Standardwert="1"
   status     : Standardwert="u"
   sha1sum    : Standardwert=""
   sha256sum  : Standardwert=""
   replaces   : Standardwert=""
   require    : Standardwert=""
   link       : Standardwert=""
   exclude    : Standardwert=""
   text       : Standardwert=""

Ist das Feld "name" leer, dann wird alternativ versucht, den vor langer
Zeit noch gueltigen Tag-Wert "<package>   Paketname" zu lesen. Gelingt auch
das nicht, wird der Datensatz nicht akzeptiert.


4.2.4 Paketverlinkung
---------------------

Damit Pakete abhaengig von ihrem Installationsstatus gemeinsam mit anderen
Paketen aktualisiert werden koennen, wurde das Datenfeld "link" eingefuehrt.
Verweist ein Paket mittels dieses Links auf ein anderes Paket in einer
bestimmten Version, dann wird dieses andere Paket mit dem Paket gemeinsam
aktualisiert, falls es zuvor bereits auf dem System installiert war. Dieser
Mechanismus wird beispielsweise dazu verwendet, dass "-dev" Pakete von z.B.
Bibliotheken gemeinsam mit ihrem "Hauptpaket" aktualisiert werden, wenn sie
denn installiert sind.

Bislang wird dieser Link jedoch von keinem Paketbausystem generiert. Daher
muss eisman dies bei der Konvertierung der Daten aus der Paket-Info-Datei
selbst uebernehmen (und folgt damit einer Strategie, wie sie schon frueher im
alten Paketmanager auf aehnliche Weise verfolgt wurde).

Wenn ein Paket mit dem beispielhaften Namen "foo" und der Version "1.0.0"
gegeben ist, dann wird bei der Konvertierung der folgende Link automatisch
angelegt:

   link       foo-dev 1.0.0

Handelt es sich dagegen um eine Bibliothek mit dem ebenfalls beispielhaften
Namen "libfoo". Dann erzeugt eisman die Links:

   link       libfoo-dev 1.0.0
   link       libfoo-dev-static 1.0.0

Handelt es sich bereits um ein Paket mit dem Postfix "-dev-static" oder
"-dev", dann erfolgt kein link Eintrag!

Es ist fuer den Paketmanager voellig unerheblich, ob ein Paket mit dem je-
weiligen Postfix tatsaechlich existiert oder nicht. Ein nicht existierendes
Paket kann niemals bereits installiert sein und kommt damit auch nicht in
den Genuss der Sonderbehandlung.

Dieses Verhalten ist bei der Benennung von Paketen zu beruecksichtigen!

Falls der Automatismus nicht gewuenscht ist, kann ein Paketautor diesen
auch unterbinden. Dies geschieht, indem in der Paket-Info-Datei mittels des
Tags "linked-package" ein -dev Paket explizit angegeben wird.


4.3 Datenbankformat
-------------------

Eine Datenbank besteht aus beliebig vielen einzelnen Datensaetzen, die dem
oben beschriebenen Record-Format entsprechen:

   <Index-Bereich><Datenfeld 1><Daten>
   <Index-Bereich><Datenfeld 2><Daten>
   <Index-Bereich><Datenfeld 3><Daten>
   <Index-Bereich><Datenfeld n><Daten>
   <Index-Bereich>-----------------------------------------------------
   <Index-Bereich><Datenfeld 1><Daten>
   <Index-Bereich><Datenfeld 2><Daten>
   <Index-Bereich><Datenfeld 3><Daten>
   <Index-Bereich><Datenfeld n><Daten>
   <Index-Bereich>-----------------------------------------------------
   <Index-Bereich><Datenfeld 1><Daten>
   <Index-Bereich><Datenfeld 2><Daten>
   <Index-Bereich><Datenfeld 3><Daten>
   <Index-Bereich><Datenfeld n><Daten>
   <Index-Bereich>-----------------------------------------------------


5 Interne Struktur: Aufrufhierarchie
====================================

5.1 Aufrufhierarchie und Kapselung
----------------------------------

eisman folgt hinsichtlich der Kapselung der Funktionalitaet einem Top-Down
Design. Der Anwender kann entweder direkt ueber die Konsole oder mit Hilfe-
des Menuesystems bzw. des Paketbrowsers auf den Paketmanager zugreifen. Der
Zugriff erfolgt dabei immer ueber das Frontend "eisman", das mittels einer
Verriegelung dafuer sorgt, dass immer nur ein Anwender zugleich Aenderungen
an den Paketdatenbanken vornehmen kann. Allerdings ist ein rekursiver Aufruf
des Paketmanagers fuer den selben Benutzer trotz der Sperre moeglich.

Die Skripte unterhalb des Frontends sind fuer alle Aufgaben zustaendig,
die mit der Installation und der Deinstallation von Paketen, sowie der Pfle-
ge der Paketdatenbanken zu tun haben. Sie koennen sich gegenseitig aufrufen
und gehen dabei nicht erneut den Umweg ueber das eisman-Frontend. Es han-
delt sich hierbei um den internen Bereich des Paketmanagers. Niemals sollte
ein Skript unter /usr/share/eisman direkt aufgerufen werden.

Benutzerinteraktionen beschraengken sich im internen Bereich (wo erforder-
lich) auf einfache "ja"/ "nein" -Abfragen und koennen i.d.R. mit Kommando-
zeilenargumenten komplett deaktiviert werden (--auto).


            +-----------------+
            |     Anwender    |
            +-----------------+
                     |
          +----------+----------+
          |                     |
          V                     V
      +---------+       +-----------------------+
      | Konsole |       | Frontend/Menu/Browser |
      +---------+       +-----------------------+
          |                     |
          +----------+----------+
                     |
                     V
            +-----------------+
            | eisman-Frontend |  /usr/bin
            +-----------------+
                     |
                     V
            +-----------------+
            |  eisman-Skripte |  /usr/share/eisman
            +-----------------+
                     |
                     V
           +-------------------+
           |  Paketdatenbanken |  /var/lib/eisman
           +-------------------+


5.2 Die "run"-Schnittstelle
---------------------------

Falls doch der Bedarf besteht, den Paketmanager um eigene Funktionen zu
erweitern, die ebenfalls exklusiv ablaufen sollen, gibt es die "run"-
Schnittstelle, die bereits weiter oben beschrieben wurde.

Der Aufruf der Skripte erfolgt wie auch der der "internen" Befehle ueber
das Frontend "eisman", das dabei die Verriegelung uebernimmt und anschlie-
ssend das angegebene Skript aufruft. Dabei wird angenommen, dass der hin-
ter "run" angegebene Befehl dem Namen eines Skriptes (ohne dessen Endung
".sh") entspricht und im Verzeichnis "/var/install/eisman_run.d" zu finden
ist.

Diese Erweiterungsskripte sind jedoch per Definition kein Teil von eisman
und brauchen sich darum auch nicht an dessen Design-Paradigmen zu orien-
tieren. So koennen aus dem Skript heraus durchaus Paketbrowser oder Menue-
funktionen aufgerufen werden. Die untenstehende Grafik versucht diesen
Zusammenhang zu verdeutlichen.

                                             +-----------+
                                             |           |
            +-----------------+              V           |
            |     Anwender    |        +--------------+  |
            +-----------------+        |  run-Skript  |  |
                     |                 +--------------+  |
                     |                   |   |           |
          +----------+--------+----------+   |           |
          |                   |              |           |
          V                   V              |           |
      +---------+   +--------------+         |           |
      | Konsole |   | Menu/Browser |         |           |
      +---------+   +--------------+         |           |
          |                   |              |           |
          +----------+--------+--------------+           |
                     |                                   |
                     V                                   |
            +-----------------+                          |
            | eisman-Frontend |  /usr/bin                |
            +-----------------+                          |
                     |  |                                |
                     |  +--------------------------------+
                     V
            +-----------------+
            |  eisman-Skripte |  /usr/share/eisman
            +-----------------+
                     |
                     V
           +-------------------+
           |  Paketdatenbanken |  /var/lib/eisman
           +-------------------+





