Provided by: debconf-doc_1.5.66ubuntu1_all bug

NAME

       debconf - Leitfaden für Entwickler

BESCHREIBUNG

       Dies ist ein Leitfaden zum Entwickeln von Paketen, die Debconf benutzen.

       Dieses  Handbuch  nimmt  an,  dass Sie als Benutzer mit Debconf und mit den Grundlagen der
       Konstruktion von Debian-Paketen vertraut sind.

       Dieses Handbuch beginnt, indem  zwei  neue  Dateien  erklärt  werden,  die  Debian-Paketen
       hinzugefügt  werden,  die  Debconf  benutzen.  Dann  erklärt es, wie das Debconf-Protokoll
       arbeitet und verweist Sie auf  einige  Bibliotheken,  die  Ihre  Programme  das  Protokoll
       sprechen  lassen.  Es  diskutiert andere Betreuer-Skripte, in denen Debconf typischerweise
       benutzt wird: die Skripte postinst und postrm. Dann geht es weiter zu  fortgeschritteneren
       Themen,  wie  gemeinsam  benutzte  Debconf-Vorlagen,  Fehlersuche  und  einige  allgemeine
       Techniken und  Stolperfallen  der  Programmierung  mit  Debconf.  Es  schließt  mit  einer
       Diskussion Debconfs gegenwärtiger Einschränkungen.

DAS SKRIPT CONFIG

       Debconf  fügt  ein  zusätzliches  Betreuer-Skript,  das  Skript  config,  zu der Reihe von
       Betreuer-Skripten, die  in  Debian-Paketen  sein  können  (preinst,  postinst,  prerm  und
       postrm), hinzu. Das Skript config ist verantwortlich dafür, alle für die Konfiguration des
       Paketes notwendigen Fragen zu stellen.

       Anmerkung: Es ist ein wenig verwirrend, dass dpkg  das  Ausführen  des  Skriptes  postinst
       eines  Paketes  als »Konfiguration« dieses Paketes bezeichnet, weil ein Paket, das Debconf
       benutzt, oft vor der ersten Ausführung von postinst durch sein Skript config bereits  voll
       vorkonfiguriert ist. Ach ja.

       Wie  dem  Skript  postinst werden config zwei Parameter übergeben wenn es ausgeführt wird.
       Der erste sagt, welche Aktion durchgeführt  wird  und  der  zweite  ist  die  Version  des
       Paketes,  die  gegenwärtig  installiert  ist.  Also  können  Sie,  wie  in  postinst, dpkg
       --compare-versions mit $2 benutzen, um ein bestimmtes Verhalten nur  erfolgen  zu  lassen,
       wenn von einer bestimmten Version des Pakets aktualisiert wird und ähnliche Sachen.

       Das Skript config kann auf eine von drei Arten aufgerufen werden:

       1      Falls ein Paket mit dpkg-preconfigure vorkonfiguriert wird, wird sein Skript config
              aufgerufen und ihm werden die Parameter »configure« und  die  installierte  Version
              übergeben.

       2      Wenn  das  postinst eines Paketes ausgeführt wird, versucht Debconf auch das Skript
              config auszuführen und ihm werden dieselben Parameter übergeben, die ihm  übergeben
              werden,   wenn  es  vorkonfiguriert  wird.  Dies  ist  notwendig,  weil  das  Paket
              möglicherweise nicht vor-konfiguriert wurde und das Skript config noch eine  Chance
              zum Laufen braucht. Siehe HACKS für Details.

       3      Falls  ein  Paket  mit  dpkg-reconfigure erneut konfiguriert wird, wird sein Skript
              config ausgeführt und ihm  werden  die  Parameter  »reconfigure«  und  installierte
              Version übergeben.

       Beachten  Sie, da es typisch ist, ein Paket mit APT zu installieren oder zu aktualisieren,
       Schritte eins und zwei laufen, das Skript config also zweimal ausgeführt wird.  Es  sollte
       beim  zweiten  Mal nichts tun (zweimal hintereinander Fragen zu stellen ist nervig) und es
       sollte definitiv idempotent sein. Glücklicherweise  vermeidet  es  Debconf  standardmäßig,
       Fragen wiederholt zu stellen, so dass dies generell einfach zu erreichen ist.

       Beachten  Sie,  dass  das Skript config ausgeführt wird, bevor das Paket entpackt wird. Es
       sollte nur Befehle benutzen, die in  essenziellen  Paketen  enthalten  sind.  Die  einzige
       Abhängigkeit  Ihres  Paketes,  die  garantierterweise erfüllt ist, wenn sein Skript config
       läuft, ist eine (möglicherweise versionierte) Abhängigkeit von Debconf selbst.

       Das Skript config sollte überhaupt nicht das Dateisystem verändern müssen.  Es  examiniert
       einfach  den  Zustand  des  Systems und stellt Fragen und Debconf speichert die Antworten,
       damit später vom Skript postinst nach Ihnen gehandelt wird. Umgekehrt  sollte  das  Skript
       postinst  fast nie Debconf benutzen, um Fragen zu stellen, sondern sollte stattdessen nach
       den Antworten auf die Fragen, die das Skript config gestellt hat, handeln.

