我有一个简单的脚本,可以将补丁应用于给定的包,并且由于每次升级所述包时,补丁都会被覆盖,我真的很想在每次升级后自动应用补丁。
为此,我在其中创建了一个文件/etc/apt/apt.conf.d/
并为DPkg::Post-Invoke
. 正如 所记录的man apt-get
,这个钩子是apt-get
在安装一个带有dpkg
. 然而,这个钩子似乎没有任何关于安装了哪个特定包的信息,所以我不知道我是否必须应用补丁。没有任何东西传递给它的标准输入,没有任何东西作为参数传递,并且手册页没有说明它。
所以为了解决这个问题,我做了我唯一能想到的事情:我添加了另一个钩子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
为我自动运行它。