base-files: sysupgrade: use tar helper to include installed_packages.txt
[openwrt/staging/mans0n.git] / package / base-files / files / sbin / sysupgrade
index 6b3fb0666f6bd732ce0e671f2b80fbd2972c548a..a11e17615c4e75f14ea33256fa3f9209f3c49549 100755 (executable)
@@ -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_print_member "$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"