DIE DATEI TEMPLATES

       Ein Paket, das Debconf benutzt, möchte möglicherweise einige Fragen stellen. Diese  Fragen
       werden in Vorlagenform in der Datei »templates« gespeichert.

       Wie das Skript config, wird die Datei templates in dem Abschnitt control.tar.gz eines .deb
       abgelegt. Ihr Format ist ähnlich dem einer  Debian-Control-Datei;  eine  Reihe  von  durch
       Leerzeichen  getrennten  Instanzen,  wobei jeder dieser Instanzen eine Form ähnlich RFC822
       hat:

         Template: foo/bar
         Type: string
         Default: foo
         Description: Dies ist ein Muster einer Zeichenkettenfrage.
          Dies ist die erweiterte Beschreibung.
          .
          Beachten Sie dass:
           - Wie in einer Paketbeschreibung Debians,
             leitet ein Punkt auf seiner eigenen Zeile
             einen neuen Absatz ein.
           - Der meiste Text wird wortweise umbrochen,
             aber zweifach eingerückter Text wird
             belassen, so dass Sie dies für Listen von
             Elementen benutzen können, wie diese Liste.
             Seien Sie vorsichtig, weil der Text nicht
             wortweise umbrochen wird, sieht er
             schlecht aus, falls er zu breit ist. Es für
             kurze Elemente benutzen ist am Besten
             (also ist dies ein schlechtes Beispiel).

         Template: foo/baz
         Type: boolean
         Description: Klar genug, nein?
          Dies ist eine weitere Frage, vom Booleschen Typ.

       Für einige Beispiele von Vorlagendatei aus  dem  wahren  Leben,  siehe  /var/lib/dpkg/info
       /debconf.templates und andere auf .templates endende Dateien in dem Verzeichnis.

       Lassen Sie uns jedes der Felder der Reihe nach ansehen:

       Template (Vorlage)
              Dem  Namen  der Vorlage, in dem Feld »Template«, wird generell der Name des Paketes
              vorangestellt. Danach ist der Namensraum  weit  offen;  Sie  können  ein  einfaches
              flaches  Layout  wie  das  oben  benutzen, oder »Unterverzeichnisse« aufsetzen, die
              verwandte Fragen enthalten.

       Type (Typ)
              Der Typ der Vorlage bestimmt,  welche  Art  von  Oberflächen-Element  dem  Benutzer
              angezeigt wird. Die gegenwärtig unterstützten Typen sind:

              string (Zeichenkette)
                     Resultiert  in  einem  Eingabefeld freier Form, in das der Benutzer jegliche
                     Zeichenkette eingeben kann.

              password (Passwort)
                     Gibt dem Benutzer eine Eingabeaufforderung für ein  Passwort  aus.  Benutzen
                     Sie dies mit Vorsicht; vergegenwärtigen Sie sich, dass das Passwort, das der
                     Benutzer eingibt, in Debconfs Datenbank geschrieben wird. Sie sollten diesen
                     Wert möglicherweise aus der Datenbank säubern, sobald dies möglich ist.

              boolean (Boolesch)
                     Eine Auswahl »wahr/falsch« (true/false).

              select (Auswahl)
                     Eine  Auswahl  aus  einer  Anzahl  von Werten. Die Auswahlen müssen in einem
                     »Choices« benannten Feld angegeben werden. Trennen Sie die  möglichen  Werte
                     mit Komma und Leerzeichen, wie hier:
                       Choices: Ja, Nein, Vielleicht

              multiselect (Mehrfachauswahl)
                     Wie  der  Datentyp select, außer dass der Benutzer eine beliebige Anzahl von
                     Elementen aus der Auswahlliste auswählen kann (oder gar keins).

              note (Anmerkung)
                     Statt per se eine Frage zu sein, gibt dieser Datentyp eine Anmerkung an, die
                     dem  Benutzer angezeigt werden kann. Sie sollte nur für wichtige Anmerkungen
                     benutzt werden, die der Benutzer wirklich sehen sollte, weil Debconf  großen
                     Aufwand  betreibt,  um  sicherzustellen,  dass  der  Benutzer sie sieht; die
                     Installation anhält, so dass der Benutzer  eine  Taste  drückt.  Es  ist  am
                     Besten,  dies  nur  für Warnungen über sehr ernsthafte Probleme zu benutzen,
                     und oft ist der passendere Datentyp »error«.

              error (Fehler)
                     Dieser Datentyp wird für Fehlermeldungen benutzt,  so  wie  Fehler  bei  der
                     Eingabe-Validierung.  Debconf zeigt eine Frage dieses Typs selbst dann, wenn
                     die Priorität zu hoch ist oder der Benutzer sie bereits gesehen hat.

              title (Titel)
                     Dieser Datentyp wird für Titel benutzt, die mit dem Befehl SETTITLE  gesetzt
                     werden.

              text (Text)
                     Dieser   Datentyp  kann  für  Textfragmente  benutzt  werden,  zum  Beispiel
                     Beschriftungen,  die  aus  kosmetischen  Gründen  in  der  Anzeige   mancher
                     Benutzerschnittstellen  benutzt werden können. Andere Benutzerschnittstellen
                     benutzen ihn überhaupt nicht. Es gibt noch keinen Anlass, diesen Datentyp zu
                     benutzen,  weil  keine  Benutzerschnittstelle ihn gut unterstützt. Er mag in
                     der Zukunft sogar entfernt werden.

       Default (Vorgabe)
              Das Feld »Default« sagt Debconf, was der Vorgabe-Wert sein sollte. Für den Datentyp
              multiselect  kann es eine durch Komma und Leerzeichen getrennte Liste von Auswahlen
              sein, ähnlich dem Feld »Choices«. Für  den  Datentyp  select  sollte  es  eine  der
              Auswahlmöglichkeiten  sein. Für den Booleschen Datentyp ist es »true« oder »false«,
              während es bei einer Zeichenkette alles sein kann,  und  für  Passwörter  ignoriert
              wird.

              Machen Sie nicht den Fehler zu denken, dass das Feld »Default« den »Wert« der Frage
              enthält, oder dass es benutzt werden kann, um den Wert der Frage zu ändern. Es  tut
              dies  nicht,  und  kann es nicht, es liefert lediglich einen Vorgabe-Wert, wenn die
              Frage das erste Mal angezeigt wird.  Um  eine  Vorgabe  zu  liefern,  die  sich  im
              Vorbeigehen ändert, müssten Sie den Befehl SET benutzen, um den Wert einer Frage zu
              ändern.

       Description (Beschreibung)
              Das Feld »Description« hat, wie die Beschreibung eines Debian-Paketes, zwei  Teile:
              Eine  Kurzbeschreibung  und eine erweiterte Beschreibung. Beachten Sie, dass einige
              von Debconfs Benutzerschnittstellen die lange Beschreibung nicht anzeigen, oder sie
              nur  anzeigen, falls der Benutzer um Hilfe bittet. Also sollte die Kurzbeschreibung
              für sich alleine stehen können.

              Falls Sie sich keine lange Beschreibung ausdenken können, dann  denken  Sie  zuerst
              weiter  nach. Schreiben Sie auf debian-devel. Bitten Sie um Hilfe. Besuchen Sie ein
              Schriftsteller-Seminar! Diese erweiterte Beschreibung ist wichtig. Falls  Sie  nach
              allem  immer  noch  nichts  haben,  lassen Sie sie leer. Es gibt keinen Anlass, die
              Kurzbeschreibung zu kopieren.

              Der Text in der erweiterten Beschreibung  wird  wortweise  umbrochen,  solange  ihm
              nicht  zusätzlicher  Leerraum  vorangestellt  wird  (über  das  eine  erforderliche
              Leerzeichen hinaus). Sie können den Text auf getrennte Absätze verteilen, indem Sie
              » .« (Leerzeichen Punkt) auf eine eigene Zeile zwischen diesen setzen.

FRAGEN

       Eine  Frage  ist  eine  instanziierte  Vorlage.  Indem  Sie  Debconf  bitten,  eine  Frage
       anzuzeigen, kann Ihr Skript config  mit  dem  Benutzer  interagieren.  Wenn  Debconf  eine
       Vorlagendatei  lädt  (dies  passiert wann immer ein Skript config oder postinst ausgeführt
       wird), instanziiert es automatisch aus  jeder  Vorlage  eine  Frage.  Es  ist  tatsächlich
       möglich,  aus derselben Vorlage mehrere unabhängige Fragen zu instanziieren (indem man den
       Befehl REGISTER benutzt), aber das ist selten notwendig. Vorlagen  sind  statische  Daten,
       die  aus der Vorlagendatei kommen, während Fragen benutzt werden, um dynamische Daten, wie
       der aktuelle Wert der Frage, ob der Benutzer die Frage gesehen  hat,  und  so  weiter,  zu
       speichern.  Behalten  Sie  die  Unterscheidung  zwischen  einer Vorlage und einer Frage im
       Sinne, aber sorgen Sie sich nicht zu sehr darum.

GEMEINSAM BENUTZTE VORLAGEN

       Es ist tatsächlich möglich, eine Vorlage und eine Frage zu haben, die von einer Reihe  von
       Paketen  gemeinsam  benutzt  werden.  Alle  Pakete  müssen  in  ihren  Vorlagedateien eine
       identische Kopie der Vorlage liefern. Dies  kann  nützlich  sein,  falls  ein  Haufen  von
       Paketen  dieselbe  Frage  stellen  muss  und  Sie den Benutzer damit nur einmal belästigen
       wollen. Gemeinsam benutzte Vorlagen werden generell in Debconfs Vorlagennamensraum in  dem
       Pseudo-Verzeichnis »shared/« eingerichtet.

