最近、ソフトウェアの一部をパッケージ化し、Launchpadで公開し始めました。インストールと削除は正常に機能しますが、パッケージをあるバージョンから次のバージョンにアップグレードすることには問題があります。
問題は、パッケージの最初のインストール中にのみ実行する必要があるスクリプトがあることです。これらのスクリプトは、データベースにデータを入力したり、ユーザーを作成したりします。現在、これらはpackage.postinst configure)
セクションで呼び出されています。ただし、これは 図 に示すように、アップグレード中に呼び出されます。
パッケージの最初のインストール中にのみ実行され、アップグレード中には実行されないメンテナースクリプトを.debパッケージに含める方法はありますか?または、いくつかの初期セットアップスクリプトを.debパッケージに含めるエレガントな方法は何でしょうか?
debian/preinst
ファイルを使用すると、インストール時にアクションを実行できますが、アップグレードはできません。
#!/bin/sh
set -e
case "$1" in
install)
# do some magic
;;
upgrade|abort-upgrade)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
#DEBHELPER#
exit 0
名前が示すように、これはパッケージがインストールされる前に実行されます。したがって、ここで必要なことを実行できない場合があります。ほとんどのパッケージは、ユーザーが既に作成されている場合、postinst
の構成段階でテストするだけです。ここにcolord
があります
$ cat /var/lib/dpkg/info/colord.postinst
#!/bin/sh
set -e
case "$1" in
configure)
# create colord group if it isn't already there
if ! getent group colord >/dev/null; then
addgroup --quiet --system colord
fi
# create the scanner group if it isn't already there
if ! getent group scanner >/dev/null; then
addgroup --quiet --system scanner
fi
# create colord user if it isn't already there
if ! getent passwd colord >/dev/null; then
adduser --system --ingroup colord --home /var/lib/colord colord \
--gecos "colord colour management daemon"
# Add colord user to scanner group
adduser --quiet colord scanner
fi
# ensure /var/lib/colord has appropriate permissions
chown -R colord:colord /var/lib/colord
;;
esac
exit 0
Debian wiki のメンテナースクリプトの呼び出し方法については、次の図をご覧ください。
左側をたどると(「すべてがうまくいく」パス)、postinst
スクリプトが最も最近構成されたバージョンで呼び出されることがわかります。これにより、アップグレードと新規インストールを区別する機会が与えられます-アップグレードの場合、postinstは次のように呼び出されます
postinst configure 1.23-0ubuntu1
1.23-0ubuntu1
はパッケージの以前にインストールされたバージョンですが、新規インストールの場合は次のように呼び出されます
postinst configure
これにより、特定のバージョンからアップグレードするときにアクションを実行する必要がある場合にも対応できます。そのバージョンのpostinst
をチェックインできます。
これにより、スクリプトが「インストール」または「アップグレード」で実行されているかどうかを簡単に確認できます。 $ 2がnullの場合、それはインストールです。そう:
if [ -z "$2" ]; then
do install stuff
else
do upgrade stuff
fi
Debian/preinstスクリプトをpostinstと組み合わせて使用できる場合があります。
Preinstスクリプトで、pkgが確実にインストールするファイルを確認します。存在する場合は(パッケージが以前にインストールされているため)何もしないでください。そうでない場合は、セットアップ手順を行ってください。
セットアップ手順でpkgをインストールする必要がある場合(この場合、preinstはインストール前に実行されるため上記は機能しません)、preinstスクリプトはファイルを書き込むことができます(例:/ tmp/setupmypkg)。 postinstスクリプトは、そのファイルが存在するかどうかを簡単にテストし、存在する場合は2つのことを行います。
「postinst configure」スクリプトでの$ 2のテストは、パッケージを一度インストールし、それをアンインストールして(ただしパージせずに)再インストールを再試行した場合、正しく機能しないことがわかりました。この場合、postinstスクリプトは「postinst configure」ステップのバージョン引数を取得します。
ただし、以前にパッケージをインストールしたことがある場合は、削除してパージし、再インストールすると、「postinst configure」スクリプトは$ 2のバージョン引数を取得しません。
そうは思いませんが、preinst/postinstスクリプトを簡単に変更して、パッケージが初めてインストールされているかどうかを確認し、標準的なアクションを実行できます。
このようなものかもしれませんが、
事前に.
if not is_package_istalled():
export MY_PACKAGE_FIRST_INSTALL
postinstでは、
if MY_PACKAGE_FIRST_INSTALL:
Do First Install Setup
編集
うーん、postinstを実行する前にdpkgはインストール済みのパッケージのステータスを設定しないと思うので、postinstで直接これらすべてをチェックできるかもしれませんが、わかりません。だから、上記が来る可能性があり、
postinstでは、
if not is_package_istalled():
Do First Install Setup
Is_package_installedは、インストールステータスを検出するように機能できます。 「dpkg --status packagename」などのようになります
OR
単に、必要な変更が既に存在するかどうかを確認し、変更がない場合にのみ続行しないのはなぜですか。