From: Rafał Miłecki <ra...@milecki.pl>

Replace mount + overlay with manually built tar archive that gets
prepended to the actual config files backup. This allows more
flexibility with including extra backup files. They can be included at
any paths and don't require writing to flash or mounting an overlay
which has its own limitations (mount points).

Signed-off-by: Rafał Miłecki <ra...@milecki.pl>
---
 package/base-files/files/sbin/sysupgrade | 44 +++++++++---------------
 1 file changed, 16 insertions(+), 28 deletions(-)

diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index 6b3fb0666f..9d5d736aef 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -237,8 +237,6 @@ include /lib/upgrade
 create_backup_archive() {
        local conf_tar="$1"
 
-       local umount_etcbackup_dir=0
-
        [ "$(rootfs_type)" = "tmpfs" ] && {
                echo "Cannot save config while running from ramdisk." >&2
                ask_bool 0 "Abort" && exit
@@ -248,41 +246,31 @@ create_backup_archive() {
        run_hooks "$CONFFILES" $sysupgrade_init_conffiles
        ask_bool 0 "Edit config file list" && vi "$CONFFILES"
 
-       if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
-               echo "${INSTALLED_PACKAGES}" >> "$CONFFILES"
-               mkdir -p "$ETCBACKUP_DIR"
-               # Avoid touching filesystem on each backup
-               RAMFS="$(mktemp -d -t sysupgrade.XXXXXX)"
-               mkdir -p "$RAMFS/upper" "$RAMFS/work"
-               mount -t overlay overlay -o 
lowerdir=$ETCBACKUP_DIR,upperdir=$RAMFS/upper,workdir=$RAMFS/work 
$ETCBACKUP_DIR &&
-                       umount_etcbackup_dir=1 || {
-                               echo "Cannot mount '$ETCBACKUP_DIR' as tmpfs to 
avoid touching disk while saving the list of installed packages." >&2
-                               ask_bool 0 "Abort" && exit
-                       }
-
-               # Format: pkg-name<TAB>{rom,overlay,unknown}
-               # rom is used for pkgs in /rom, even if updated later
-               find /usr/lib/opkg/info -name "*.control" \( \
-                       \( -exec test -f /rom/{} \; -exec echo {} rom \; \) -o \
-                       \( -exec test -f /overlay/upper/{} \; -exec echo {} 
overlay \; \) -o \
-                       \( -exec echo {} unknown \; \) \
-                       \) | sed -e 's,.*/,,;s/\.control /\t/' > 
${INSTALLED_PACKAGES}
-       fi
-
        v "Saving config files..."
        [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
        sed -i -e 's,^/,,' "$CONFFILES"
-       tar c${TAR_V}zf "$conf_tar" -C / -T "$CONFFILES"
+       {
+               # Part of archive with installed packages info
+               if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
+                       # Format: pkg-name<TAB>{rom,overlay,unknown}
+                       # rom is used for pkgs in /rom, even if updated later
+                       tar_make_member_inline "$INSTALLED_PACKAGES" "$(find 
/usr/lib/opkg/info -name "*.control" \( \
+                               \( -exec test -f /rom/{} \; -exec echo {} rom 
\; \) -o \
+                               \( -exec test -f /overlay/upper/{} \; -exec 
echo {} overlay \; \) -o \
+                               \( -exec echo {} unknown \; \) \
+                               \) | sed -e 's,.*/,,;s/\.control /\t/')"
+               fi
+
+               # Rest of archive with config files and ending padding
+               tar c${TAR_V} -C / -T "$CONFFILES"
+       } | gzip > "$conf_tar"
+
        local err=$?
        if [ "$err" -ne 0 ]; then
                echo "Failed to create the configuration backup."
                rm -f "$conf_tar"
        fi
 
-       [ "$umount_etcbackup_dir" -eq 1 ] && {
-               umount "$ETCBACKUP_DIR"
-               rm -rf "$RAMFS"
-       }
        rm -f "$CONFFILES"
 
        return "$err"
-- 
2.35.3


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to