DAS DEBCONF-PROTOKOLL

       Die   Skripte   config   können   unter   Benutzung  des  Debconf-Protokolls  mit  Debconf
       kommunizieren. Dies ist ein  einfaches  zeilen-orientiertes  Protokoll,  ähnlich  gängigen
       Internetprotokollen wie SMTP. Das Skript config schickt Debconf einen Befehl, indem es den
       Befehl  auf  die  Standardausgabe  schreibt.  Dann  kann  es  Debconfs  Antwort  von   der
       Standardeingabe lesen.

       Debconfs Antwort kann auf zwei Teile aufgeteilt sein: Einen nummerischen Ergebniscode (das
       erste Wort der Antwort) und  einen  optionalen  erweiterten  Ergebniscode  (der  Rest  der
       Antwort).  Der  nummerische  Code  benutzt 0, um Erfolg anzuzeigen, und andere Nummern, um
       verschiedene Arten von Fehlschlägen anzuzeigen. Für die vollen Details siehe  die  Tabelle
       im Dokument Debconf-Spezifikation in den Debian-Richtlinien (policy).

       Der  erweiterte  Rückgabewert  ist  generell  formfrei und unspezifiziert, so dass Sie ihn
       generell ignorieren sollten, und sicherlich nicht versuchen sollten, ihn in einem Programm
       zu  analysieren,  um herauszuarbeiten, was Debconf tut. Die Ausnahme sind Befehle wie GET,
       die veranlassen, einen Wert in dem erweiterten Rückgabewert zurückzugeben.

       Im Allgemeinen ist es sinnvoll, eine sprachspezifische Bibliothek benutzen,  die  sich  um
       die  Details  der  Einrichtung  von  und Kommunikation über diese Verbindungen mit Debconf
       kümmert.

       Für soweit sind hier die  Befehle  in  dem  Protokoll.  Dies  ist  nicht  die  maßgebliche
       Definition, siehe hierzu das Dokument der Debconf-Spezifikation in den Debian-Richtlinien.

       VERSION Nummer
              Im Allgemeinen brauchen Sie diesen Befehl nicht zu benutzen. Er tauscht mit Debconf
              die benutzte Versionsnummer des Protokolles aus. Die aktuelle Protokoll-Version ist
              2.0,  und  Versionen  in der 2.x Serie werden rückwärts-kompatibel sein. Sie können
              die Nummer der Protokoll-Version angeben, die Sie sprechen, und  Debconf  gibt  die
              Protokoll-Version,  die  es  spricht, in dem erweiterten Ergebniscode zurück. Falls
              die  Version,  die  Sie  angeben,  zu  niedrig  ist,  antwortet  Debconf  mit   dem
              nummerischen Code 30.

       CAPB Fähigkeiten
              Im Allgemeinen brauchen Sie diesen Befehl nicht zu benutzen. Er tauscht mit Debconf
              eine Liste unterstützter Fähigkeiten (getrennt durch Leerzeichen) aus. Fähigkeiten,
              die  sowohl Debconf und Sie unterstützen, werden benutzt, und Debconf antwortet mit
              allen Fähigkeiten, die es unterstützt.

              Falls »escape« unter Ihren Fähigkeiten zu finden ist, erwartet Debconf, dass in den
              Befehlen, die Sie ihm schicken, Rückwärtsschrägstriche und Zeilenumbrüche geschützt
              sind (respektive als \\ und \n) und es schützt im  Gegenzug  Rückwärtsschrägstriche
              und  Zeilenumbrüche  in  seinen Antworten. Die kann zum Beispiel benutzt werden, um
              mehrzeilige Zeichenketten zu Vorlagen zu  ersetzen,  oder  bei  der  Benutzung  von
              METAGET  mehrzeilige  erweiterte  Beschreibungen verlässlich zu bekommen. In diesem
              Modus  müssen  Sie   Texteingaben   selbst   schützen   (Sie   können   als   Hilfe
              debconf-escape(1)  benutzen,  falls  Sie  wollen), aber die confmodule-Bibliotheken
              entfernen für Sie den Schutz in Antworten.

       SETTITLE Frage
              Dies  setzt  den  Titel,  den  Debconf  dem  Benutzer  anzeigt.  Hierzu  wird   die
              Kurzbeschreibung  der Vorlage für die angegebene Frage verwandt. Die Vorlage sollte
              vom Typ »Title« sein. Sie  müssen  diesen  Befehl  selten  benutzen,  weil  Debconf
              automatisch einen Titel basierend auf dem Namen Ihres Paketes erstellt.

              Setzen  des Titel aus einer Vorlage bedeutet, dass sie am gleichen Ort wie der Rest
              der Debconf-Fragen gespeichert sind und dass eine Übersetzung erlaubt wird.

       TITLE Zeichenkette
              Dies setzt den Titel, den Debconf dem Benutzer anzeigt. Hierzu wird die  angegebene
              Zeichenkette  verwandt.  Die  Verwendung  des Befehls »SETTITLE« wird normalerweise
              bevorzugt, da es die Übersetzung des Titels erlaubt.

       INPUT Priorität Frage
              Bitte Debconf, die Anzeige einer Frage an den  Benutzer  vorzubereiten.  Die  Frage
              wird  solange  nicht  tatsächlich  angezeigt,  bis der Befehl GO gegeben wird; dies
              erlaubt es, mehrere INPUT-Befehle in Serie zu  geben,  um  eine  Reihe  von  Fragen
              aufzubauen, die alle auf einem einzelnen Bildschirm gestellt werden könnten.

              Das  Feld Priorität sagt Debconf, wie wichtig es ist, dass diese Frage dem Benutzer
              angezeigt wird. Die Prioritäts-Werte sind:

              niedrig (low)
                     Sehr triviale Elemente, die Vorgaben haben, die in der großen  Mehrheit  der
                     Fälle funktionieren; nur Kontroll-Freaks sehen diese.

              medium Normale Elemente, die vernünftige Vorgaben haben.

              hoch (high)
                     Elemente, die keine vernünftigen Vorgaben haben.

              kritisch (critical)
                     Elemente,   die   möglicherweise   ohne   Intervention   des  Benutzers  die
                     Systemintegrität stören.

              Debconf entscheidet, ob die Frage tatsächlich angezeigt wird, basierend auf  seiner
              Priorität,   und   ob   der   Benutzer   sie   schon   gesehen   hat,   und  welche
              Benutzerschnittstelle benutzt wird. Falls die Frage nicht angezeigt wird, antwortet
              Debconf mit Code 30.

       GO
              Lässt  Debconf  die  angesammelte  Reihe  von  Fragen  (aus den INPUT-Befehlen) dem
              Benutzer anzeigen.

              Falls die Fähigkeit backup unterstützt wird und der Benutzer anzeigt, dass er einen
              Schritt zurückgehen will, antwortet Debconf mit Code 30.

       CLEAR  Löscht  die  angesammelte  Reihe  von  Fragen  (aus  den  INPUT-Befehlen)  ohne sie
              anzuzeigen.

       BEGINBLOCK

       ENDBLOCK
              Einige Debconf-Benutzerschnittstellen können eine Anzahl von  Fragen  dem  Benutzer
              auf  einmal  anzeigen.  Vielleicht  kann zukünftig sogar eine Benutzerschnittstelle
              diese Fragen auf dem Bildschirm  in  Blöcke  gruppieren.  BEGINBLOCK  und  ENDBLOCK
              können  um  eine  Reihe  von  INPUT-Befehlen platziert werden, um Blöcke von Fragen
              anzuzeigen  (und  Blöcke  können  sogar  geschachtelt  werden).  Weil  noch   keine
              Debconf-Benutzerschnittstelle  so fortgeschritten ist, werden diese Befehle derzeit
              ignoriert.

       STOP   Dieser Befehl sagt Debconf, dass Sie fertig damit sind, mit ihm zu reden. Oft  kann
              Debconf  die  Beendigung  Ihres  Programmes  erkennen  und  dieser Befehl ist nicht
              notwendig.

       GET Frage
              Nach der Benutzung von INPUT und GO, um eine Frage anzuzeigen,  können  Sie  diesen
              Befehl benutzen, um den Wert zu erhalten, den der Benutzer eingegeben hat. Der Wert
              wird in dem erweiterten Ergebniscode zurückgegeben.

       SET Frage Wert
              Dies setzt den Wert einer Frage, und es kann benutzt  werden,  um  die  Vorgabe  zu
              überstimmen, mit etwas, das Ihr Programm direkt berechnet.

       RESET Frage
              Dies  setzt  die  Frage wieder auf ihren Vorgabe-Wert (wie er in dem Feld »Default«
              ihrer Vorlage angegeben ist).

       SUBST Frage Schlüssel Wert
              Fragen können in ihren Feldern »Description« und »Choices« Ersetzungen  eingebettet
              haben  (die Benutzung von Ersetzungen in »Choices«-Feldern ist allerdings ein wenig
              ein Hack; ein  besserer  Mechanismus  wird  irgendwann  einmal  entwickelt).  Diese
              Ersetzungen sehen aus wie »${schlüssel}«. Wenn die Frage angezeigt wird, werden die
              Ersetzungen mit ihren Werten gefüllt. Dieser Befehl kann  benutzt  werden,  um  den
              Wert  einer  Ersetzung  zu  setzen.  Dies ist nützlich, falls Sie dem Benutzer eine
              Meldung anzeigen müssen, die Sie nicht fest in der Vorlagen-Datei kodieren können.

              Versuchen Sie nicht, SUBST zu benutzen, um den Vorgabe-Wert einer Frage zu  ändern;
              es wird nicht funktionieren, da es für diesen Zweck explizit einen Befehl SET gibt.

       FGET Frage Schalter
              Fragen können Schalter assoziiert werden. Die Schalter können die Werte »true« oder
              »false« haben. Dieser Befehl gibt den Wert eines Schalters zurück.

       FSET Frage Schalter Wert
              Dies setzt den Wert eines Schalters einer Frage. Der Wert muss entweder »true« oder
              »false« sein.

              Ein  gängiger  Schalter  ist der Schalter »seen«. Es ist normalerweise nur gesetzt,
              falls ein Benutzer eine Frage bereits gesehen  hat.  Debconf  zeigt  Benutzern  für
              gewöhnlich  nur  Fragen an, falls der Schalter »seen« auf »false« gesetzt ist (oder
              falls es ein Paket erneut konfiguriert). Manchmal wollen  Sie,  dass  der  Benutzer
              eine  Frage  erneut  sieht  --  in diesen Fällen können Sie den Schalter »seen« auf
              »false« setzen, um von Debconf zu erzwingen, dass es die Frage erneut anzeigt.

       METAGET Frage Feld
              Dies gibt den Wert eines jeglichen Felds der einer Frage zugeordneten Vorlage  (zum
              Beispiel die Beschreibung) zurück.

       REGISTER Vorlage Frage
              Dies  erzeugt  eine neue Frage, die an eine Vorlage gebunden ist. Standardmäßig hat
              jede Vorlage eine zugeordnete Frage mit demselben Namen. Jedoch kann wirklich  jede
              Anzahl  Fragen  mit  einer Vorlage assoziiert sein, und dies lässt Sie mehr solcher
              Fragen erzeugen.

       UNREGISTER Frage
              Dies entfernt eine Frage aus der Datenbank.

       PURGE  Rufen Sie dies in Ihrem postrm auf, wenn Ihr Paket vollständig  entfernt  wird.  Es
              entfernt alle Fragen Ihres Paketes aus Debconfs Datenbank.

       X_LOADTEMPLATEFILE /pfad/zu/templates [Eigentümer]
              Diese  Erweiterung  lädt  die  angegebene  Vorlage-Datei in Debconfs Datenbank. Der
              Eigentümer ist standardmäßig das Paket, das mit Debconf konfiguriert wird.

       Hier ist ein einfaches Beispiel des Debconf-Protokolles in Aktion.

         INPUT medium debconf/frontend
         30 question skipped
         FSET debconf/frontend seen false
         0 false
         INPUT high debconf/frontend
         0 question will be asked
         GO
         [ Hier zeigt Debconf dem Benutzer eine Frage an. ]
         0 ok
         GET no/such/question
         10 no/such/question doesn't exist
         GET debconf/frontend
         0 Dialog

