apk: provide csum for static conffiles
authorChristian Marangi <ansuelsmth@gmail.com>
Sat, 25 May 2024 14:00:27 +0000 (16:00 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 11 Jun 2024 21:58:17 +0000 (23:58 +0200)
For non-overlay configuration we need checksum for config file that
weren't modified by the user. For OPKG in sysupgrade we check the status
file for the Conffiles: entry of every package. this entry contains
checksum for every static file that the package contains.

Provide the same info for APK by creating a conffiles_static file and
parse this file on sysupgrade for non-overlay configurations.

This is also used by the sysupgrade -u option to exclude non-changed
files from the final backup.

Link: https://github.com/openwrt/openwrt/pull/15543
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
include/package-pack.mk
package/base-files/files/sbin/sysupgrade

index 75acdd185c53a329b329d9575632e18d45031057..26a32788343c42b90bceaab74cdd4d9ca576a461 100644 (file)
@@ -307,12 +307,25 @@ else
        if [ -n "$(USERID)" ]; then echo $(USERID) > $$(IDIR_$(1))/lib/apk/packages/$(1).rusers; fi;
        if [ -n "$(ALTERNATIVES)" ]; then echo $(ALTERNATIVES) > $$(IDIR_$(1))/lib/apk/packages/$(1).alternatives; fi;
        (cd $$(IDIR_$(1)) && find . -type f,l -printf "/%P\n" > $$(IDIR_$(1))/lib/apk/packages/$(1).list)
-       if [ -f $$(ADIR_$(1))/conffiles ]; then mv $$(ADIR_$(1))/conffiles $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles; fi;
+       # Move conffiles to IDIR and build conffiles_static with csums
+       if [ -f $$(ADIR_$(1))/conffiles ]; then \
+               mv -f $$(ADIR_$(1))/conffiles $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles; \
+               for file in $$$$(cat $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles); do \
+                       [ -f $$(IDIR_$(1))/$$$$file ] || continue; \
+                       csum=$$$$($(MKHASH) sha256 $$(IDIR_$(1))/$$$$file); \
+                       echo $$$$file $$$$csum >> $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles_static; \
+               done; \
+       fi
 
        # Some package (base-files) manually append stuff to conffiles
        # Append stuff from it and delete the CONTROL directory since everything else should be migrated
        if [ -f $$(IDIR_$(1))/CONTROL/conffiles ]; then \
-               cat $$(IDIR_$(1))/CONTROL/conffiles >> $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles; \
+               echo $$$$(IDIR_$(1))/CONTROL/conffiles >> $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles; \
+               for file in $$$$(cat $$(IDIR_$(1))/CONTROL/conffiles); do \
+                       [ -f $$(IDIR_$(1))/$$$$file ] || continue; \
+                       csum=$$$$($(MKHASH) sha256 $$(IDIR_$(1))/$$$$file); \
+                       echo $$$$file $$$$csum >> $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles_static; \
+               done; \
                rm -rf $$(IDIR_$(1))/CONTROL/conffiles; \
        fi
 
index 9b422107d8c7ab22f1ba099d8e97bf5fd3507983..611d8830bfd1ffea4ee84d931cda1f3984885b96 100755 (executable)
@@ -130,12 +130,20 @@ fi
 
 
 list_conffiles() {
-       awk '
-               BEGIN { conffiles = 0 }
-               /^Conffiles:/ { conffiles = 1; next }
-               !/^ / { conffiles = 0; next }
-               conffiles == 1 { print }
-       ' /usr/lib/opkg/status
+       if [ -f /usr/lib/opkg/status ]; then
+               awk '
+                       BEGIN { conffiles = 0 }
+                       /^Conffiles:/ { conffiles = 1; next }
+                       !/^ / { conffiles = 0; next }
+                       conffiles == 1 { print }
+               ' /usr/lib/opkg/status
+       elif [ -d /lib/apk/packages ]; then
+               conffiles=""
+               for file in /lib/apk/packages/*.conffiles_static; do
+                       conffiles="$(echo -e "$(cat $file)\n$conffiles")"
+               done
+               echo "$conffiles"
+       fi
 }
 
 list_changed_conffiles() {