私の目標は、システムが特定の状態でない場合は、特定のパッケージのインストール/アップグレードを無効にすることです(一部のアップグレード前の作業を完了する必要があります)。
フックしようとしましたが、DPkg::Pre-Invoke
パラメータは受信されません。
DPkg::Pre-Invoke { "echo >&2 PREINVOKE [$@]"; };
ただ印刷する
PREINVOKE []
このフックで扱うパッケージのリストを取得する方法はありますか?それとも、他のフックがトリックを行うことができますか?ソリューションは理想的にはシステム全体に適用されるため、残念ながらapt-get
aliasコマンドを使用するソリューションは実現可能には見えません。
答え1
慎重に使用すると、作業を完了するのに役立つ別のフックがあります。フック名はであり、によると配列でもDPkg::Pre-Install-Pkgs
ありますPre-Invoke
。man 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
累積されます。各スクリプトは同じ入力で呼び出されます。