debconf のせいで postinst は常に失敗する

debconf のせいで postinst は常に失敗する

私のパッケージに debconf を使用する際に問題が発生しています。package.config ファイルで mysql pw を要求します。

. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw
db_go

次に、postinst で debconf にパスワードを要求し、それを設定ファイルに書き込みます。

. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
# write pw to config file

を実行すると、これは機能しますdpkg-reconfigure --force mypkg。ただし、 を使用するとapt-get -f install(pkg が壊れていると表示されるため、実行する必要があります)、常に失敗します。

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

スクリプトを編集したところ/var/lib/dpkg/info/mypkg.postinst、debconf ライブラリをソースする行でエラーが発生します。

. /usr/share/debconf/confmodule

これはおそらく、debconf に元のインストールからの値がすでに設定されており、再度質問が表示されないためです。しかし、すでに設定されている場合、どうすればこの質問をスキップできるのでしょうか。また、設定しているのに、なぜその行で失敗するのではなく、失敗するのでしょうかdb_get

Googleで検索してみましたが、これに関してあまり役に立つ情報は見つからないようです。

答え1

それで、ようやくこれが機能するようになりました。debconf にすでに値がある場合、postinst の最初の質問を取得するときに debconf は常に失敗します。最終的に、システム上の他のパッケージの postinst および config ファイルを確認するという (当然の) アイデアが浮かびました。これがそのトリックです。

あなたの設定で

. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw || true
db_go || true

以上です。postinst で値を要求すると、debconf は正常に動作します。当然、値が取得されない場合の処理​​が必要です。

また、投稿に を追加しましたdb_stop。必要かどうかはわかりませんが、完成のために追加しておきます。

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

これがいつか他の誰かの役に立つことを願っています。

乾杯

関連情報