我正在尝试创建一个 Debian 软件包,该软件包在清除后不会删除空目录。具体来说,我正在创建自己的包,其中包含一些我信任的 CA 证书。
我正在按照 Debian 建议的方法将证书安装到/usr/local/share/ca-certificates
.我遇到的问题是该ca-certificates
包在安装时创建/usr/local/share/ca-certificates
,并且我希望在清除我的包时保留该目录。
我的目标是安装我的信任链,/usr/local/share/ca-certificates/mychain
但是当我的 Debian 软件包被删除时,我希望 dpkg 能够不是/usr/local/share/ca-certificates
如果该目录为空,则将其删除,因为ca-certificates
包明确创建了该目录。
我四处寻找明确的答案,但我找到的只是长长的论坛帖子和电子邮件线程。
答案1
添加postrm
脚本:
#!/bin/sh
set -e
case "$1" in
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
# Recreate the /usr/local/share/ca-certificates directory, since we are
# ignoring Debian Policy by intentionally installing here. Removal of
# ca-certificates-local removes this directory if empty.
if [ ! -e /usr/local/share/ca-certificates ]; then
if mkdir /usr/local/share/ca-certificates 2>/dev/null; then
chown root:staff /usr/local/share/ca-certificates
chmod 2775 /usr/local/share/ca-certificates
fi
fi
;;
*)
echo "postrm called with unknown argument \`$1'" >&2
exit 1
;;
esac
#DEBHELPER#
exit 0
这段代码来自ca-证书-本地:
这是一个示例存根源包,其中包含 local/ 目录中的虚拟 CA 证书。删除虚拟证书,将受信任的本地根 CA(采用 PEM 格式,文件名以“.crt”结尾)复制到 local/ 目录,根据需要编辑 debian/ 目录中的文件,然后构建自定义包。
因此,创建和安装此类包的快速方法是:
git clone git://anonscm.debian.org/collab-maint/ca-certificates.git ~/ca-certificates
cd ~/ca-certificates/examples/ca-certificates-local/
rm local/Local_Root_CA.crt
cp <path-to-your-cert> local/
# edit debian/control: change package-name, description, etc
# install build dependencies: http://unix.stackexchange.com/questions/177505/how-to-install-parse-build-dependencies-from-debian-control/211319#211319
dpkg-buildpackage
dpkg -i ../<package-name-version>.deb
答案2
安装到不同的本地路径并编写postinst
脚本来创建目录/usr/local
并将文件复制到那里。
正如您可以想象的,这可能违反了 Debian 政策的文字和精神。但这是您的网络、您的规则、您的用户(以及他们易于发现的解决方法)。
为了更好的可用性,您可以将这些文件标记为配置文件,这样,如果您清除软件包,它们至少会被删除,但如果您只是卸载它,它们会保留下来。
最重要的是,文件dpkg
不知道,它无法删除。