Scroll to navigation

DEBCONF-DEVEL(7) Miscellaneous Information Manual DEBCONF-DEVEL(7)

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:

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.
Der Typ der Vorlage bestimmt, welche Art von Oberflächen-Element dem Benutzer angezeigt wird. Die gegenwärtig unterstützten Typen sind:
Resultiert in einem Eingabefeld freier Form, in das der Benutzer jegliche Zeichenkette eingeben kann.
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.
Eine Auswahl »wahr/falsch« (true/false).
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
Wie der Datentyp select, außer dass der Benutzer eine beliebige Anzahl von Elementen aus der Auswahlliste auswählen kann (oder gar keins).
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«.
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.
Dieser Datentyp wird für Titel benutzt, die mit dem Befehl SETTITLE gesetzt werden.
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.
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.

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.

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.
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.

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.

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.
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:

Sehr triviale Elemente, die Vorgaben haben, die in der großen Mehrheit der Fälle funktionieren; nur Kontroll-Freaks sehen diese.
Normale Elemente, die vernünftige Vorgaben haben.
Elemente, die keine vernünftigen Vorgaben haben.
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.

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.

Löscht die angesammelte Reihe von Fragen (aus den INPUT-Befehlen) ohne sie anzuzeigen.
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.
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.
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.
Dies setzt den Wert einer Frage, und es kann benutzt werden, um die Vorgabe zu überstimmen, mit etwas, das Ihr Programm direkt berechnet.
Dies setzt die Frage wieder auf ihren Vorgabe-Wert (wie er in dem Feld »Default« ihrer Vorlage angegeben ist).
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.
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.
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.

Dies gibt den Wert eines jeglichen Felds der einer Frage zugeordneten Vorlage (zum Beispiel die Beschreibung) zurück.
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.
Dies entfernt eine Frage aus der Datenbank.
Rufen Sie dies in Ihrem postrm auf, wenn Ihr Paket vollständig entfernt wird. Es entfernt alle Fragen Ihres Paketes aus Debconfs Datenbank.
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.

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.

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.
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.
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>