apt-getフックを使用して特定のパッケージがインストールされていることを検出するためのよりきれいな方法は何ですか?

apt-getフックを使用して特定のパッケージがインストールされていることを検出するためのよりきれいな方法は何ですか?

特定のパッケージにパッチを適用する簡単なスクリプトがあります。パッケージがアップグレードされるたびにパッチが上書きされるため、各アップグレード後に自動的にパッチを適用したいと思います。

/etc/apt/apt.conf.d/これを達成するためにファイルを生成しますDPkg::Post-Invokeman apt-getしかし、このフックは何の関係もないようです。apt-getdpkg特定のパッケージすでにインストールされているので、パッチを適用する必要があるかどうかわかりません。標準入力には何も渡されず、引数として渡されることもなく、マニュアルページにはこれについては何も表示されません。

だから私はこの問題を解決するために私が考えることができる唯一のことをしました:に別のフックを追加しましたDPkg::Pre-Install-Pkgsapt-get 今後パッケージがインストールされました。このフックは (stdin を介して) インストール.debされるファイルのリストを取得するdpkgため、ファイル名のうちパッチするパッケージ名と一致するものがあることを確認し、一致した場合にインストールされるファイルのリストを取得します。/tmp別のフックが実行されたときに最初にそのファイルがあることを確認し、その場合は、インストールされたばかりのパッケージにパッチを適用します。

これは私が作成したファイルです/etc/apt/apt.conf.d/

DPkg::Pre-Install-Pkgs {
    "while read -r pkg; do case $pkg in *somepkg*) touch /tmp/.patch && exit 0; esac done < /dev/stdin";
};

DPkg::Post-Invoke {
    "[ -f /tmp/.patch ] && /home/marco/scripts/apply_somepkg_patch.sh && rm -f /tmp/.patch; exit 0";
};

明らかにすべきことapply_somepkg_patch.sh単にパッケージが提供するファイルの内容を編集します。私はそのファイルですアップグレードとパッチ毎回アップグレードされないように「ロック」したくありません。

今、これはすべてうまくいきますが、私の目には本当に汚れていて、少し奇妙に見えます。これを達成するためのよりクリーンな方法はありますか?たぶんちょうどDPkg::Post-Invokeフックを使用しますか?それとも、DPkg::Post-InvokeHookにどのパッケージがインストールされているのかを知る方法はありますか?


編集する:101%明確にするために私がやっていることの詳細な例を追加します。しかし、上記の内容にさらに情報を追加することはないと思います。

somepkg私が言うパッケージがsomefile私がパッチしたいパッケージによってインストールされたファイルであるとしましょう。

  1. 最初のインストールsomepkg、内容somefile

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = a, b, c, d
    some_opt4 = some_value
    
  2. パッチを適用し、次のように変更します。

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = X, Y, Z, d
    some_opt4 = some_value
    
  3. アップグレードされたsomepkgコンテンツsomefile

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt5 = some_value
    some_opt3 = a, b, c, d
    some_opt6 = some_value
    some_opt4 = some_value
    
  4. パッチを適用し、次のように変更します。

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt5 = some_value
    some_opt3 = X, Y, Z, d
    some_opt6 = some_value
    some_opt4 = some_value
    

さて、それが何であるかsomepackagesomefileどこにいるのか、それに何があるのかsomefile​​:それはすべてです。全く関係ない私の質問に。知っておくべきこと動的に変更したいのは、ファイルのアップグレードバージョンを取得した後somefileです。somepkg

somefileこれは明らかに静的に行うことはできません。内容を読み、解析し、それに応じてパッチを適用するにはスクリプトが必要です。したがって、somepkg更新するたびにスクリプトが自動的に実行されるようにするには、そのスクリプトをapt-get自動的に実行する必要があります。

ベストアンサー1

現在使用しているスタイルやフックを使ってaptこれを行う良い方法はありません。dpkg修正している特定のパッケージとファイルをアップグレードするためにこれらのパッチを処理する簡単な方法があるかもしれませんが、一般的な解決策が必要な場合は、現在Debianのための最良の方法は次のようにすることです。ファイルトリガー

これには、他のパッケージ(パッチするファイルを含むパッケージ)がアップグレードされたときにファイルのパッチを担当する(簡単な)パッケージを作成することが含まれます。パッチパッケージはファイルトリガーに対する関心を宣言する必要があります。これを行うには、debian/triggers単一行を含む)というファイルを追加します。

interest /path/to/the/file/to/patch

次に、パッケージのpostinstdebian/postinst)で最初の引数があることを確認しtriggered、そうであればパッチスクリプトを実行します(または自分の引数にマージpostinst)。パッチスクリプトを別々に保持するには、パッチパッケージに入れてコンテンツをそのまま残します。

これがすべて完了したら、パッチパッケージをビルドしてインストールします。これにより、変更中のパッケージをアップグレードするたびにpostinstパッチパッケージが呼び出されます。

おすすめ記事