debconf-devel

Autres langues

Langue: de

Autres versions - même langue

Version: 310377 (debian - 07/07/09)

Section: 7 (Divers)

NAME

debconf - Führer für Entwickler

BESCHREIBUNG

Dies ist ein Führer zum Entwickeln von Paketen, die Debconf benutzen.

Dieses Handbuch nimmt an, dass Sie als Benutzer mit Debconf vertraut sind, und dass Sie 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 voll vor-konfiguriert ist, nämlich durch sein Skript config, bevor postinst erst ausgeführt wird. 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 gegen $2 benutzen, um ein bestimmtes Verhalten nur geschehen zu lassen, wenn von einer bestimmten Version des Pakets aktualisiert wird, und solche Sachen.

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

1
Falls ein Paket mit dpkg-preconfigure vor-konfiguriert 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 vor-konfiguriert 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 zuaktualisieren, 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 Teil control.tar.gz eines .deb abgelegt. Ihr Format ist ähnlich dem einer Debian-Kontroll-Datei; eine Reihe von durch Leerzeichen getrennten Instanzen, wobei jeder dieser Absätze 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, falls
      er zu breit ist, schlecht aus. 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 Dateien auf .templates 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 jegliche 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. Er sollt nur für wichtige Anmerkungen benutzt werden, die der Benutzer wirklich sehen sollte, weil Debconf durch große Schmerzen geht, um sicherzustellen, dass der Benutzer sie sieht; die Installation anhalten, 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 Datentyp »error« der passendere.
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 Labels, die aus kosmetischen Gründen in der Anzeige mancher Frondends 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 Linie 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.

GETEILTE VORLAGEN

Es ist tatsächlich möglich, eine Vorlage und eine Frage zu haben, die unter einer Reihe von Paketen geteilt 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. Geteilte Vorlagen werden generell in Debconfs Vorlagennamensraum in dem Pseudo-Verzeichnis »shared/« eingerichtet.

DAS DEBCONF-PROTOKOLL

Die Skripte config können unter Benutzung des Debconf-Protokolles mit Debconf kommunizieren. Dies ist ein einfaches zeilen-orientiertes Protokoll, ähnlich gängigen Internetprotokollen, so 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 Ergebniskode (das erste Wort der Antwort), und einen optionalen erweiterten Ergebniskode (der Rest der Antwort). Der nummerische Kode 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 bei den Debian-Richtlinien (policy).

Der erweiterte Rückgabewert ist generell Frei-Form 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, was veranlasst, einen Wert in dem erweiterten Rückgabewert zurückzugeben.

Generell wollen Sie eine sprach-spezifische Bibliothek benutzen, die die Ecken und Kanten dessen behandelt, diese Verbindungen mit Debconf einzurichten und mit ihm zu kommunizieren.

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

VERSION nummer
Generell 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 Ergebniskode zurück. Falls die Version, die Sie angeben, zu niedrig ist, antwortet Debconf mit dem nummerischen Kode 30.
CAPB fähigkeiten
Generell brauchen Sie diesen Befehl nicht zu benutzen. Er tauscht mit Debconf eine Liste unterstützter Fähigkeiten 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.
TITLE zeichenkette
Dies setzt den Titel, den Debconf dem Benutzer anzeigt. Sie müssen diesen Befehl selten benutzen, weil Debconf automatisch einen Titel basierend auf dem Namen Ihres Paketes.
SETTITLE frage
Dies setzt den Titel auf die Kurzbeschreibung der Vorlage für die angegebene Frage. Die Vorlage sollte vom Typ title sein. Der Vorteil, den dies gegenüber dem Befehl TITLE hat, ist, dass es erlaubt, dass Titel an selben Stelle wie der Rest der Debconf-Fragen gespeichert werden, und dass es erlaubt, dass sie übersetzt werden.
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 Kode 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 Kode 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 jetzt 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 Ergebniskode 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 im Vorbeigehen 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 gelegentlich 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 flag
Fragen können Flags assoziiert werden. Die Flags können die Werte »true« oder »false« haben. Dieser Befehl gibt den Wert eines Flags zurück.
FSET frage flag wert
Dies setzt den Wert eines Flags einer Frage. Der Wert muss entweder »true« oder »false« sein.
Ein gängiges Flag ist das Flag »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 sie das Flag »seen« auf »false« haben (oder falls es ein Paket erneut konfiguriert. Manchmal wollen Sie, dass der Benutzer eine Frage erneut sieht -- in diesen Fällen können Sie das Flag »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).
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
Die 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 weil 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 man im Sinne behalten sollte, wenn man postinst-Skripte schreibt, 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 Dämon startet, stellen Sie sicher, dass Sie Debconf am Ende ein STOP geben, 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. Das Problem, auf das man hier aufpassen muss, 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 kann weggeblasen 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, das Debconf benutzt, das den Benutzer in einer Weise befragt, die konsistent mit dem Rest von Debians Installationsprozess ist, und das 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. Machen 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 in Englisch zurückgegeben.

