[OpenWrt-Devel] [PATCH 1/2] build: sysupgrade-tar alt-board= for legacy upgrades

Jeff Kletsky lede at allycomm.com
Thu Oct 24 23:57:52 EDT 2019


From: Jeff Kletsky <git-commits at allycomm.com>

Targets that use nand_do_platform_check() can't use SUPPORTED_DEVICES
as the check requires ./sysupgrade-legacy_boardname/CONTROL to be
non-zero length as extracted from the tar file. Previously, only
./sysupgrade-new_boardname/CONTROL was present.

This prevents upgrade without --force from, for example, ar71xx to ath79

Add an optional alt-board= parameter to parsing of sysupgrade-tar that
creates a directory at the expected location for the alt-board name,
copying over the CONTROL file.

The contents of CONTROL are unmodified by this commit.

Careful ordering of the tar file is required as existing builds
expect the kernel and root assets to be in the first directory
returned by tar -tf that matches sysupgrade-*/

Run-tested-on: EA8300, GL-AR300M, GL-AR750S

Signed-off-by: Jeff Kletsky <git-commits at allycomm.com>
---
 include/image-commands.mk |  1 +
 scripts/sysupgrade-tar.sh | 40 +++++++++++++++++++++++++++++++++------
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/include/image-commands.mk b/include/image-commands.mk
index 5dfd6a2c2f..011e30a7e3 100644
--- a/include/image-commands.mk
+++ b/include/image-commands.mk
@@ -321,6 +321,7 @@ endef
 define Build/sysupgrade-tar
 	sh $(TOPDIR)/scripts/sysupgrade-tar.sh \
 		--board $(if $(BOARD_NAME),$(BOARD_NAME),$(DEVICE_NAME)) \
+		--alt-boards "$(call param_get,alt-board,$(1))" \
 		--kernel $(call param_get_default,kernel,$(1),$(IMAGE_KERNEL)) \
 		--rootfs $(call param_get_default,rootfs,$(1),$(IMAGE_ROOTFS)) \
 		$@
diff --git a/scripts/sysupgrade-tar.sh b/scripts/sysupgrade-tar.sh
index b93b2584bb..5071a2f5f8 100755
--- a/scripts/sysupgrade-tar.sh
+++ b/scripts/sysupgrade-tar.sh
@@ -3,11 +3,17 @@
 . $TOPDIR/scripts/functions.sh
 
 board=""
+alt_boards=""
 kernel=""
 rootfs=""
 outfile=""
 err=""
 
+do_exit() {
+	[ -d "$tmpdir" ] && rm -rf "$tmpdir"
+	exit $err
+}
+
 while [ "$1" ]; do
 	case "$1" in
 	"--board")
@@ -16,6 +22,12 @@ while [ "$1" ]; do
 		shift
 		continue
 		;;
+	"--alt-boards")
+		alt_boards="$2"
+		shift
+		shift
+		continue
+		;;
 	"--kernel")
 		kernel="$2"
 		shift
@@ -39,7 +51,7 @@ while [ "$1" ]; do
 done
 
 if [ ! -n "$board" -o ! -r "$kernel" -a  ! -r "$rootfs" -o ! "$outfile" ]; then
-	echo "syntax: $0 [--board boardname] [--kernel kernelimage] [--rootfs rootfs] out"
+	echo "syntax: $0 [--board boardname] [--alt-boards 'alt board list'] [--kernel kernelimage] [--rootfs rootfs] out"
 	exit 1
 fi
 
@@ -54,6 +66,7 @@ if [ -z "$tmpdir" ]; then
 fi
 
 mkdir -p "${tmpdir}/sysupgrade-${board}"
+
 echo "BOARD=${board}" > "${tmpdir}/sysupgrade-${board}/CONTROL"
 if [ -n "${rootfs}" ]; then
 	case "$( get_fs_type ${rootfs} )" in
@@ -67,18 +80,33 @@ if [ -n "${rootfs}" ]; then
 fi
 [ -z "${kernel}" ] || cp "${kernel}" "${tmpdir}/sysupgrade-${board}/kernel"
 
-mtime=""
+# "Legacy" nand_upgrade_tar() finds asset directory with
+# $(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
+# and doesn't use CONTROL at all; add the "real" files first
+
+tar_args="--directory ${tmpdir} --sort=name --owner=0 --group=0 --numeric-owner \
+	 -vf ${tmpdir}/sysupgrade.tar"
 if [ -n "$SOURCE_DATE_EPOCH" ]; then
-	mtime="--mtime=@${SOURCE_DATE_EPOCH}"
+	tar_args="${tar_args} --mtime=@${SOURCE_DATE_EPOCH}"
 fi
 
-(cd "$tmpdir"; tar --sort=name --owner=0 --group=0 --numeric-owner -cvf sysupgrade.tar sysupgrade-${board} ${mtime})
+tar -c $tar_args $(ls -A "${tmpdir}")
 err="$?"
+[ "$err" != 0 ] && do_exit
+
+for ab in $alt_boards ; do
+	[ "$ab" = "$board" ] && continue
+	mkdir "${tmpdir}/sysupgrade-${ab}/"
+	cp -vp "${tmpdir}/sysupgrade-${board}/CONTROL" "${tmpdir}/sysupgrade-${ab}/"
+	tar -r $tar_args "sysupgrade-${ab}/CONTROL"
+	err="$?"
+	[ "$err" != 0 ] && do_exit
+done
+
 if [ -e "$tmpdir/sysupgrade.tar" ]; then
 	cp "$tmpdir/sysupgrade.tar" "$outfile"
 else
 	err=2
 fi
-rm -rf "$tmpdir"
 
-exit $err
+do_exit
-- 
2.20.1


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



More information about the openwrt-devel mailing list