Ich habe einige Probleme bei der Verwendung von Debconf für mein Paket. Ich frage in der Datei package.config nach dem MySQL-Passwort:
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw
db_go
Dann frage ich in postinst Debconf nach dem Passwort und schreibe es in eine Konfigurationsdatei:
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
# write pw to config file
Das funktioniert, wenn ich das mache dpkg-reconfigure --force mypkg
. Wenn ich jedoch benutze apt-get -f install
(was ich tun muss, weil es sagt, dass mein Paket defekt ist), schlägt es immer fehl:
Setting up mypkg (1.5.4-3) ...
debconf (developer): frontend started
debconf (developer): frontend running, package name is mypkg
debconf (developer): starting /var/lib/dpkg/info/mypkg.config configure
debconf (developer): <-- INPUT low mypkg/mysql_root_pw
debconf (developer): --> 30 question skipped
dpkg: error processing mypkg (--configure):
subprocess installed post-installation script returned error exit status 30
Errors were encountered while processing:
mypkg
Ich habe die Skripte bearbeitet /var/lib/dpkg/info/mypkg.postinst
und der Fehler tritt in der Zeile auf, in der ich die Debconf-Bibliothek als Quelle verwende:
. /usr/share/debconf/confmodule
Dies liegt wahrscheinlich daran, dass Debconf bereits den Wert aus der ursprünglichen Installation hat und die Frage nicht erneut anzeigt. Aber wie kann ich die Frage überspringen, wenn ich ihn bereits habe, und warum schlägt es in dieser Zeile fehl und nicht, wenn ich ihn habe db_get
?
Ich habe bei Google gesucht, kann aber scheinbar nicht viele nützliche Informationen hierzu finden.
Antwort1
Endlich habe ich es zum Laufen gebracht. Debconf würde immer fehlschlagen, wenn die erste Frage in meinem Postinst gestellt wird, wenn Debconf den Wert bereits hat. Endlich kam ich auf die (offensichtliche) Idee, die Postinst- und Konfigurationsdateien anderer Pakete auf meinem System zu überprüfen, und das ist der Trick:
In Ihrer Konfiguration
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw || true
db_go || true
Das ist es. Wenn ich die Werte in meinem Postinst anfordere, ist Debconf zufrieden. Natürlich müssen Sie eine Vorgehensweise haben, wenn Sie keine Werte erhalten.
Außerdem habe ich db_stop
meinem Postinst ein hinzugefügt. Ich weiß nicht, ob es notwendig ist, aber ich werde es der Vollständigkeit halber hinzufügen.
mypkg.postinst
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
mysql_root_pw=$RET
db_get mypkg/some_other_value
some_other_value=$RET
db_stop
# do something with the $mysql_root_pw and $some_other_value vars
Hoffe, dass dies irgendwann jemand anderem hilft.
Prost