BIBLIOTHEKEN

       Die  Dinge  von  Hand  aufsetzen,  so  dass  Sie  mit  Debconf  reden   können   und   das
       Debconf-Protokoll  sprechen  ist ein wenig zu viel Arbeit, also existieren einige schlanke
       Bibliotheken, um diese kleinere Schinderei zu erleichtern.

       Für Shell-Programmierung gibt es die Bibliothek /usr/share/debconf/confmodule, die Sie  am
       Anfang  eines  Shell-Skriptes  einlesen  und mit Debconf auf ziemlich natürliche Art reden
       können,  indem  Sie  klein-buchstabige  Versionen  der  Befehle  des   Debconf-Protokolles
       benutzen,  denen  »db_«  vorangestellt  ist (zB »db_input« und »db_go«). Für Details siehe
       confmodule(3).

       Perl-Programmierer   können   das    Perl-Modul    Debconf::Client::ConfModule(3pm)    und
       Python-Programmierer können das Python-Modul debconf benutzen.

       Der  Rest  dieses  Handbuches  benutzt  die  Bibliothek  /usr/share/debconf/confmodule  in
       Beispiel-Shell-Skripten. Hier ist ein Beispiel-Skript für  config,  das  diese  Bibliothek
       benutzt und einfach eine Frage stellt:

         #!/bin/sh
         set -e
         . /usr/share/debconf/confmodule
         db_set meinpaket/reboot-now false
         db_input high meinpaket/reboot-now || true
         db_go || true

       Bemerken  Sie  den Gebrauch von »|| true«, um zu vermeiden, dass sich das Skript vorzeitig
       beendet, falls Debconf entscheidet, dass es  eine  Frage  nicht  anzeigen  kann  oder  der
       Benutzer  versucht  zurückzugehen.  In  diesen Situationen gibt Debconf einen Rückgabewert
       ungleich null zurück  und  da  dies  Shell-Skript  mit  »set  -e«  beginnt  würde  es  ein
       nicht-abgefangener Rückgabewert abbrechen lassen.

       Und  hier  ist  ein  entsprechendes Skript postinst, das die Antwort des Benutzers auf die
       Frage benutzt, um zu sehen, ob das System neu gestartet werden sollte (ein  eher  absurdes
       Beispiel ...):

         #!/bin/sh
         set -e
         . /usr/share/debconf/confmodule
         db_get meinpaket/reboot-now
         if [ "$RET" = true ]; then
            shutdown -r now
         fi

       Bemerken  Sie den Gebrauch der Variablen $RET, um den erweiterten Rückgabewert des Befehls
       GET zu erhalten, die die Antwort des Benutzers auf die Frage enthält.

DAS SCRIPT POSTINST

       Der letzte Abschnitt enthielt ein Beispiel eines Skriptes postinst, das  Debconf  benutzt,
       um  den Wert einer Frage zu erhalten und danach zu handeln. Hier nun einige Dinge, die Sie
       im Kopf behalten sollten, wenn Sie postinst-Skripte schreiben, die Debconf benutzen:

       *      Vermeiden Sie es, im postinst Fragen zu  stellen.  Stattdessen  sollte  das  Skript
              config  Fragen  unter  Benutzung von Debconf stellen, so dass die Vor-Konfiguration
              funktioniert.

       *      Lesen Sie immer /usr/share/debconf/confmodule am Beginn Ihres postinst ein,  selbst
              falls  Sie  in  ihm  keine  Befehle  db_*  ausführen.  Dies  ist  erforderlich,  um
              sicherzustellen, dass das Skript config die Chance erhält zu  laufen  (siehe  HACKS
              für Details).

       *      Vermeiden  Sie,  irgendwas  auf  die  Standardausgabe  auszugeben, weil das Debconf
              verwirren kann, und postinst sollte ohnehin nicht wortreich sein. Ausgabe  auf  die
              Standardfehlerausgabe ist in Ordnung, falls Sie müssen.

       *      Falls  Ihr  postinst  einen Daemon startet, stellen Sie sicher, dass Sie Debconf am
              Ende ein STOP übermitteln, weil Debconf sonst darüber, wann Ihr  postinst  zu  Ende
              ist, ein wenig verwirrt werden kann.

       *      Lassen Sie Ihr Skript postinst einen ersten Parameter »reconfigure« akzeptieren. Es
              kann ihn genau wie »configure« behandeln. Dies wird in einer späteren  Version  von
              Debconf benutzt werden, um postinsts wissen zu lassen, dass sie erneut konfiguriert
              werden.

