summaryrefslogtreecommitdiffstats
path: root/debian/dpkg.postinst
diff options
context:
space:
mode:
Diffstat (limited to 'debian/dpkg.postinst')
-rw-r--r--debian/dpkg.postinst113
1 files changed, 113 insertions, 0 deletions
diff --git a/debian/dpkg.postinst b/debian/dpkg.postinst
new file mode 100644
index 0000000..ac2ad07
--- /dev/null
+++ b/debian/dpkg.postinst
@@ -0,0 +1,113 @@
+#!/bin/sh
+# See deb-postinst(5).
+
+set -e
+
+PROGNAME=dpkg
+
+. /usr/share/dpkg/sh/dpkg-error.sh
+
+setup_colors
+
+get_vendor()
+{
+ local origin="$DPKG_ROOT/etc/dpkg/origins/default"
+ local vendor
+
+ if [ -e "$origin" ]; then
+ vendor=$(sed -ne 's/^Vendor: *\([^ ]\+\) */\1/p' "$origin" | tr A-Z a-z)
+ fi
+
+ echo "${vendor:-default}"
+}
+
+check_merged_usr_via_aliased_dirs()
+{
+ local vendor
+
+ vendor=$(get_vendor)
+
+ case "$vendor" in
+ debian)
+ # In Debian some people have gotten so offended by the following _warning_
+ # that they have resorted to bullying and abuse. Life's too short, sorry.
+ return
+ ;;
+ ubuntu)
+ # Ubuntu does not seem interested in it.
+ return
+ ;;
+ esac
+
+ for d in /bin /sbin /lib /lib32 /libo32 /libx32 /lib64; do
+ linkname="$(readlink $DPKG_ROOT$d || true)"
+ if [ "$linkname" = "usr$d" ] || [ "$linkname" = "/usr$d" ]; then
+ warning "This system uses merged-usr-via-aliased-dirs, going behind dpkg's"
+ warning "back, breaking its core assumptions. This can cause silent file"
+ warning "overwrites and disappearances, and its general tools misbehavior."
+ warning "See <https://wiki.debian.org/Teams/Dpkg/FAQ#broken-usrmerge>."
+ break
+ fi
+ done
+}
+
+# Version 1.21.0 had bogus handling of DPKG_ADMINDIR in update-alternatives,
+# and misplaced them, fix them up.
+fixup_misplaced_alternatives()
+(
+ admindir=${DPKG_ADMINDIR:-/var/lib/dpkg}
+
+ cd "$admindir"
+
+ for file in *; do
+ if ! [ -f "$file" ]; then
+ # Ignore anything that is not a file.
+ continue
+ fi
+
+ # Check whether this is a known file we do not want to act on.
+ case "$file" in
+ arch|\
+ available|available-old|\
+ cmethopt|methlock|\
+ diversions|diversions-old|\
+ lock|lock-frontend|\
+ statoverride|statoverride-old|\
+ status|status-old)
+ # Ignore known files just to make sure.
+ continue
+ ;;
+ *)
+ esac
+
+ # Check whether the file looks like an alternative state file.
+ mode="$(head -1 "$file")"
+ case "$mode" in
+ auto|manual)
+ # Looks like a state file, we will handle this one.
+ echo "Moving misplaced alternative state file $admindir/$file..."
+ mv "$file" "alternatives/$file"
+ ;;
+ *)
+ warning "unknown dpkg database file $admindir/$file is not a misplaced alternative state... leaving as is"
+ continue
+ ;;
+ esac
+ done
+)
+
+case "$1" in
+configure)
+ fixup_misplaced_alternatives
+
+ check_merged_usr_via_aliased_dirs
+ ;;
+abort-upgrade|abort-deconfigure|abort-remove)
+ ;;
+*)
+ error "called with unknown argument '$1'"
+ ;;
+esac
+
+#DEBHELPER#
+exit 0