web-dev-qa-db-ja.com

deinstが原因で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(私のパッケージが壊れていると言われているのでやらなければならない)を使用すると、常に失敗します。

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を行うときではなく、なぜその行で失敗するのですか?

私はグーグルで検索していますが、これに関する有用な情報を見つけることができません。

1
Christof

だから私はついにこれを機能させた。 debconfが既に値を持っている場合、postinstで最初の質問を取得すると、debconfは常に失敗します。私はついに、システム上の他のパッケージのpostinstおよびconfigファイルをチェックアウトする(明白な)アイデアを思いつきました。これが秘trickです:

あなたの設定で

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

それでおしまい。 postinstの値をリクエストすると、debconfは満足です。明らかに、値を取得できない場合の処理​​が必要です。

また、db_stop私のpostinstに、それが必要かどうかはわかりませんが、完了のために追加します。

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

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

乾杯

1
Christof