ANDERE SKRIPTE

       Neben  den  Skripten  config  und  postinst  können  Sie  Debconf  in  jedem  der  anderen
       Betreuerskripten  benutzen.  Am gängigsten werden Sie Debconf in Ihrem postrm benutzen, um
       den Befehl PURGE aufzurufen, wenn Ihr Paket vollständig entfernt wird, um  seine  Einträge
       aus  der  Debconf-Datenbank  zu  säubern.  (Dies  wird  übrigens  automatisch  für Sie von
       dh_installdebconf(1) eingerichtet.)

       Ein umfassenderer Gebrauch von Debconf wäre es, falls Sie es im postrm  benutzen  wollten,
       wenn  Ihr  Paket  vollständig  entfernt  wird, um eine Frage zu stellen, ob etwas gelöscht
       werden soll. Oder vielleicht finden Sie, dass  Sie  es  aus  irgendeinem  Grund  in  Ihrem
       preinst  oder  prerm  benutzen müssen. Alle diese Anwendungen werden funktionieren, obwohl
       sie es möglicherweise mit sich ziehen, in demselben Programm Fragen zu  stellen  und  nach
       den  Antworten  zu  handeln,  statt  diese  beiden  Aktivitäten  zu trennen, wie es in den
       Skripten config und postinst geschieht.

       Beachten Sie, dass falls der einzige Gebrauch von Debconf Ihres Paketes im postrm ist, Sie
       das  postinst  Ihres  Paketes  /usr/share/debconf/confmodule  einlesen  lassen sollten, um
       Debconf die Chance zu geben, Ihre Vorlagendatei in seine Datenbank einzulesen. Dann werden
       die Vorlagen verfügbar sein, wenn Ihr Paket vollständig entfernt wird.

       Sie  können  Debconf  auch  in  anderen,  alleinstehenden  Programmen benutzen. Sie müssen
       hierbei aufpassen, dass Debconf nicht als eine Registrierung ausgelegt ist und als  solche
       nicht  verwendet  werden darf. Dies ist immer noch Unix und Programme werden durch Dateien
       in /etc konfiguriert, nicht von irgendeiner nebulösen Debconf-Datenbank (das  ist  ohnehin
       nur  ein  Zwischenspeicher  und  könnte entfernt werden). Also denken Sie lange und scharf
       nach bevor Sie Debconf in einem alleinstehenden Programm verwenden.

       Es gibt Fälle, wo es Sinn ergeben kann, wie in dem Programm apt-setup. Es benutzt Debconf,
       um  den  Benutzer  in  einer  Weise  zu  befragen, die konsistent mit dem Rest von Debians
       Installationsprozess ist und dann unmittelbar  nach  seinen  Antworten  handelt,  um  APTs
       sources.list einzurichten.

LOKALISIERUNG

       Debconf  unterstützt die Lokalisierung von Vorlage-Dateien. Dies wird durch das Hinzufügen
       weiterer Felder erreicht, die übersetzten Text enthalten. Jedes der Felder kann  übersetzt
       werden.  Zum  Beispiel  könnten  Sie  die  Beschreibung  ins  Spanische übersetzen wollen.
       Erstellen Sie  einfach  ein  »Description-es«  benanntes  Feld,  welches  die  Übersetzung
       enthält.  Falls  ein  übersetztes Feld nicht verfügbar ist, greift Debconf auf das normale
       englische Feld zurück.

       Neben   dem   Feld    »Description«    sollten    Sie    das    Feld    »Choices«    einer
       (Mehrfach-)Auswahl-Vorlage  übersetzen.  Stellen  Sie  sicher,  dass  Sie  die übersetzten
       Optionen  in  derselben  Reihenfolge  auflisten,  wie  Sie  in  dem  Hauptfeld   »Choices«
       erscheinen.  Sie  brauchen  nicht  das  Feld  »Default«  einer (Mehrfach-)Auswahl-Frage zu
       übersetzen, und der Wert der Frage wird automatisch auf Englisch zurückgegeben.

       Sie werden es einfacher finden, Übersetzungen zu verwalten, falls Sie  sie  in  getrennten
       Dateien  halten;  eine  Datei  pro  Übersetzung. In der Vergangenheit wurden die Programme
       debconf-getlang(1) und debconf-mergetemplate(1) benutzt, um Dateien debian/template.ll  zu
       verwalten.   Dies   wurde   durch   das  Paket  po-debconf(7)  ersetzt,  welches  Sie  mit
       Debconf-Übersetzungen in .po-Dateien agieren lässt, genauso wie mit anderen Übersetzungen.
       Ihre Übersetzer werden Ihnen den Gebrauch dieses neuen, verbesserten Mechanismus danken.

       Für die Details zu po-debconf lesen Sie seine Handbuchseite. Falls Sie debhelper benutzen,
       ist das Konvertieren nach  po-debconf  ein  einfaches  einmaliges  Ausführen  des  Befehls
       debconf-gettextize(1)  und  das  Hinzufügen  einer Bauzeit-Abhängigkeit auf po-debconf und
       debhelper (>= 4.1.13).

DAS ALLES ZUSAMMENSETZEN

       Nun haben Sie also ein Skript config, eine  Datei  templates,  ein  Skript  postinst,  das
       Debconf  benutzt  und  so  weiter.  Diese Teile zu einem Debian-Paket zusammenzusetzen ist
       nicht schwer. Sie können es von Hand machen oder Sie können dh_installdebconf(1) benutzen,
       welches  Ihre  übersetzten  Vorlagen  zusammenfügt,  für  Sie die Dateien an die richtigen
       Stellen kopiert, und das sogar den Aufruf von PURGE generieren kann, der in  Ihren  Skript
       postrm  stehen sollte. Stellen Sie sicher, dass Ihr Paket von debconf (>= 0.5) abhängt, da
       frühere Versionen nicht mit allem in diesem Handbuch beschriebenen kompatibel  waren.  Und
       Sie sind fertig.

       Nun,  außer  was das Testen, die Fehlersuche und das tatsächliche Benutzen von Debconf für
       interessantere Dinge, als ein Paar grundlegende Fragen zu stellen, angeht. Lesen Sie dafür
       weiter.

