我有一个简单的脚本,可以将补丁应用于给定的包,并且由于每次升级所述包时补丁都会被覆盖,我真的很想在每次升级后自动应用补丁。
为了实现这一点,我在中创建了一个文件/etc/apt/apt.conf.d/
并添加了一个DPkg::Post-Invoke
.正如 所记录的,这个钩子是在安装了一个包后man apt-get
运行的。然而这个钩子似乎没有任何关于apt-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";
};
需要明确的是: 这apply_somepkg_patch.sh
简单地编辑包提供的文件的内容。我希望所述文件是升级和修补每次,我不想“锁定”它,这样它就不会升级。
现在,虽然这一切都工作得很好,但它看起来真的很脏,而且对我来说有点不对劲。有没有更清洁的方法来实现这一点?也许只使用DPkg::Post-Invoke
钩子?或者,换句话说,有没有办法知道DPkg::Post-Invoke
挂钩中安装了哪个包?
编辑:添加我正在做的事情的详细示例只是为了 101% 清晰,尽管我认为它没有为我上面所说的内容添加更多信息。
假设somepkg
是我正在谈论的包,并且somefile
是我要修补的此类包安装的文件。
首次安装
somepkg
,内容somefile
:some_opt1 = some_value some_opt2 = some_value some_opt3 = a, b, c, d some_opt4 = some_value
应用补丁,将其更改为:
some_opt1 = some_value some_opt2 = some_value some_opt3 = X, Y, Z, d some_opt4 = some_value
升级后的
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
应用补丁,将其更改为:
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
现在,这是什么somepackage
,somefile
在哪里,里面有什么somefile
:这就是全部完全不相关对于我的问题。你需要知道的是我想动态修改 的内容somefile
,它是somepkg
在获得文件的升级版本后。
这显然不能静态完成:我需要一个脚本来读取somefile
、解析其内容并相应地修补它。因此,如果我希望我的脚本在每次somepkg
更新时自动运行,我需要apt-get
为我自动运行它。
答案1
没有好的方法可以使用您当前使用的样式apt
或挂钩来执行此操作。dpkg
对于您正在修改的特定软件包和文件的升级,可能有一种简单的方法来处理此类补丁,但如果您想要一个通用的解决方案,我认为 Debian 目前最好的方法是使用文件触发器。
这涉及创建一个(简单)包,它将负责在另一个包(包含您想要修补的文件的包)升级时修补文件。您的修补程序包需要声明其对文件触发器的兴趣;为此,请添加一个名为debian/triggers
) 的文件,其中包含单行
interest /path/to/the/file/to/patch
然后在包的postinst
( debian/postinst
) 中,检查第一个参数是否为triggered
,如果是,则运行修补脚本(或将其合并到您的 中postinst
)。如果您想将修补脚本分开,您可以将其放在修补包中以保持内容完整。
完成所有这些后,构建并安装您的修补程序包,然后每当您升级正在修改的程序包时,postinst
都会调用您的修补程序包。