web-dev-qa-db-ja.com

`.deb`パッケージでのファイルとディレクトリの条件付きインストール

条件付きのファイルとディレクトリのインストールでバイナリ.debパッケージを作成することは可能ですか(たとえば、ユーザーによる確認後の/etc/init.d/でのinitスクリプトのインストール)?

3
KaBa

パッケージのインストール中に対話形式で質問するには、 debconf を使用する必要があります。構成ファイルを動的に作成および管理するには(および/etc/init.d/内のファイルは構成ファイルと見なされます) cf を使用できます。

Debconfの使用方法に関するチュートリアルは、次の場所にあります。
http://www.fifi.org/doc/debconf-doc/tutorial.html

最小限の例

debconfテンプレート

これをファイルdebian/templatesに入れます。インストール中にユーザーに表示されるテキストが含まれています。 demo-pkgを実際のパッケージ名に置き換えてください!

Template: demo-pkg/install-init.d
Type: boolean
Default: false
Description: Would you like to install a service for this package?
 Services are really cool! They allow stuff to be started in the
 background without you having to start them manually!!!

パッケージ構成スクリプト

これは、知る必要があることについてユーザーに(対話式に)尋ねる場所です。複数のパッケージをインストールする場合、dpkgが実際のインストールプロセスを開始する前に、すべてのパッケージのこれらのファイルがすべて実行されるため、このスクリプトは特別です。これは、複数のパッケージがユーザーに何かを尋ねたい場合、パッケージごとに個別にではなく、すべてのパッケージのインストールの開始時にすべての質問が尋ねられることを意味します。

debian/configという名前のファイルに次のものを入れて、実行可能としてマークします(demo-pkgを正しいパッケージ名に置き換えてください)。

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

# Should an init job be installed?
db_input high demo-pkg/install-init.d || true
db_go

# You can also act upon the user's answers using `db_get`
#db_get demo-pkg/install-init.d
#[ "${RET}" = "false"] && echo "I don't think that was a wise decision..."

メンテナスクリプト(postinstprermおよびpostrm

ここでは、実際の魔法を行い、構成ファイル/ initスクリプトを動的に追加および削除します。これを機能させるには、initスクリプトをパッケージとともに通常のファイルとしてインストールする必要があります(この例では/usr/share/demo-pkg/init-serviceと仮定しました)。

debian/postinstファイル(すべてのファイルがdpkgによって抽出された後に呼び出されます):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

if [ "$1" = "configure" ];
then
    # Check if the user decided the enable the service using `db_get`
    db_get demo-pkg/install-init.d
    if [ "${RET}" != "false" ];
    then
        # Install init script using `ucf`
        ucf /usr/share/demo-pkg/init-service /etc/init.d/demo-service

        # Register init script as service
        update-rc.d demo-service defaults

        # Start service
        invoke-rc.d demo-service start
    fi
fi

debian/prermファイル(dpkgによってファイルが削除される前、またはパッケージが新しいバージョンにアップグレードされる前に呼び出されます):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

# Check if the user decided the enable the service using `db_get`
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
    # Stop the service before upgrade or removal
    invoke-rc.d demo-service stop

    if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ];
    then
        # Unregister service prior to removal
        update-rc.d -f demo-service remove
    fi
fi

debian/postrmファイル(dpkgによってすべてのファイルが削除された後に呼び出されます):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

if [ "$1" = "purge" ];
then
    # Remove service file using `ucf` (checking whether `ucf` is still available first)
    if type ucf >/dev/null 2>&1;
    then
        ucf --purge "/etc/init.d/demo-service"
    fi

    # Remove service file by hand (in case the above failed somehow)
    rm -f "/etc/init.d/demo-service"
fi

最終ステップ

  1. ファイルPre-Depends:debconfdebian/control依存関係を追加します
  2. ファイルDepends:ucfへの通常のdebian/control依存関係を追加します
  3. ファイル/usr/share/demo-pkg/init-service(またはあなたが呼ぶもの)が適切にインストールされていることを確認してください
3
ntninja