FEHLERSUCHE

       Sie haben nun also ein Paket, welches Debconf benutzen soll, aber es funktioniert nicht so
       richtig. Vielleicht stellt Debconf einfach nicht die Fragen, die Sie  eingerichtet  haben.
       Oder vielleicht geschieht etwas verrückteres; es hängt in irgendeiner Endlosschleife, oder
       schlimmer. Glücklicherweise hat Debconf viele Fähigkeiten zur Fehlersuche.

       DEBCONF_DEBUG
              Die erste Sache, nach der zu greifen ist, ist die Umgebungsvariable  DEBCONF_DEBUG.
              Falls  Sie  DEBCONF_DEBUG=developer  setzen  und  exportieren, gibt Debconf auf der
              Standardfehlerausgabe einen Abzug des Debconf-Protokolles aus, während Ihr Programm
              läuft. Er sieht ungefähr so aus -- der Tippfehler ist klar:

               debconf (developer): <-- input high debconf/frontand
               debconf (developer): --> 10 "debconf/frontand" doesn't exist
               debconf (developer): <-- go
               debconf (developer): --> 0 ok

              Es    ist   ziemlich   nützlich   (nach   der   Meinung   des   Autors),   Debconfs
              Benutzerschnittstelle readline zu benutzen, während Sie auf der  Fehlersuche  sind,
              da  die  Fragen  nicht  im  Weg  sind,  und  alle  Ausgabe  zur Fehlersuche einfach
              aufbewahrt und protokolliert werden kann.

       DEBCONF_C_VALUES
              Falls   diese   Umgebungsvariable   auf    »true«    gesetzt    ist,    wird    die
              Benutzerschnittstelle die Werte statt die beschreibenden Werte in Choices-C-Feldern
              (so vorhanden) von select- und multiselect-Vorlagen anzeigen.

       debconf-communicate
              Ein weiteres nützliches Werkzeug ist das Programm  debconf-communicate(1).  Starten
              Sie  es  und Sie können interaktiv das rohe Debconf-Protokoll mit Debconf sprechen.
              Dies ist großartig, um Sachen im Vorbeigehen auszuprobieren.

       debconf-show
              Falls ein Benutzer  von  einem  Problem  berichtet,  kann  debconf-show(1)  benutzt
              werden,  um  einen  Abzug  aller Fragen, die Ihr Paket besitzt, zu erstellen, unter
              Anzeige ihrer Werte und ob der Benutzer sie gesehen hat.

       .debconfrc
              Um den oft ermüdenden Zyklus Bauen/Installieren/Fehlersuchen zu vermeiden, kann  es
              nützlich  sein,  Ihre Vorlagen mit debconf-loadtemplate(1) zu laden, und Ihr Skript
              config von Hand mit dem Befehl debconf(1) auszuführen. Jedoch müssen Sie dies immer
              noch  als  root  machen,  richtig?  Nicht so gut. Und idealerweise würden Sie gerne
              sehen, wie eine frische Installation Ihres Paketes  aussieht,  mit  einer  sauberen
              Debconf-Datenbank.

              Es  stellt  sich  heraus, dass falls Sie eine Datei ~/.debconfrc für einen normalen
              Benutzer aufsetzen, die auf persönliche  config.dat  und  template.dat  für  diesen
              Benutzer  verweist,  Sie nach Belieben ohne irgendeinen root-Zugriff Vorlagen laden
              und config-Skripte ausführen können. Falls Sie mit  einer  sauberen  Datenbank  von
              Vorne beginnen möchten, löschen Sie einfach die Dateien *.dat.

              Für  Details,  dies  aufzusetzen,  siehe  debconf.conf(5)  und  beachten  Sie  dass
              /etc/debconf.conf eine gute Vorlage für eine persönliche Datei ~/.debconfrc abgibt.

