base-files: add support for compat_version on device
authorAdrian Schmutzler <freifunk@adrianschmutzler.de>
Thu, 9 Jul 2020 17:24:11 +0000 (19:24 +0200)
committerAdrian Schmutzler <freifunk@adrianschmutzler.de>
Fri, 31 Jul 2020 09:40:15 +0000 (11:40 +0200)
We regularly encounter the situation that devices are subject to
changes that will make them incompatible to previous versions.
Removing SUPPORTED_DEVICES will not really be helpful in most of these
cases, as this only helps after a rename.

To solve this situation, this patchset introduces a compatibility
version for devices. To complement the DEVICE_COMPAT_VERSION set
for the image to be flashed, this implements a compat_version on
the device, so it will have something to compare with the image.

The only viable way to achieve this seems to be via board.d files,
i.e. this is technically adding a compat version for the device's
config.

Like for the network setup, this will set up a command
ucidef_set_compat_version to set the compat_version in board.d.
This will then add a string to /etc/board.json, which will be
translated into uci system config by bin/config_generate.
By this, the compat_version, being a version of the config, will
also be exposed to the user.

As with DEVICE_COMPAT_VERSION, missing uci entry will be assumed
as compat_version "1.0", so we only need to add this if a device
needs to be bumped, e.g.

   ucidef_set_compat_version "1.1"

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
package/base-files/files/bin/config_generate
package/base-files/files/lib/functions/uci-defaults.sh

index abb1388ba15dac23800b9dbb158296a8fbabefc6..eb6816e5195ea94206ed2ed24d4c805db52b00f5 100755 (executable)
@@ -264,6 +264,13 @@ generate_static_system() {
                                uci -q set "system.@system[-1].hostname=$hostname"
                        fi
 
+                       local compat_version
+                       if json_get_var compat_version compat_version; then
+                               uci -q set "system.@system[-1].compat_version=$compat_version"
+                       else
+                               uci -q set "system.@system[-1].compat_version=1.0"
+                       fi
+
                        if json_is_a ntpserver array; then
                                local keys key
                                json_get_keys keys ntpserver
index 12b900031da865c604887ef49554776aa4814b04..27a409fe3b5ebcf14cacd63847c26f8e21f19cbd 100755 (executable)
@@ -68,6 +68,12 @@ ucidef_set_model_name() {
        json_select ..
 }
 
+ucidef_set_compat_version() {
+       json_select_object system
+       json_add_string compat_version "${1:-1.0}"
+       json_select ..
+}
+
 ucidef_set_interface_lan() {
        ucidef_set_interface "lan" ifname "$1" protocol "${2:-static}"
 }