[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Pkg-sysvinit-devel] Bug#716948: initscripts: Removes bootlogd conf files even if bootlogd is installed



Control: reassign -1 dpkg
Control: tags -1 patch

On Mon, Jul 15, 2013 at 03:23:30PM -0700, Steve Langasek wrote:
> > I might perhaps consider looking into reviewing and applying tested
> > patches if someone wanted to provide them, but that's not a thrilling
> > prospect either.

> I will look at fixing dpkg-maintscript-helper for this issue.

Attached is a tested patch for this.  I'm not thrilled about invoking
dpkg-query -S here, but I don't see any other way to get this information.
It also still doesn't give perfect results; if a conffile moves from package
x to package y, and package x is unpacked before package y, a modified
conffile will be left behind as <conffile>.dpkg-bak and the pristine
conffile from the new package will be unpacked in its place.  But I believe
it is at least as good as the existing code in all cases.

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                    http://www.debian.org/
slangasek@ubuntu.com                                     vorlon@debian.org
From 6a7b61450c6db1a74e31fb7a52497be6fce50e2b Mon Sep 17 00:00:00 2001
From: Steve Langasek <steve.langasek@ubuntu.com>
Date: Mon, 15 Jul 2013 15:57:56 -0700
Subject: [PATCH] dpkg-maintscript-helper: when a conffile is no longer owned
 by the current (or named) package, don't move/remove it.  Closes: #716948.

---
 debian/changelog                   |  4 +++
 scripts/dpkg-maintscript-helper.sh | 66 +++++++++++++++++++++++++++++++++++---
 2 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index d3faa2c..0c3c037 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -132,6 +132,10 @@ dpkg (1.17.0) UNRELEASED; urgency=low
   * Fix typo in dpkg-source(1) man page French translation.
     Thanks to Cédric Boutillier <boutil@debian.org>. Closes: #708292
 
+  [ Steve Langasek ]
+  * dpkg-maintscript-helper: when a conffile is no longer owned by the
+    current (or named) package, don't move/remove it.  Closes: #716948.
+
  -- Guillem Jover <guillem@debian.org>  Fri, 03 Aug 2012 13:21:00 +0200
 
 dpkg (1.16.10) unstable; urgency=low
diff --git a/scripts/dpkg-maintscript-helper.sh b/scripts/dpkg-maintscript-helper.sh
index 6e2252e..c28b5be 100755
--- a/scripts/dpkg-maintscript-helper.sh
+++ b/scripts/dpkg-maintscript-helper.sh
@@ -61,7 +61,7 @@ rm_conffile() {
 	postinst)
 		if [ "$1" = "configure" ] && [ -n "$2" ] &&
 		   dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then
-			finish_rm_conffile $CONFFILE
+			finish_rm_conffile "$CONFFILE"
 		fi
 		;;
 	postrm)
@@ -72,7 +72,7 @@ rm_conffile() {
 		if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ] &&
 		   [ -n "$2" ] &&
 		   dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then
-			abort_rm_conffile "$CONFFILE"
+			abort_rm_conffile "$CONFFILE" "$PACKAGE"
 		fi
 		;;
 	*)
