適切なフックは特定のパッケージの変更を確認します。

適切なフックは特定のパッケージの変更を確認します。

私の目標は、システムが特定の状態でない場合は、特定のパッケージのインストール/アップグレードを無効にすることです(一部のアップグレード前の作業を完了する必要があります)。

フックしようとしましたが、DPkg::Pre-Invokeパラメータは受信されません。

DPkg::Pre-Invoke { "echo >&2 PREINVOKE [$@]"; };

ただ印刷する

PREINVOKE []

このフックで扱うパッケージのリストを取得する方法はありますか?それとも、他のフックがトリックを行うことができますか?ソリューションは理想的にはシステム全体に適用されるため、残念ながらapt-getaliasコマンドを使用するソリューションは実現可能には見えません。

答え1

慎重に使用すると、作業を完了するのに役立つ別のフックがあります。フック名はであり、によると配列でもDPkg::Pre-Install-PkgsありますPre-Invokeman apt.conf

これは、dpkg(1)を呼び出す前に実行するシェルコマンドのリストです。オプションと同様に、リスト表記で指定する必要があります。コマンドを順次呼び出すには、/bin/sh を使用します。 APTは失敗すると中断されます。 APTは、インストールされるすべての.debファイルのファイル名を、要求されたファイル記述子の1行に1つずつコマンドに渡します。デフォルトは標準入力です。

以下のようにフックにスクリプトを割り当てます。

DPkg::Pre-Install-Pkgs { "/usr/local/libexec/somepackage-preinstall"; }

スクリプトは引数なしで呼び出され、標準入力から.debパッケージファイル名のリストを取得します。スクリプトを呼び出すだけでなく、(空白の入力で)スクリプトを呼び出すapt-get installことも重要です。apt-get removeしたがって、スクリプトは、プレインストール処理を必要とするパッケージが実際に標準入力に渡されたパッケージにあるかどうかを検出する必要があります。これは次のように行うことができます。

#!/bin/bash
grep -q '/somepackage_' || exit 0
... Do what you need here ...

grepは、標準入力の各ファイル名をパッケージを一意に識別するパターンと一致させようとし、関心のあるパッケージをアップグレードする方法で呼び出されるか呼び出されない場合、スクリプトは正常apt-get installに終了します。 .deb ファイルの名前も取得するには、apt-get upgrade次の bashism を使用できます。

#!/bin/bash
read debfile < <(grep '/somepackage_') || exit 0

これにより、$debfile複数のパッケージファイル名が入力と一致するときに驚きを避けるために、変数に正確に1つのパッケージファイル名があります。

ファイル名はファイルシステムのルートから始まることに注意してください/var/cache/apt/archives/acl_2.2.52-1_amd64.deb

DPkg::Pre-Install-Pkgs配列なので、複数のファイルで指定するすべての行はapt.conf.d累積されます。各スクリプトは同じ入力で呼び出されます。

関連情報