检测特定软件包是否安装在 apt-get 钩子中的更干净的方法?

Mar*_*lli 5 dpkg apt

我有一个简单的脚本,可以将补丁应用于给定的包,并且由于每次升级所述包时补丁都会被覆盖,我真的很想在每次升级后自动应用补丁。

为此,我创建了一个文件/etc/apt/apt.conf.d/并为DPkg::Post-Invoke. 正如所记录的那样man apt-getapt-get在使用dpkg. 然而,这个钩子似乎没有关于安装了哪个特定包的任何信息,所以我不知道是否必须应用补丁。没有任何东西传递给它的标准输入,没有任何东西作为参数传递,并且手册页没有提及它。

所以为了解决这个问题,我做了我唯一能想到的事情:我添加了另一个钩子 for DPkg::Pre-Install-Pkgs,它在安装包apt-get 之前运行。这个钩子(通过标准输入)获取.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";
};
Run Code Online (Sandbox Code Playgroud)

要清楚apply_somepkg_patch.sh简单地编辑包提供的文件的内容。我希望每次都升级和修补所述文件,我不想“锁定”它所以它不会升级。

现在,虽然这一切都很好,但它看起来很脏,对我来说有点不对。有没有更清洁的方法来实现这一点?也许只使用DPkg::Post-Invoke钩子?或者,换句话说,有没有办法知道DPkg::Post-Invoke钩子中安装了哪个包?


编辑:添加我正在做的事情的详细示例只是为了 101% 清楚,即使我认为它不会为我上面所说的添加更多信息。

假设somepkg是我正在谈论的包,并且somefile是我要修补的此类包安装的文件。

  1. 第一次安装somepkg,内容somefile

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = a, b, c, d
    some_opt4 = some_value
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用补丁,将其更改为:

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = X, Y, Z, d
    some_opt4 = some_value
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

现在,里面是什么somepackage,在哪里somefile,里面是什么somefile:这我的问题完全无关。您需要知道的是,我想在获取文件的升级版本后动态修改 的内容somefile,这是 的一部分somepkg

这显然不能静态完成:我需要一个脚本来读取somefile、解析其内容并相应地修补它。因此,如果我希望我的脚本在每次somepkg更新时自动运行,我需要apt-get为我自动运行它。

Ste*_*itt 3

\xe2\x80\x99s 没有很好的方法来使用您当前使用的 \xe2\x80\x99 样式apt或钩子来执行此操作。dpkg对于您\xe2\x80\x99 正在修改的特定软件包和文件的升级,可能有一种简单的方法来处理此类补丁,但如果您想要通用解决方案,我认为 Debian 目前最好的方法是使用文件触发器

\n\n

这涉及创建一个(简单)包,它将负责在另一个包(包含您想要修补的文件的包)升级时修补文件。您的修补程序包需要声明其对文件触发器的兴趣;为此,请添加一个名为debian/triggers) 的文件,其中包含单行

\n\n
interest /path/to/the/file/to/patch\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在 package\xe2\x80\x99s postinst( debian/postinst) 中,检查第一个参数是否为triggered,如果是,则运行修补脚本(或将其合并到您的 中postinst)。如果您想将修补脚本分开,您可以将其放在修补包中以保持内容完整。

\n\n

完成所有这一切后,构建并安装您的修补程序包,然后每当您升级您正在修改的程序包时,您的修补程序包 xe2\x80\x99spostinst将被调用。

\n