[openwrt/openwrt] build: create JSON files containing image info

LEDE Commits lede-commits at lists.infradead.org
Tue Jun 30 16:14:40 EDT 2020


adrian pushed a commit to openwrt/openwrt.git, branch openwrt-19.07:
https://git.openwrt.org/8a0362c6992d2a432ecb79905531a6c7324fa6a8

commit 8a0362c6992d2a432ecb79905531a6c7324fa6a8
Author: Paul Spooren <mail at aparcar.org>
AuthorDate: Sun Aug 18 09:56:45 2019 -1000

    build: create JSON files containing image info
    
    The JSON info files contain details about the created firmware images
    per device and are stored next to the created images.
    
    The JSON files are stored as "$(IMAGE_PREFIX).json" and contain some
    device/image meta data as well as a list of created firmware images.
    
    An example of openwrt-ramips-rt305x-aztech_hw550-3g.json
    
        {
          "id": "aztech_hw550-3g",
          "image_prefix": "openwrt-ramips-rt305x-aztech_hw550-3g",
          "images": [
            {
              "name": "openwrt-ramips-rt305x-aztech_hw550-3g-squashfs-sysupgrade.bin",
              "sha256": "db2b34b0ec4a83d9bf612cf66fab0dc3722b191cb9bedf111e5627a4298baf20",
              "type": "sysupgrade"
            }
          ],
          "metadata_version": 1,
          "supported_devices": [
            "aztech,hw550-3g",
            "hw550-3g"
          ],
          "target": "ramips/rt305x",
          "titles": [
            {
              "model": "HW550-3G",
              "vendor": "Aztech"
            },
            {
              "model": "ALL0239-3G",
              "vendor": "Allnet"
            }
          ],
          "version_commit": "r10920+123-0cc87b3bac",
          "version_number": "SNAPSHOT"
        }
    
    Signed-off-by: Paul Spooren <mail at aparcar.org>
    (backported from commit 881ed09ee6e23f6c224184bb7493253c4624fb9f)
    Signed-off-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
---
 config/Config-build.in         |  7 +++++++
 include/image.mk               | 17 ++++++++++++++++-
 scripts/json_add_image_info.py | 42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/config/Config-build.in b/config/Config-build.in
index 35341833e3..9669fc86c7 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -7,6 +7,13 @@
 
 menu "Global build settings"
 
+	config JSON_ADD_IMAGE_INFO
+		bool "Create JSON info files per build image"
+		default BUILDBOT
+		help
+		  The JSON info files contain information about the device and
+		  build images, stored next to the firmware images.
+
 	config ALL_NONSHARED
 		bool "Select all target specific packages by default"
 		select ALL_KMODS
diff --git a/include/image.mk b/include/image.mk
index 1538d83df3..2eedb43753 100644
--- a/include/image.mk
+++ b/include/image.mk
@@ -524,7 +524,20 @@ define Device/Build/image
 
   $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2)): $(KDIR)/tmp/$(call IMAGE_NAME,$(1),$(2))
 	cp $$^ $$@
-
+	$(if $(CONFIG_JSON_ADD_IMAGE_INFO), \
+		DEVICE_ID="$(DEVICE_NAME)" \
+		BIN_DIR="$(BIN_DIR)" \
+		IMAGE_NAME="$(IMAGE_NAME)" \
+		IMAGE_TYPE=$(word 1,$(subst ., ,$(2))) \
+		IMAGE_PREFIX="$(IMAGE_PREFIX)" \
+		DEVICE_TITLE="$(DEVICE_TITLE)" \
+		TARGET="$(BOARD)" \
+		SUBTARGET="$(SUBTARGET)" \
+		VERSION_NUMBER="$(VERSION_NUMBER)" \
+		VERSION_CODE="$(VERSION_CODE)" \
+		SUPPORTED_DEVICES="$(SUPPORTED_DEVICES)" \
+		$(TOPDIR)/scripts/json_add_image_info.py \
+	)
 endef
 
 define Device/Build/artifact
@@ -542,6 +555,8 @@ define Device/Build/artifact
 endef
 
 define Device/Build
+  $(shell rm -f $(BIN_DIR)/$(IMG_PREFIX)-$(1).json)
+
   $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Device/Build/initramfs,$(1)))
   $(call Device/Build/kernel,$(1))
 
diff --git a/scripts/json_add_image_info.py b/scripts/json_add_image_info.py
new file mode 100755
index 0000000000..4a90eb95cf
--- /dev/null
+++ b/scripts/json_add_image_info.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+
+import json
+import os
+import hashlib
+
+
+def e(variable, default=None):
+    return os.environ.get(variable, default)
+
+
+json_path = "{}{}{}.json".format(e("BIN_DIR"), os.sep, e("IMAGE_PREFIX"))
+
+with open(os.path.join(e("BIN_DIR"), e("IMAGE_NAME")), "rb") as image_file:
+    image_hash = hashlib.sha256(image_file.read()).hexdigest()
+
+
+def get_titles():
+    return [{"title": e("DEVICE_TITLE")}]
+
+
+if not os.path.exists(json_path):
+    device_info = {
+        "id": e("DEVICE_ID"),
+        "image_prefix": e("IMAGE_PREFIX"),
+        "images": [],
+        "metadata_version": 1,
+        "supported_devices": e("SUPPORTED_DEVICES").split(),
+        "target": "{}/{}".format(e("TARGET"), e("SUBTARGET", "generic")),
+        "titles": get_titles(),
+        "version_commit": e("VERSION_CODE"),
+        "version_number": e("VERSION_NUMBER"),
+    }
+else:
+    with open(json_path, "r") as json_file:
+        device_info = json.load(json_file)
+
+image_info = {"type": e("IMAGE_TYPE"), "name": e("IMAGE_NAME"), "sha256": image_hash}
+device_info["images"].append(image_info)
+
+with open(json_path, "w") as json_file:
+    json.dump(device_info, json_file, sort_keys=True, indent="  ")



More information about the lede-commits mailing list