FORTGESCHRITTENES PROGRAMMIEREN MIT DEBCONF

   Handhabung von Konfigurationsdateien
       Viele  von  Ihnen  scheinen  Debconf  benutzen  zu  wollen,  um  bei  der  Verwaltung  von
       Konfigurationsdateien  zu  helfen,  die  Teil Ihres Paketes sind. Vielleicht gibt es keine
       gute Voreinstellung, die man mit einem Conffile ausliefern könnte, und deshalb wollen  Sie
       Debconf  benutzen,  um  den  Benutzer  zu  fragen  und basierend auf seinen Antworten eine
       Konfigurationsdatei schreiben. Das scheint einfach genug zu erledigen,  aber  dann  denken
       Sie   an   Upgrades,   und   was  zu  tun  ist,  wenn  jemand  die  von  Ihnen  generierte
       Konfigurationsdatei verändert, und dpkg-reconfigure, und ...

       Es gibt viele Arten dies zu machen, und die meisten von ihnen sind falsch und werden Ihnen
       oft  verärgerte Fehlerberichte einbringen. Hier gibt es einen richtigen Weg, es zu machen.
       Er nimmt  an,  dass  Ihre  Konfigurationsdatei  wirklich  nur  eine  Reihe  von  gesetzten
       Shell-Variablen  ist, mit Kommentaren dazwischen, und Sie deshalb die Datei nur einzulesen
       brauchen, um sie zu »laden«. Falls Sie ein komplizierteres Format haben, wird es ein wenig
       verzwickter, sie zu lesen (und zu schreiben).

       Ihr Skript config sollte ungefähr so aussehen:

        #!/bin/sh
        CONFIGFILE=/etc/foo.conf
        set -e
        . /usr/share/debconf/confmodule

        # Laden die Konfigurationsdatei,
        # falls sie existiert.
        if [ -e $CONFIGFILE ]; then
            . $CONFIGFILE || true

            # Speicher Werte aus der
            # Konfigurationsdatei in die
            # Debconf-Datenbank.
            db_set mypackage/foo "$FOO"
            db_set mypackage/bar "$BAR"
        fi

        # Stelle Fragen.
        db_input medium mypackage/foo || true
        db_input medium mypackage/bar || true
        db_go || true

       Und postinst sollte ungefähr so aussehen:

        #!/bin/sh
        CONFIGFILE=/etc/foo.conf
        set -e
        . /usr/share/debconf/confmodule

        # Generiere die Konfigurationsdatei,
        # falls sie nicht existiert. Eine
        # Alternative ist, von irgendwoanders eine
        # Vorlagen-Datei zu kopieren.
        if [ ! -e $CONFIGFILE ]; then
            echo "# Config file for my package" > $CONFIGFILE
            echo "FOO=" >> $CONFIGFILE
            echo "BAR=" >> $CONFIGFILE
        fi

        # Setzen Sie die Werte aus den Debconf-DB ein.
        # Hier gibt es möglicherweise offensichtliche
        # Optimierungen. Das cp vor dem sed stellt
        # sicher, dass wir nicht die Besitzer und
        # Rechte der Konfigurationsdatei
        # durcheinanderbringen.
        db_get mypackage/foo
        FOO="$RET"
        db_get mypackage/bar
        BAR="$RET"
        cp -a -f $CONFIGFILE $CONFIGFILE.tmp

        # Falls der Administrator einige Variablen gelöscht
        # oder auskommentiert, aber sie dann über Debconf
        # gesetzt hat, füge sie dem Conffile wieder hinzu.
        test -z "$FOO" || grep -Eq '^ *FOO=' $CONFIGFILE || \
            echo "FOO=" >> $CONFIGFILE
        test -z "$BAR" || grep -Eq '^ *BAR=' $CONFIGFILE || \
            echo "BAR=" >> $CONFIGFILE

        sed -e "s/^ *FOO=.*/FOO=\"$FOO\"/" \
            -e "s/^ *BAR=.*/BAR=\"$BAR\"/" \
            < $CONFIGFILE > $CONFIGFILE.tmp
        mv -f $CONFIGFILE.tmp $CONFIGFILE

       Bedenken  Sie,  wie  diese  beiden  Skripte  alle  Fälle  handhaben.  Bei  einer  frischen
       Installation stellt das  Skript  config  die  Fragen  und  postinst  generiert  eine  neue
       Konfigurationsdatei.  Bei Upgrades und erneutem Konfigurieren wird die Konfigurationsdatei
       eingelesen und die Werte darin werden benutzt, um die Werte in  der  Debconf-Datenbank  zu
       ändern,  so  dass händische Änderungen des Administrators nicht verloren gehen. Die Fragen
       werden wieder gestellt (und werden möglicherweise angezeigt oder  nicht  angezeigt).  Dann
       ersetzt postinst die Werte zurück in die Konfigurationsdatei, den Rest von ihr unverändert
       lassend.

   Den Benutzer zurück gehen lassen
       Es gibt wenige Dinge, die frustrierender bei der Benutzung eines Systems wie Debconf sind,
       als  dieses:  Ihnen  wird  eine  Frage gestellt und Sie beantworten sie, dann gehen Sie zu
       einem neuen Bildschirm mit einer neuen Frage, und Sie merken -- hoppla, dass Sie  bei  der
       letzten  Frage  einen  Fehler  gemacht  haben,  und Sie wollen zu ihr zurückgehen, und Sie
       erkennen, dass Sie dies nicht können.

       Weil Debconf von Ihrem Skript config betrieben wird, kann es nicht  von  allein  zu  einer
       vorigen  Frage  zurückspringen, aber mit ein wenig Hilfe von Ihnen kann es dieses leisten.
       Der erste Schritt ist, dass Sie Ihr Skript config Debconf wissen  lassen,  dass  es  fähig
       ist,  einen  Druck  des  Benutzers  auf  den  »Zurück«-Knopf zu handhaben. Um dies zu tun,
       benutzen Sie den Befehl CAPB, indem Sie »backup« als Parameter übergeben.

       Dann müssen Sie nach jedem Befehl »GO« testen, um zu sehen, ob  der  Benutzer  angefordert
       hat,  zurück zu gehen (Debconf gibt dann einen Code 30 zurück) und falls ja, müssen Sie zu
       der vorigen Frage zurück springen.

       Es gibt mehrere Möglichkeiten, die Kontrollstrukturen Ihres Programmes  zu  schreiben,  so
       dass   sie   bei  Bedarf  zu  vorhergehenden  Fragen  zurückspringen  können.  Sie  können
       Spaghetti-Code (voller GOTOs) schreiben. Oder Sie können mehrere Funktionen erstellen  und
       Rekursion  verwenden.  Aber  die  wahrscheinlich  sauberste  und  leichteste  Art  ist die
       Erstellung einer Zustandsmaschine. Hier ist ein Skelett einer  Zustandsmaschine,  das  Sie
       ausfüllen und erweitern können:

        #!/bin/sh
        set -e
        . /usr/share/debconf/confmodule
        db_capb backup

        ZUSTAND=1
        while true; do
            case "$ZUSTAND" in
            1)
                 # Zwei Fragen ohne Bezug zueinander.
                 db_input medium meine/frage || true
                 db_input medium meine/andere_frage || true
            ;;
            2)
                 # Stelle diese Frage nur, falls die
                 # erste Frage positiv beantwortet
                 # wurde.
                 db_get meine/frage
                 if [ "$RET" = "true" ]; then
                      db_input medium meine/abhaengige_frage || true
                 fi
            ;;
            *)
                 # Der Standard-Fall wird erreicht, wenn $ZUSTAND größer als
                 # der letzte implementierte Zustand ist und springt
                 # aus der Schleife heraus. Dies erfordert, dass die
                 # Zustände durchgehend ohne Lücken von 1 an
                 # nummeriert werden, weil der Standard-Fall auch erreicht
                 # wird, falls es eine Unterbrechung in der
                 # Nummerierung gibt.
                 break # verlässt die umschließende »while«-Schleife
            ;;
            esac

            if db_go; then
                 ZUSTAND=$(($ZUSTAND + 1))
            else
                 ZUSTAND=$(($ZUSTAND - 1))
            fi
        done

        if [ $ZUSTAND -eq 0 ]; then
            # Der Benutzer hat angefordert, von der ersten
            # Frage aus zurückzugehen. Dieser Fall ist
            # problematisch. Die reguläre Paket-Installation
            # mit dpkg und APT ist nicht fähig, zwischen
            # Fragen von zwei Paketen zurückzugehen,
            # zumindest, als dies geschrieben wurde, also
            # wird dies beenden, wobei das Paket
            # unkonfiguriert bleibt - möglicherweise
            # die beste Weise, die Situation zu behandeln.
            exit 10
        fi

       Beachten Sie: Falls das Skript config nur ein Paar Fragen ohne Bezug zueinander stellt ist
       eine Zustandsmaschine unnötig. Stellen Sie einfach alle Fragen und sagen Sie »GO«; Debconf
       wird  sein  Bestes  geben, sie alle auf einem Bildschirm anzuzeigen, und der Benutzer wird
       nicht zurück gehen müssen.

   Verhinderung von Endlosschleifen
       Ein häufiger Fehler bei Debconf tritt in Erscheinung, falls Sie  eine  Schleife  in  Ihrem
       Skript  config  haben.  Angenommen,  Sie  fordern  eine Eingabe an und prüfen sie auf ihre
       Gültigkeit, und gehen in eine Schleife, falls sie nicht gültig ist:

        ok=”
        do while [ ! "$ok" ];
            db_input low foo/bar || true
            db_go || true
            db_get foo/bar
            if [ "$RET" ]; then
                 ok=1
            fi
        done

       Auf den ersten Blick sieht dies gut aus. Aber bedenken Sie, was passiert, falls  der  Wert
       von  »foo/bar«  leer  (»«)  ist,  wenn  diese Schleife betreten wird, und der Benutzer die
       Priorität auf »hoch« (high) gesetzt  hat,  oder  er  die  nicht-interaktive  Schnittstelle
       benutzt,  und  deshalb nicht wirklich um Eingabe gebeten wird. Der Wert von »foo/bar« wird
       von »db_input« nicht verändert, also scheitert der Test und wir bleiben in  der  Schleife.
       Und bleiben in der Schleife ...

       Eine Korrektur hierfür ist, sicherzustellen, dass der Wert von »foo/bar« auf etwas gesetzt
       wird, das den Test in der Schleife passiert, bevor die Schleife betreten wird. Falls  also
       zum  Beispiel  der  Standardwert  von  »foo/bar« »1« ist, dann könnten Sie, gerade vor dem
       Betreten der Schleife, »RESET« anwenden, um den Wert von »foo/bar« zurück zu setzten.

       Eine weitere Korrektur besteht darin, den Rückgabewert  des  Befehls  »INPUT«  zu  prüfen.
       Falls  er  30  ist,  dann  wird  dem Benutzer die Frage, die Sie ihm gestellt haben, nicht
       angezeigt, und Sie sollten die Schleife verlassen.

   Zwischen verwandten Paketen auswählen
       Manchmal kann eine Reihe verwandter Pakete installiert sein und Sie  wollen  den  Benutzer
       fragen,  welches aus der Menge als Voreinstellung benutzt werden sollte. Beispiele solcher
       Mengen sind Fenster-Manager, oder Wörterbuch-Dateien für »ispell«.

       Während es möglich wäre, dass jedes Paket in der Reihe einfach fragt, »Soll  dieses  Paket
       die  Voreinstellung sein?«, führt dies zu vielen sich wiederholenden Fragen, falls mehrere
       der Pakete installiert werden. Mit Debconf ist es möglich, eine  Liste  aller  Pakete  der
       Menge anzuzeigen und dem Benutzer zu erlauben, zwischen ihnen zu wählen. Hier folgt wie.

       Lassen  Sie  alle  Pakete in der Menge eine gemeinsam benutzte Vorlage benutzen. Etwas wie
       dies:

        Template: shared/window-manager
        Type: select
        Choices: ${choices}
        Description: Select the default window manager.
         Select the window manager that will be started by
         default when X starts.

       Jedes Paket sollte eine Kopie der  Vorlage  beinhalten.  Dann  sollte  es  auch  Code  der
       folgenden Art in seinem Konfigurationsskript enthalten:

        db_metaget shared/window-manager owners
        OWNERS=$RET
        db_metaget shared/window-manager choices
        CHOICES=$RET

        if [ "$OWNERS" != "$CHOICES" ]; then
            db_subst shared/window-manager choices $OWNERS
            db_fset shared/window-manager seen false
        fi

        db_input medium shared/window-manager || true
        db_go || true

       Dies  verlangt  etwas  Erklärung.  Zu  der Zeit zu der Ihr Skript config läuft hat Debconf
       bereits alle Vorlagen für die Pakete, die installiert werden, eingelesen. Weil  die  Menge
       von  Paketen  eine  Frage  gemeinsam  benutzt,  speichert  Debconf  diese  Tatsache in dem
       Eigentümer-Feld.  Durch  eine  merkwürdige  Fügung  haben  das  Eigentümer-Feld  und   das
       Auswahlen-Feld  dasselbe  Format  (eine  durch  Komma  und Leerzeichen getrennte Liste von
       Werten).

       Der Befehl »METAGET« kann benutzt werden, um die Liste der Eigentümer und  die  Liste  der
       Auswahlen  zu erhalten. Falls Sie verschieden sind wurde ein neues Paket installiert. Also
       benutzen Sie den Befehl »SUBST«, um die Liste der Auswahlen so zu  ändern,  dass  sie  die
       selbe ist, wie die Liste der Eigentümer, und stellen die Frage.

       Wenn  ein  Paket  entfernt  wird,  wollen  Sie  möglicherweise  sehen,  ob  das  Paket die
       gegenwärtig ausgewählte Auswahl ist, und falls ja, den Benutzer bitten, ein anderes  Paket
       auszuwählen, um es zu ersetzen.

       Dies  kann  erreicht  werden,  in  dem  etwas der folgenden Art in die Prerm-Skripte aller
       betroffenen Pakete eingefügt wird (ersetzen Sie <Paket> durch den Namen des Pakets).

        if [ -e /usr/share/debconf/confmodule ]; then
            . /usr/share/debconf/confmodule
            # Ich beanspruche nicht mehr diese Frage.
            db_unregister shared/window-manager

            # Prüfe, ob die gemeinsam benutzte Frage noch existiert.
            if db_get shared/window-manager; then
                 db_metaget shared/window-manager owners
                 db_subst shared/window-manager choices $RET
                 db_metaget shared/window-manager value
                 if [ "<Paket>" = "$RET" ] ; then
                      db_fset shared/window-manager seen false
                      db_input high shared/window-manager || true
                      db_go || true
                 fi

                 # Nun tun Sie, was immer das Skript postinst tat,
                 # um den symbolischen Link des Fenster-Managers
                 # zu aktualisieren.
            fi
        fi

