创建一个在清除后不删除目录的 Debian 软件包

创建一个在清除后不删除目录的 Debian 软件包

我正在尝试创建一个 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/ 目录中的文件,然后构建自定义包。

自述文件,根据此示例构建自定义本地根 CA 包的步骤

因此,创建和安装此类包的快速方法是:

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不知道,它无法删除。

相关内容