Hi,

On Fri, Jan 05, 2024 at 08:53:30PM +0100, Chris Hofstaedtler wrote:
> I'm attaching a patch that moves /sbin/dhclient and applies the
> required workarounds for diversions ("DEP17 M18").

Attached is an improved patch, that avoids the temporary file loss
that could occur in the old version. This is mostly based on work by
Helmut Grohne.

Please consider this version of the patch.

Chris

diff -Nru isc-dhcp-4.4.3-P1/debian/changelog isc-dhcp-4.4.3-P1/debian/changelog
--- isc-dhcp-4.4.3-P1/debian/changelog  2023-10-20 14:16:37.000000000 +0200
+++ isc-dhcp-4.4.3-P1/debian/changelog  2024-01-21 17:17:47.000000000 +0100
@@ -1,3 +1,11 @@
+isc-dhcp (4.4.3-P1-4.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Move dhclient to /usr/sbin and add duplicated diversions (DEP17 P3 M18).
+    Also add Conflicts: older isc-dhcp-client-ddns. (Closes: #1060089)
+
+ -- Chris Hofstaedtler <z...@debian.org>  Sun, 21 Jan 2024 17:17:47 +0100
+
 isc-dhcp (4.4.3-P1-4) unstable; urgency=low
 
   [ Athos Ribeiro ]
diff -Nru isc-dhcp-4.4.3-P1/debian/control isc-dhcp-4.4.3-P1/debian/control
--- isc-dhcp-4.4.3-P1/debian/control    2023-09-15 18:19:55.000000000 +0200
+++ isc-dhcp-4.4.3-P1/debian/control    2024-01-21 17:17:47.000000000 +0100
@@ -107,6 +107,8 @@
  isc-dhcp-client-ddns,
 Provides:
  dhcp-client,
+Conflicts:
+ isc-dhcp-client-ddns (<< 4.4.3-P1-4.1),
 Description: DHCP client for automatically obtaining an IP address
  This is the Internet Software Consortium's DHCP client.
  .
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.install 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.install
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.install       2022-02-23 
10:28:51.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.install       2024-01-05 
18:51:22.000000000 +0100
@@ -1 +1 @@
-client/dhclient sbin
+client/dhclient usr/sbin
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postinst 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postinst
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postinst      1970-01-01 
01:00:00.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postinst      2024-01-21 
17:17:47.000000000 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+set -e
+
+# DEP17 M18: Duplicate diversion in aliased location /sbin.
+
+if [ "$1" = "configure" ]; then
+       # Remove diversion in aliased path, which is only needed for upgrades.
+       dpkg-divert --package isc-dhcp-client-ddns --remove --no-rename \
+               --divert /sbin/dhclient-noddns.usr-is-merged /sbin/dhclient
+fi
+
+#DEBHELPER#
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postrm 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postrm
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postrm        2022-02-23 
10:28:51.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.postrm        2024-01-05 
18:51:22.000000000 +0100
@@ -3,8 +3,8 @@
 set -e 
 
 if [ "$1" = "remove" -o "$1" = "abort-install" -o "$1" = "disappear" ]; then
-        dpkg-divert --package isc-dhcp-client-ddns --remove \
-               --rename --divert /sbin/dhclient-noddns /sbin/dhclient
+       dpkg-divert --package isc-dhcp-client-ddns --remove \
+               --rename --divert /usr/sbin/dhclient-noddns /usr/sbin/dhclient
 fi
 
 #DEBHELPER#
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.preinst 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.preinst
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.preinst       2022-02-23 
10:28:51.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-ddns.preinst       2024-01-21 
17:17:47.000000000 +0100
@@ -2,9 +2,47 @@
 
 set -e 
 
-if [ "$1" != "upgrade" ]; then
-       dpkg-divert --package isc-dhcp-client-ddns --add --rename \
-               --divert /sbin/dhclient-noddns /sbin/dhclient
-fi
+# DEP17 M18: Duplicate diversion in aliased location /sbin.
+
+case "$1" in
+       install)
+               # canonical path; the one we are using going forward.
+               dpkg-divert --package isc-dhcp-client-ddns --add --rename \
+                       --divert /usr/sbin/dhclient-noddns /usr/sbin/dhclient
+               # aliased path, for upgrades. postinst will --remove it.
+               dpkg-divert --package isc-dhcp-client-ddns --add --rename \
+                       --divert /sbin/dhclient-noddns.usr-is-merged 
/sbin/dhclient
+
+               ;;
+
+       upgrade)
+               TRUENAME=$(dpkg-divert --truename /usr/sbin/dhclient)
+               if test "$TRUENAME" = /usr/sbin/dhclient.usr-is-merged; then
+                       # isc-dhcp-client.preinst duplicated the diversion for 
us.
+                       # Remove duplicated diversion.
+                       dpkg-divert --package isc-dhcp-client-ddns --remove 
--no-rename \
+                               --divert /usr/sbin/dhclient.usr-is-merged 
/usr/sbin/dhclient
+                       dpkg-divert --package isc-dhcp-client-ddns --add 
--no-rename \
+                               --divert /usr/sbin/dhclient-noddns 
/usr/sbin/dhclient
+                       dpkg-divert --package isc-dhcp-client-ddns --remove 
--no-rename \
+                               /sbin/dhclient
+                       dpkg-divert --package isc-dhcp-client-ddns --add 
--no-rename \
+                               --divert /sbin/dhclient-noddns.usr-is-merged 
/sbin/dhclient
+                       mv "$TRUENAME" /usr/sbin/dhclient-noddns
+               elif test "$TRUENAME" != /usr/sbin/dhclient-noddns; then
+                       dpkg-divert --package isc-dhcp-client-ddns --add 
--no-rename \
+                               --divert /usr/sbin/dhclient-noddns 
/usr/sbin/dhclient
+                       TRUENAME=$(dpkg-divert --truename /sbin/dhclient)
+                       dpkg-divert --package isc-dhcp-client-ddns --remove 
--no-rename \
+                               /sbin/dhclient
+                       dpkg-divert --package isc-dhcp-client-ddns --add 
--no-rename \
+                               --divert /sbin/dhclient-noddns.usr-is-merged 
/sbin/dhclient
+                       if test -e "$TRUENAME"; then
+                               mv "$TRUENAME" 
"/sbin/dhclient-noddns.usr-is-merged"
+                       fi
+               fi
+
+               ;;
+esac
 
 #DEBHELPER#
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.install 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.install
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.install    2022-11-10 
16:38:39.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.install    2024-01-21 
17:17:47.000000000 +0100
@@ -1,4 +1,4 @@
-dhclient sbin
+dhclient usr/sbin
 
 debian/dhclient.conf etc/dhcp
 
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.postinst 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.postinst
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.postinst   1970-01-01 
01:00:00.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.postinst   2024-01-21 
17:17:47.000000000 +0100
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+set -e
+
+# begin-remove-after: released:forky
+if [ "$1" = configure ] &&
+       [ "$(dpkg-divert --truename /usr/sbin/dhclient)" = 
/usr/sbin/dhclient.usr-is-merged ] &&
+       [ "$(dpkg-divert --listpackage /usr/sbin/dhclient)" = 
isc-dhcp-client-ddns ]; then
+       # /usr/sbin/dhclient is still diverted in the same way as our
+       # preinst did.  Conclude that isc-dhcp-client-ddns was installed
+       # during preinst, we duplicated the diversion and now
+       # isc-dhcp-client-ddns is removed. We have to clean up.
+       echo "Removing duplicated diversion of /usr/sbin/dhclient after 
isc-dhcp-client-ddns is removed."
+       dpkg-divert --package isc-dhcp-client-ddns --remove --rename \
+               --divert /usr/sbin/dhclient.usr-is-merged /usr/sbin/dhclient
+fi
+# end-remove-after
+
+#DEBHELPER#
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.preinst 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.preinst
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.preinst    1970-01-01 
01:00:00.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client.preinst    2024-01-21 
17:17:47.000000000 +0100
@@ -0,0 +1,17 @@
+#!/bin/sh
+set -e
+
+# begin-remove-after: released:forky
+if [ "$1" = "upgrade" ] || [ "$1" = install ]; then
+       if [ "$(dpkg-divert --truename /sbin/dhclient)" = /sbin/dhclient-noddns 
] &&
+               [ "$(dpkg-divert --listpackage /sbin/dhclient)" = 
isc-dhcp-client-ddns ] &&
+               [ "$(dpkg-divert --truename /usr/sbin/dhclient)" = 
/usr/sbin/dhclient ]; then
+               # A pre-/usr-merge isc-dhcp-client-ddns is installed.
+               echo "Mitigating diversion of /sbin/dhclient on behalf of 
isc-dhcp-client-ddns"
+               dpkg-divert --package isc-dhcp-client-ddns --no-rename --add \
+                               --divert /usr/sbin/dhclient.usr-is-merged 
/usr/sbin/dhclient
+       fi
+fi
+# end-remove-after
+
+#DEBHELPER#
diff -Nru isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-udeb.install 
isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-udeb.install
--- isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-udeb.install       2022-02-23 
10:28:51.000000000 +0100
+++ isc-dhcp-4.4.3-P1/debian/isc-dhcp-client-udeb.install       2024-01-05 
18:51:22.000000000 +0100
@@ -1 +1 @@
-usr/sbin/dhclient sbin
+usr/sbin/dhclient usr/sbin
diff -Nru isc-dhcp-4.4.3-P1/debian/rules isc-dhcp-4.4.3-P1/debian/rules
--- isc-dhcp-4.4.3-P1/debian/rules      2023-09-15 18:19:55.000000000 +0200
+++ isc-dhcp-4.4.3-P1/debian/rules      2024-01-21 17:17:47.000000000 +0100
@@ -8,7 +8,7 @@
 DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
 
 LEASE_PATH=/var/lib/dhcp
-DHCLIENT_SCRIPT=/sbin/dhclient-script
+DHCLIENT_SCRIPT=/usr/sbin/dhclient-script
 
 CFLAGS+=-Wall
 CFLAGS+=-DCALL_SCRIPT_ON_ONETRY_FAIL
@@ -108,7 +108,7 @@
        # use actual paths rather than undefined variables in man pages
        sed -e 's|ETCDIR|/etc/dhcp|g' \
            -e 's/RUNDIR/\/var\/run/g' \
-           -e 's/CLIENTBINDIR/\/sbin/g' \
+           -e 's/CLIENTBINDIR/\/usr\/sbin/g' \
            -e 's/DBDIR/\/var\/lib\/dhcp/g' \
            -i debian/tmp/usr/share/man/man*/*
        dh_apparmor -pisc-dhcp-client --profile-name=sbin.dhclient

Reply via email to