HACKS

       Debconf ist derzeit nicht komplett in Dpkg integriert  (ich  möchte  dies  aber  zukünftig
       ändern) und daher werden einige schmutzige Hacks benötigt.

       Der  schlimmste  von diesen beinhaltet, das Skript »config« zum Laufen zu bringen. Derzeit
       funktionniert  es  so,  dass  das  Skript  »config«  ausgeführt  wird,  wenn   das   Paket
       vorkonfiguriert  wird.  Wenn  dann das Skript »postinst« läuft, startet es Debconf erneut.
       Debconf bemerkt, dass es von dem Skript »postinst« benutzt wird, also fährt  es  fort  und
       führt  das  Skript  »config«  aus.  Dies  kann  allerdings  nur  funktionieren,  falls Ihr
       »postinst« eine der Debconf-Bibliotheken lädt, so dass postinst-Skripte immer bedacht sein
       müssen,  dies  zu  tun.  Wir  hoffen,  uns dem später zuzuwenden, indem wir Dpkg explizite
       Unterstützung für Debconf hinzufügen. Das Programm debconf(1) ist  ein  Schritt  in  diese
       Richtung.

       Ein  verwandter  Hack  ist  es,  Debconf  zum Laufen zu bringen, wenn ein Skript »config«,
       »postinst« oder ein anderes Programm, das es benutzt, startet. Schließlich  erwarten  sie,
       sofort mit Debconf reden zu können. Derzeit wird dies erreicht, dass wenn solch ein Skript
       eine Debconf-Bibliothek lädt (wie /usr/share/debconf/confmodule) und  Debconf  noch  nicht
       läuft,  es  gestartet  wird  und  eine  neue Kopie des Skripts wieder ausgeführt wird. Das
       einzige spürbare Ergebnis ist, dass Sie die Zeile, die eine Debconf-Bibliothek lädt,  ganz
       an  den  Anfang  des  Skripts  setzen  müssen  (andernfalls passieren komische Dinge). Wir
       hoffen, uns dem später zuzuwenden, indem wir ändern,  wie  Debconf  aufgerufen  wird,  und
       indem wir es in etwas einem vorübergehenden Daemon ähnlicheres verwandeln.

       Es  ähnelt ziemlich einem Hack, wie Debconf herausfindet, welche Vorlagen-Dateien es laden
       muss und wann es sie lädt. Wenn die Skripte »config«,  »preinst«  und  »postinst«  Debconf
       aufrufen,  findet  es  automatisch  heraus,  wo  die  Vorlagen-Datei  ist,  und  lädt sie.
       Alleinstehende  Programme   veranlassen   Debconf   dazu,   die   Vorlagen-Dateien   unter
       /usr/share/debconf/templates/Programmname.templates   zu  suchen.  Und  falls  ein  Skript
       »postrm« Debconf benutzen will, wenn sein Paket  vollständig  entfernt  wird,  werden  die
       Vorlagen  nicht  verfügbar  sein,  falls  Debconf  keine  Gelegenheit hatte, sie in seinem
       »postinst« zu laden. Dies ist unordentlich, aber ziemlich  unvermeidbar.  In  der  Zukunft
       dürften  allerdings  einige dieser Programme in der Lage sein, debconf-loadtemplate(1) von
       Hand zu benutzen.

       /usr/share/debconf/confmodules historisches Verhalten, mit Datei-Deskriptoren  zu  spielen
       und  einen  Datei-Deskriptor #3 einzurichten, der mit Debconf spricht, kann alle Arten von
       Problemen verursachen, wenn ein »postinst« einen Dämon ausführt, weil es dazu kommt,  dass
       der  Dämon  mit  Debconf  spricht,  und  Debconf  nicht herausfinden kann, wann das Skript
       beendet wird. Der Befehl STOP kann dies  umgehen.  Für  die  Zukunft  überlegen  wir,  die
       Debconf-Kommunikation   über   ein   Socket   oder  irgendeinen  anderen  Mechanismus  als
       Standardein-/-ausgabe geschehen lassen.

       Debconf setzt DEBCONF_RECONFIGURE=1 bevor es »postinst«-Skripte ausführt,  also  kann  ein
       Skript   »postinst«,  das  bei  erneuter  Konfiguration  irgendeine  aufwendige  Operation
       vermeiden muss, auf diese Variable schauen. Dies ist ein Hack,  weil  das  Richtige  wäre,
       »reconfigure«  als  ersten  Parameter  zu  übergeben,  aber  dies  zu  tun,  ohne alle die
       »postinst«-Skripte,  die  Debconf   benutzen,   zu   beschädigen,   ist   schwierig.   Der
       Migrations-Plan   weg   von   diesem   Hack   besteht   darin,  die  Leute  zu  ermuntern,
       »postinst«-Skripte zu schreiben, die »reconfigure« akzeptieren, und sobald dies alle  tun,
       beginnen, diesen Parameter zu übergeben.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  wurde 2008 von Florian Rehnisch <eixman@gmx.de> und 2008-2009,
       2012 von Helge Kreutzmann <debian@helgefjell.de> angefertigt. Diese Übersetzung ist  Freie
       Dokumentation;  lesen  Sie  die  GNU  General  Public License Version 2 oder neuer für die
       Kopierbedingungen. Es gibt KEINE HAFTUNG.

SIEHE AUCH

       debconf(7) ist der Benutzerleitfaden von Debconf.

       Die  Debconf-Spezifikation  in  den  Debian-Richtlinien  (»policy«)  ist  die   kanonische
       Definition                             des                             Debconf-Protokolls.
       /usr/share/doc/debian-policy/debconf_specification.txt.gz

       In  debconf.conf(5)  sind  viele  nützliche  Informationen,   darunter   auch   über   die
       Backend-Datenbank.

AUTOR

       Joey Hess <joeyh@debian.org>

                                                                                 DEBCONF-DEVEL(7)