base-files: sysupgrade: do not rely on opkg to list changed conffiles
authorMatthias Schiffer <mschiffer@universe-factory.net>
Tue, 6 Mar 2018 07:25:32 +0000 (08:25 +0100)
committerMatthias Schiffer <mschiffer@universe-factory.net>
Wed, 7 Mar 2018 09:01:14 +0000 (10:01 +0100)
Many packages use the opkg conffiles field to list configuration files that
are to be retained on upgrades. Make this work on systems without opkg.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
package/base-files/Makefile
package/base-files/files/sbin/sysupgrade

index 3fcf20a84433eb1a41e970cd010cc414bb180fad..38d72fd45248fe7981a965e603be78738127bb65 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/version.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=173.3
+PKG_RELEASE:=173.4
 PKG_FLAGS:=nonshared
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
index c095ca81c50c71021af2dc04a561ac22f6b7442b..71c7faa6dbc485ff33e776ff087e1aca58cfb0b0 100755 (executable)
@@ -101,12 +101,31 @@ EOF
 # prevent messages from clobbering the tarball when using stdout
 [ "$CONF_BACKUP" = "-" ] && export VERBOSE=0
 
+
+list_conffiles() {
+       awk '
+               BEGIN { conffiles = 0 }
+               /^Conffiles:/ { conffiles = 1; next }
+               !/^ / { conffiles = 0; next }
+               conffiles == 1 { print }
+       ' /usr/lib/opkg/status
+}
+
+list_changed_conffiles() {
+       # Cannot handle spaces in filenames - but opkg cannot either...
+       list_conffiles | while read file csum; do
+               [ -r "$file" ] || continue
+
+               echo "${csum}  ${file}" | sha256sum -sc - || echo "$file"
+       done
+}
+
 add_uci_conffiles() {
        local file="$1"
        ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
                /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
                -type f -o -type l 2>/dev/null;
-         opkg list-changed-conffiles ) | sort -u > "$file"
+         list_changed_conffiles ) | sort -u > "$file"
        return 0
 }