web-dev-qa-db-ja.com

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

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

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

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

14
Jeroen

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
15
andrewsomething

Debian wiki のメンテナースクリプトの呼び出し方法については、次の図をご覧ください。 Debian maintainer script flowchart

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

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

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

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

  • 初期設定手順
  • / tmp/setupmypkgファイルを削除します
3
kyleN

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

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

1
robvdl

そうは思いませんが、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

単に、必要な変更が既に存在するかどうかを確認し、変更がない場合にのみ続行しないのはなぜですか。

0
Owais Lone