Package: knot
Severity: wishlist
Tags: patch

Hi,

knot fails to update or install if the items where statoverrides are processed for in knot.postinst are not files, i.e. symlinks.

at least for /etc/knot/knot.conf as well as /var/lib/knot (containing the zones by default), it's quite common to have these symlinked from other paths (e.g. /srv).

Currently, upgrading knot when using symlinks will break and take the daemon out until manually removed the symlink, dpkg --configure, and re-instating the symlink.

I suggest to only do the statoverride if the files are not symlinks, I've attached three patches (not knowing which one you prefer):

  * check-for-symlinks.patch

    - only run dpkg-statoverride if the item is not a symlink.

  * check-for-file-or-directory.patch

    - since the actual default permissions used suggest a specific type
      (knot.conf being a file, the other two a directory), you could
      also just be explicitly strict about it and check for the correct
      type (file or directory).

  * ignore-errors.patch

    - or you might want to just ignore the errors (note that you'll need
      to divert the output to /dev/null, otherwise one sees a red error
      message on any install/upgrade/reconfigure when using symlinks).

Regards,
Daniel
diff --git a/debian/knot.postinst b/debian/knot.postinst
index 9ed7222..03fc993 100644
--- a/debian/knot.postinst
+++ b/debian/knot.postinst
@@ -6,9 +6,9 @@ set -e
 #DEBHELPER#
 
 if [ "$1" = "configure" ]; then
-    dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot
-    dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf
-    dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot
+    dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot > /dev/null 2>&1 || true
+    dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf > /dev/null 2>&1 || true
+    dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot > /dev/null 2>&1 || true
 fi
 
 exit 0
diff --git a/debian/knot.postinst b/debian/knot.postinst
index 9ed7222..56a064a 100644
--- a/debian/knot.postinst
+++ b/debian/knot.postinst
@@ -6,9 +6,17 @@ set -e
 #DEBHELPER#
 
 if [ "$1" = "configure" ]; then
-    dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot
-    dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf
-    dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot
+    if [ ! -L /var/lib/knot ]; then
+        dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot
+    fi
+
+    if [ ! -L /etc/knot/knot.conf ]; then
+        dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf
+    fi
+
+    if [ ! -L /etc/knot ]; then
+        dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot
+    fi
 fi
 
 exit 0
diff --git a/debian/knot.postinst b/debian/knot.postinst
index 9ed7222..ef466ec 100644
--- a/debian/knot.postinst
+++ b/debian/knot.postinst
@@ -6,9 +6,17 @@ set -e
 #DEBHELPER#
 
 if [ "$1" = "configure" ]; then
-    dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot
-    dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf
-    dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot
+    if [ -d /var/lib/knot ]; then
+        dpkg-statoverride --list /var/lib/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0770 /var/lib/knot
+    fi
+
+    if [ -f /etc/knot/knot.conf ]; then
+        dpkg-statoverride --list /etc/knot/knot.conf >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0640 /etc/knot/knot.conf
+    fi
+
+    if [ -d /etc/knot ]; then
+        dpkg-statoverride --list /etc/knot >/dev/null 2>&1 || dpkg-statoverride --update --add root knot 0750 /etc/knot
+    fi
 fi
 
 exit 0

Reply via email to