Provided by: debconf-doc_1.5.73_all 

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)