パッケージの最初のインストール時およびアップグレード時にのみスクリプトを実行する方法は?


14

最近、ソフトウェアの一部をパッケージ化し、Launchpadで公開し始めました。インストールと削除は正常に機能しますが、パッケージをあるバージョンから次のバージョンにアップグレードすることには問題があります。

問題は、パッケージの最初のインストール中にのみ実行する必要があるスクリプトがあることです。これらのスクリプトは、データベースにデータを入力したり、ユーザーを作成したりします。現在、package.postinst configure)セクションで呼び出されています。ただし、これにより、図に示すように、アップグレード中にそれらが呼び出されます。

パッケージの最初のインストール中にのみ実行され、アップグレード中には実行されないメンテナースクリプトを.debパッケージに含める方法はありますか?または、いくつかの初期セットアップスクリプトを.debパッケージに含めるエレガントな方法は何でしょうか?

回答:


15

では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

28

メンテナースクリプトの呼び出し方法については、Debian wikiのこの図をご覧ください。 Debianメンテナースクリプトのフローチャート

左側(「すべてがうまくいく」パス)をたどる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

パッケージを削除した(ただしパージしなかった)場合は追加のパラメーターも渡され、再度インストールされることに注意してください。
18:27にスカイキング

3

debian / preinstスクリプトをpostinstと組み合わせて使用​​できる場合があります。

preinstスクリプトで、pkgが確実にインストールするファイルを確認します。存在する場合は(パッケージが以前にインストールされているため)何もせず、セットアップ手順を行います。

セットアップ手順でpkgのインストールが必要な場合(この場合、preinstはインストール前に実行されるため上記は機能しません)、preinstスクリプトは/ tmp / setupmypkgなどのファイルを書き込むことができます。postinstスクリプトは、そのファイルが存在するかどうかを簡単にテストでき、存在する場合は2つのことを行います。

  • 最初のセットアップ手順
  • / tmp / setupmypkgファイルを削除します

1
はい、これは機能します。現在、私は同様のことをしています。しかし、それはまだ少しハッキーに見えます...私はそれを行うためのよりネイティブな方法を望んでいました。そんなエキゾチックなリクエストとは思えませんよね?
-Jeroen

1

「postinst configure」スクリプトでの$ 2のテストは、パッケージを一度インストールしてからアンインストールし(ただしパージせずに)、再インストールを再試行すると正しく機能しないことがわかりました。この場合、postinstスクリプトは「postinst configure」ステップのバージョン引数を取得します。

ただし、以前にパッケージをインストールしたことがある場合は、削除してパージしてから再インストールすると、「postinst configure」スクリプトは$ 2のバージョン引数を取得しません。


0

そうは思いませんが、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」のようなものである可能性があります

または

なぜあなたが単にあなたがしたい変更がすでにそこにあるかどうかをチェックし、そうでない場合にのみ続行しないのはなぜですか。


分かりません。IS_INSTALLEDはどこから来たのですか?
イェルーン

IS_INSTALLEDはなく、単なる擬似コードです。ほんの一例です。IS_INSTALLEDは、 'dpkg --status package_name'のようなコマンドの出力です。つまり、パッケージがpreinstにインストールされているかどうかを確認し、状態変数を設定してから、この状態変数に基づいてpostinstでアクションを実行できます。
オワイスローン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.