diff options
Diffstat (limited to '')
-rw-r--r-- | debian/usrmerge.postinst | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/debian/usrmerge.postinst b/debian/usrmerge.postinst new file mode 100644 index 0000000..4f2482d --- /dev/null +++ b/debian/usrmerge.postinst @@ -0,0 +1,92 @@ +#!/bin/sh +set -e + +is_fs() { + local fs_type + fs_type="$(stat --file-system --format=%T "$2" 2> /dev/null)" + + if [ "$fs_type" = "$1" ]; then return 0; fi + return 1 +} + +is_merged() { + local directories="/bin /sbin /lib" + for dir in $directories; do + [ -e "$dir" ] || continue + [ "$(readlink -f "$dir")" = "/usr$dir" ] || return 1 + done + + # Avoid an exact match, as the target might vary depending on the tool + # building the image. For example, systemd-nspawn links /lib64 to + # /usr/lib/aarch64-linux-gnu on arm64, while on amd64 debootstrap links it to + # /usr/lib64 and doesn't create it at all on arm64. + # See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1019575 + local arch_directories="/lib64 /lib32 /libo32 /libx32" + for dir in $arch_directories; do + [ -e "$dir" ] || continue + case "$(readlink -f "$dir")" in + "/usr/lib"*) ;; + *) return 1;; + esac + done + + return 0 +} + +maybe_convert() { + # do not try to run the program if the system has already been converted + if is_merged; then return; fi + + if is_fs nfs / || is_fs nfs /usr; then + cat << 'END' >&2 + +Warning: NFS detected, /usr/lib/usrmerge/convert-usrmerge will not be run +automatically. See #842145 for details. + +END + return 1 + fi + + /usr/lib/usrmerge/convert-usrmerge || return $? + + if which update-shells > /dev/null; then + update-shells + fi + /usr/lib/usrmerge/convert-etc-shells || return $? +} + +cleanup_biarch_dirs() { + dpkg --compare-versions "$2" lt "36~" || return 0 + + # bootstrapping or earlier conversions may have created empty biarch + # directories and links. glibc 2.35-4 or later will create them if needed, + # so clean up the unused (and unowned) ones + local arch_directories="/lib64 /lib32 /libo32 /libx32" + for dir in $arch_directories; do + [ -e "$dir" ] || continue + if ! dpkg-query -S $dir >/dev/null 2>&1; then + rm -v $dir + if [ -e /usr$dir ] && ! dpkg-query -S /usr$dir >/dev/null 2>&1 ; then + rmdir --ignore-fail-on-non-empty -v /usr$dir + fi + fi + done +} + +case "$1" in + configure) + # skipping the conversion is not supported anymore + if [ -e /etc/unsupported-skip-usrmerge-conversion ] && \ + grep -q 'this system will not be supported in the future' \ + /etc/unsupported-skip-usrmerge-conversion; then + echo "E: /etc/unsupported-skip-usrmerge-conversion exists." >&2 + exit 1 + else + maybe_convert "$@" || { echo "E: usrmerge failed." >&2; exit 1; } + cleanup_biarch_dirs + fi + ;; +esac + +#DEBHELPER# + |