You will find it easier to manage translations if you keep them in separate files; one file per translation. In the past, the debconf-getlang(1) and debconf-mergetemplate(1) programs were used to manage debian/template.ll files. This has been superseded by the po-debconf(7) package, which lets you deal with debconf translations in .po files, just like any other translations. Your translators will thank you for using this new improved mechanism.

For the details on po-debconf, see its man page. If you're using debhelper, converting to po-debconf is as simple as running the debconf-gettextize(1) command once, and adding a Build-Dependency on po-debconf and on 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 durch.

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 für diese Dinge 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
If this environment variable is set to 'true', the frontend will display the values in Choices-C field (if present) of select and multiselect templates rather than the descriptive values.
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 Vorlagen laden und config-Skripte ausführen können, ohne irgendeinen root-Zugriff. 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 Aktualisierungen, 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 Sie die Konfigurationsdatei,
 # falls sie existiert.
 if [ -e $CONFIGFILE ]; then
        . $CONFIGFILE || true


        # Speichern Sie Werte aus der

        # Konfigurationsdatei in die

        # Debconf-Datenbank.

        db_set mypackage/foo "$FOO"

        db_set mypackage/bar "$BAR"

 fi


 # Stellen Sie 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
 
 # Generieren Sie 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ügen Sie 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 Aktualisierungen 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 Merkmal 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
 
 STATE=1
 while true; do
        case "$STATE" in

        1)

                # Two unrelated questions.

                db_input medium my/question || true

                db_input medium my/other_question || true

        ;;

        2)

                # Only ask this question if the

                # first question was answered in

                # the affirmative.

                db_get my/question

                if [ "$RET" = "true" ]; then

                        db_input medium my/dep_question || true

                fi

        ;;

        *)

                # The default case catches when $STATE is greater than the

                # last implemented state, and breaks out of the loop. This

                # requires that states be numbered consecutively from 1

                # with no gaps, as the default case will also be entered

                # if there is a break in the numbering

                break # exits the enclosing "while" loop

        ;;

        esac

 
        if db_go; then

                ZUSTAND=$(($ZUSTAND + 1))

        else

                ZUSTAND=$(($ZUSTAND - 1))

        fi

 done


 if [ $STATE -eq 0 ]; then
        # The user has asked to back up from the first

        # question. This case is problematical. Regular

        # dpkg and apt package installation isn't capable

        # of backing up questions between packages as this

        # is written, so this will exit leaving the package

        # unconfigured - probably the best way to handle

        # the situation.

        exit 10

 fi

Beachten Sie, dass falls alles, was Ihr Skript config tut, ein Paar Fragen ohne Bezug zu stellen, ist, es keine Notwendigkeit für die Zustandsmaschine gibt. Stellen Sie sie einfach alle, 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 hat die Priorität auf »hoch« (high) gesetzt hat, oder er benutzt die nicht-interaktive Schnittstelle, und wird deshalb nicht wirklich um Eingabe gebeten. 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 bevor die Schleife betreten wird, der Wert von »foo/bar« auf etwas gesetzt wird, das den Test in der Schleife passiert. 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 Behebung ist, 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 Reihe 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 in der Reihe anzuzeigen und dem Benutzer zu erlauben, zwischen ihnen zu wählen. Hier folgt wie.

Lassen Sie alle Pakete in der Reihe 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

Die ruft nach ein wenig Erklärung. Zu der Zeit, wenn Ihr Skript config läuft, hat Debconf bereits alle Vorlagen für die Pakete, die installiert werden, eingelesen. Weil die Reihe 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, dann 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. So wie es jetzt funktioniert, ist, 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 hinzufügen. Das Programm debconf(1) ist ein Schritt in diese Richtung.

Ein verwandter Hack ist es, Debconf zum Laufen zu bringen, wen ein Skript »config«, »postinst« oder ein anderes Programm, das es benutzt, startet. Nach allem erwarten sie, sofort mit Debconf reden zu können. Die Weise, wie dies nun erreicht wird, ist, dass, wenn so ein Skript eine Debconf-Bibliothek (wie /usr/share/debconf/confmodule), und Debconf läuft noch nicht, es gestartet wird und eine neue Instanz des Skripts per exec 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. Wir hoffen, uns dem später zuzuwenden, indem wir ändern, wie Debconf aufgerufen wird, und indem wir es in etwas einem vorübergehenden Dämon ä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 schmuddelig, aber ziemlich unvermeidlich. 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 kann nicht herausfinden, 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, defekt zu machen, ist schwierig. Der Migrations-Plan weg von diesem Hack ist es, 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 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>