次のようにDebianパッケージを作成しました。
preinst script
ユーザーにEULAを表示し、「y」または「n」を選択するように依頼します。postinst script
パッケージをインストールしてinitrdイメージを更新します。prerm script
、パッケージを削除する前に条件を確認し、条件が一致した場合はprermを終了しますexit 1
。postrm script
チェックイン prerm スクリプトが失敗して initrd イメージを更新する場合は、パッケージを削除します。
今、次の問題があります
ソフトウェアパッケージがすでにコンピュータにインストールされており、ユーザーがそれを再インストールまたはアップグレードしたいとします。ユーザーがEULAに「はい」と答えた場合、Debianはどうしますか?以前にインストールしたパッケージを削除して再インストールしたことを確認しましたが、まったく問題はありませんでした。しかし、ユーザーがEULAに対して「n」と言った場合、削除プロセスをどのように終了しますか? preinstスクリプトに追加しましたが、
exit 1
動作しません。と言うとdpkg -i package
、Debianは最初にパッケージがすでにインストールされていることを確認し、パッケージがすでにインストールされている場合は、preinstスクリプトを呼び出す前にパッケージを解凍したことを観察しました(`lsmodを使用して確認)。したがって、EULA に「n」と言うと、変更のロールバックが開始されます。つまり、postinstスクリプトを呼び出して解凍したパッケージを再インストールします。これは、ユーザーがEULAに「n」と言ったので、エンドユーザーにとっては奇妙に見えます。モジュールが今すぐ再インストールされていないかどうかを確認してみましたが、前述したように、dpkg -i package debianがモジュールを最初に削除し、検証が失敗する可能性があると言うたびに発生します。それでは、ユーザーがEULAを拒否した場合にパッケージを再インストールするのをどのように防ぐことができますか?私は言って
dpkg -r package
私のprerm script fails and exits with status 1
。上記と同じことがここでも起こります。と言うと、dpkg -r package
Debianはprermスクリプトを呼び出す前にパッケージを削除し、条件が一致することをprerm
確認してから終了し、再び奇妙な動作であるpostinstスクリプトを呼び出して変更をロールバックし始めます。
これが Debian のデフォルト動作であることがわかっています。しかし、基本的な動作を無視したい場合はどうすればよいですか?
答え1
この種の操作は(pre|post)|(inst|rm)
スクリプトで実行しないでください。(pre|post)|(inst|rm)
スクリプトは次のようにする必要があります。等級そして非対話型。
代わりにパッケージを完全にインストールするには、質問に答える必要があるdebconfテンプレートを提供する必要があります。
例については、sun-java*
パッケージを確認してください。ここでdebconfテンプレートを見ることができます:dlj.テンプレート。
これらのsun-java*
パッケージは、Javaをインストールする前に承認されなければならないライセンスを具体的に提供します。
これはその他テンプレートのサンプル問題(ライセンスが長すぎるため、ここでは再現できません):
Template: shared/accepted-sun-dlj-v1-1
Type: boolean
Default: false
_Description: Do you accept the DLJ license terms?
In order to install this package, you must accept the license terms, the
"Operating System Distributor License for Java" (DLJ), v1.1. Not accepting
will cancel the installation.
Template
debconfデータベース内のオブジェクトの名前。一意でなければなりません。Type
値のタイプです。この場合はブール値です。つまり、debconfがYes / Noの質問をすることを意味します。Default
ユーザーに表示されたときに元の選択した回答を提供します(質問が表示されるほど優先順位が高くない場合は自動的に選択されます)。_Description
~であるタイトルダイアログボックス。- 今残っているのは、ダイアログボックスに表示されるテキストだけです。一行インデントする必要があります。
- テンプレートは次の区切り文字で区切られます。空行(つまり、
\n\n
)
詳細については、Debian のドキュメントをご覧ください。debconf仕様文書化と開発者リファレンスセクション6.5。