base-files: validate metadata of sysupgrade images
authorFelix Fietkau <nbd@nbd.name>
Mon, 14 Nov 2016 16:30:51 +0000 (17:30 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Nov 2016 10:24:09 +0000 (11:24 +0100)
Use fwtool to extract it, only require metadata to be present if the
platform sysupgrade script sets REQUIRE_IMAGE_METADATA=1

Image metadata is in JSON format and contains a list of supported
devices, along with version information that could be displayed by a UI
later before the actual upgrade happens.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/base-files/Makefile
package/base-files/files/lib/upgrade/fwtool.sh [new file with mode: 0644]
package/base-files/files/sbin/sysupgrade

index ef62db2..637d88b 100644 (file)
@@ -30,7 +30,7 @@ endif
 define Package/base-files
   SECTION:=base
   CATEGORY:=Base system
-  DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +fstools
+  DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +fstools +fwtool
   TITLE:=Base filesystem for Lede
   URL:=http://openwrt.org/
   VERSION:=$(PKG_RELEASE)-$(REVISION)
diff --git a/package/base-files/files/lib/upgrade/fwtool.sh b/package/base-files/files/lib/upgrade/fwtool.sh
new file mode 100644 (file)
index 0000000..984c173
--- /dev/null
@@ -0,0 +1,40 @@
+fwtool_pre_upgrade() {
+       fwtool -q -i /dev/null "$1"
+}
+
+fwtool_check_image() {
+       [ $# -gt 1 ] && return 1
+
+       . /usr/share/libubox/jshn.sh
+
+       if ! fwtool -q -i /tmp/sysupgrade.meta "$1"; then
+               echo "Image metadata not found"
+               [ "$REQUIRE_IMAGE_METADATA" = 1 ] && return 1
+               return 0
+       fi
+
+       json_load "$(cat /tmp/sysupgrade.meta)" || {
+               echo "Invalid image metadata"
+               return 1
+       }
+
+       device="$(cat /tmp/sysinfo/board_name)"
+
+       json_select supported_devices || return 1
+
+       json_get_keys dev_keys
+       for k in $dev_keys; do
+               json_get_var dev "$k"
+               [ "$dev" = "$device" ] && return 0
+       done
+
+       echo "Device $device not supported by this image"
+       echo -n "Supported devices:"
+       for k in $dev_keys; do
+               json_get_var dev "$k"
+               echo -n " $dev"
+       done
+       echo
+
+       return 1
+}
index 2f441f8..c095ca8 100755 (executable)
@@ -128,7 +128,8 @@ add_overlayfiles() {
 }
 
 # hooks
-sysupgrade_image_check="platform_check_image"
+sysupgrade_image_check="fwtool_check_image platform_check_image"
+sysupgrade_pre_upgrade="fwtool_pre_upgrade"
 [ $SAVE_OVERLAY = 0 -o ! -d /overlay/etc ] && \
        sysupgrade_init_conffiles="add_uci_conffiles" || \
        sysupgrade_init_conffiles="add_overlayfiles"