@@ -87,6 +87,17 @@ prepare_rm_conffile() {
 
 	[ -e "$CONFFILE" ] || return 0
 
+	owner=$(dpkg-query -S "$CONFFILE" | sed -e's/:[^:]*$//')
+	case $owner in
+		"$PACKAGE"|"$PACKAGE, *"|"* $PACKAGE, *"|"* $PACKAGE")
+			;;
+		*)
+			debug "Conffile '$CONFFILE' not owned by package " \
+			      "'$PACKAGE', skipping rm_conffile"
+			return 0
+			;;
+	esac
+
 	local md5sum="$(md5sum $CONFFILE | sed -e 's/ .*//')"
 	local old_md5sum="$(dpkg-query -W -f='${Conffiles}' $PACKAGE | \
 		sed -n -e "\' $CONFFILE ' { s/ obsolete$//; s/.* //; p }")"
@@ -114,6 +125,18 @@ finish_rm_conffile() {
 
 abort_rm_conffile() {
 	local CONFFILE="$1"
+	local PACKAGE="$2"
+
+	owner=$(dpkg-query -S "$CONFFILE" | sed -e's/:[^:]*$//')
+	case $owner in
+		"$PACKAGE"|"$PACKAGE, *"|"* $PACKAGE, *"|"* $PACKAGE")
+			;;
+		*)
+			debug "Conffile '$CONFFILE' not owned by package " \
+			      "'$PACKAGE', skipping rm_conffile"
+			return 0
+			;;
+	esac
 
 	if [ -e "$CONFFILE.dpkg-remove" ]; then
 		echo "Reinstalling $CONFFILE that was moved away"
@@ -164,14 +187,14 @@ mv_conffile() {
 	postinst)
 		if [ "$1" = "configure" ] && [ -n "$2" ] &&
 		   dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then
-			finish_mv_conffile "$OLDCONFFILE" "$NEWCONFFILE"
+			finish_mv_conffile "$OLDCONFFILE" "$NEWCONFFILE" "$PACKAGE"
 		fi
 		;;
 	postrm)
 		if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ] &&
 		   [ -n "$2" ] &&
 		   dpkg --compare-versions "$2" le-nl "$LASTVERSION"; then
-			abort_mv_conffile "$OLDCONFFILE"
+			abort_mv_conffile "$OLDCONFFILE" "$PACKAGE"
 		fi
 		;;
 	*)
@@ -186,6 +209,17 @@ prepare_mv_conffile() {
 
 	[ -e "$CONFFILE" ] || return 0
 
+	owner=$(dpkg-query -S $CONFFILE | sed -e's/:[^:]*$//')
+	case $owner in
+		"$PACKAGE"|"$PACKAGE, *"|"* $PACKAGE, *"|"* $PACKAGE")
+			;;
+		*)
+			debug "Conffile '$CONFFILE' not owned by package " \
+			      "'$PACKAGE', skipping mv_conffile"
+			return 0
+			;;
+	esac
+
 	local md5sum="$(md5sum $CONFFILE | sed -e 's/ .*//')"
 	local old_md5sum="$(dpkg-query -W -f='${Conffiles}' $PACKAGE | \
 		sed -n -e "\' $CONFFILE ' { s/ obsolete$//; s/.* //; p }")"
@@ -197,11 +231,23 @@ prepare_mv_conffile() {
 finish_mv_conffile() {
 	local OLDCONFFILE="$1"
 	local NEWCONFFILE="$2"
+	local PACKAGE="$2"
 
 	rm -f $OLDCONFFILE.dpkg-remove
 
 	[ -e "$OLDCONFFILE" ] || return 0
 
+	owner=$(dpkg-query -S $OLDCONFFILE | sed -e's/:[^:]*$//')
+	case $owner in
+		"$PACKAGE"|"$PACKAGE, *"|"* $PACKAGE, *"|"* $PACKAGE")
+			;;
+		*)
+			debug "Conffile '$CONFFILE' not owned by package " \
+			      "'$PACKAGE', skipping mv_conffile"
+			return 0
+			;;
+	esac
+
 	echo "Preserving user changes to $NEWCONFFILE (renamed from $OLDCONFFILE)..."
 	mv -f "$NEWCONFFILE" "$NEWCONFFILE.dpkg-new"
 	mv -f "$OLDCONFFILE" "$NEWCONFFILE"
@@ -209,6 +255,18 @@ finish_mv_conffile() {
 
 abort_mv_conffile() {
 	local CONFFILE="$1"
+	local PACKAGE="$2"
+
+	owner=$(dpkg-query -S $CONFFILE | sed -e's/:[^:]*$//')
+	case $owner in
+		"$PACKAGE"|"$PACKAGE, *"|"* $PACKAGE, *"|"* $PACKAGE")
+			;;
+		*)
+			debug "Conffile '$CONFFILE' not owned by package " \
+			      "'$PACKAGE', skipping mv_conffile"
+			return 0
+			;;
+	esac
 
 	if [ -e "$CONFFILE.dpkg-remove" ]; then
 		echo "Reinstalling $CONFFILE that was moved away"
-- 
1.8.3.2

Attachment: signature.asc
Description: Digital signature


Reply to: