summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.adoc4
-rw-r--r--classes/image_types_ostree.bbclass12
-rw-r--r--classes/image_types_ota.bbclass2
-rw-r--r--classes/sota_am335x-evm-wifi.bbclass1
-rw-r--r--classes/sota_m3ulcb.bbclass3
-rw-r--r--classes/sota_minnowboard.bbclass4
-rw-r--r--classes/sota_porter.bbclass2
-rw-r--r--classes/sota_qemux86-64.bbclass2
-rw-r--r--classes/sota_raspberrypi.bbclass4
-rw-r--r--conf/distro/poky-sota-systemd.conf3
-rw-r--r--conf/distro/poky-sota.conf2
-rw-r--r--conf/include/bblayers/sota.inc1
-rw-r--r--conf/include/bblayers/sota_am335x-evm.inc3
-rw-r--r--conf/include/bblayers/sota_intel-corei7-64.inc4
-rw-r--r--conf/include/bblayers/sota_m3ulcb.inc5
-rw-r--r--conf/include/bblayers/sota_porter.inc6
-rw-r--r--conf/include/bblayers/sota_qemux86-64.inc2
-rw-r--r--conf/include/bblayers/sota_raspberrypi2.inc5
-rw-r--r--conf/include/bblayers/sota_raspberrypi3.inc5
-rw-r--r--lib/oeqa/selftest/cases/updater.py37
-rw-r--r--recipes-connectivity/connman/connman_%.bbappend1
-rw-r--r--recipes-connectivity/networkd-dhcp-conf/files/20-wired-dhcp.network5
-rw-r--r--recipes-connectivity/networkd-dhcp-conf/networkd-dhcp-conf.bb28
-rw-r--r--recipes-sota/aktualizr/aktualizr-auto-prov-creds.bb7
-rw-r--r--recipes-sota/aktualizr/aktualizr-ca-implicit-prov-creds.bb4
-rw-r--r--recipes-sota/aktualizr/aktualizr-ca-implicit-prov.bb3
-rwxr-xr-xrecipes-sota/aktualizr/aktualizr_git.bb19
-rw-r--r--recipes-sota/aktualizr/garage-sign-version.inc36
-rw-r--r--recipes-sota/config/aktualizr-auto-reboot.bb21
-rw-r--r--recipes-sota/config/files/35-enable-auto-reboot.toml2
-rw-r--r--recipes-sota/fit-conf/fit-conf.bb2
-rw-r--r--recipes-test/images/secondary-image.bb3
32 files changed, 126 insertions, 112 deletions
diff --git a/README.adoc b/README.adoc
index 27ecabf..b23f04b 100644
--- a/README.adoc
+++ b/README.adoc
@@ -74,6 +74,8 @@ You may take a look into https://github.com/advancedtelematic/meta-updater-minno
74 74
75Although we have used U-Boot so far, other boot loaders can be configured work with OSTree as well. 75Although we have used U-Boot so far, other boot loaders can be configured work with OSTree as well.
76 76
77Your images will also need network connectivity to be able to reach an actual OTA backend. Our 'poky-sota' distribution does not mandate or install a default network manager but our supported platforms use the `virtual/network-configuration` recipe, which can be used as a starting example.
78
77== SOTA-related variables in local.conf 79== SOTA-related variables in local.conf
78 80
79* `OSTREE_REPO` - path to your OSTree repository. Defaults to `$\{DEPLOY_DIR_IMAGE}/ostree_repo` 81* `OSTREE_REPO` - path to your OSTree repository. Defaults to `$\{DEPLOY_DIR_IMAGE}/ostree_repo`
@@ -82,6 +84,7 @@ Although we have used U-Boot so far, other boot loaders can be configured work w
82* `OSTREE_COMMIT_SUBJECT` - Commit subject used by OSTree. Defaults to `Commit-id: ${IMAGE_NAME}` 84* `OSTREE_COMMIT_SUBJECT` - Commit subject used by OSTree. Defaults to `Commit-id: ${IMAGE_NAME}`
83* `OSTREE_UPDATE_SUMMARY` - Set this to '1' to update summary of OSTree repository on each commit. '0' by default. 85* `OSTREE_UPDATE_SUMMARY` - Set this to '1' to update summary of OSTree repository on each commit. '0' by default.
84* `OSTREE_DEPLOY_DEVICETREE` - Set this to '1' to include devicetree(s) to boot 86* `OSTREE_DEPLOY_DEVICETREE` - Set this to '1' to include devicetree(s) to boot
87* `GARAGE_SIGN_AUTOVERSION` - Set this to '1' to automatically fetch the last version of the garage tools installed by the aktualizr-native. Otherwise use the fixed version specified in the recipe.
85* `INITRAMFS_IMAGE` - initramfs/initrd image that is used as a proxy while booting into OSTree deployment. Do not change this setting unless you are sure that your initramfs can serve as such a proxy. 88* `INITRAMFS_IMAGE` - initramfs/initrd image that is used as a proxy while booting into OSTree deployment. Do not change this setting unless you are sure that your initramfs can serve as such a proxy.
86* `SOTA_PACKED_CREDENTIALS` - when set, your ostree commit will be pushed to a remote repo as a bitbake step. This should be the path to a zipped credentials file in https://github.com/advancedtelematic/aktualizr/blob/master/docs/credentials.adoc[the format accepted by garage-push]. 89* `SOTA_PACKED_CREDENTIALS` - when set, your ostree commit will be pushed to a remote repo as a bitbake step. This should be the path to a zipped credentials file in https://github.com/advancedtelematic/aktualizr/blob/master/docs/credentials.adoc[the format accepted by garage-push].
87* `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build. 90* `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build.
@@ -151,6 +154,7 @@ First, you can set `SOTA_CLIENT_PROV` to control which provisioning recipe is us
151 154
152Second, you can write recipes to install additional config files with customized options. A few recipes already exist to address common needs and provide an example: 155Second, you can write recipes to install additional config files with customized options. A few recipes already exist to address common needs and provide an example:
153 156
157* link:recipes-sota/config/aktualizr-auto-reboot.bb[aktualizr-auto-reboot.bb] configures aktualizr to automatically reboot after new updates are installed in order to apply the updates immediately. This is only relevant for package managers (such as OSTree) that require a reboot to complete the installation process. If this is not enabled, you will need to reboot the system through other means.
154* link:recipes-sota/config/aktualizr-disable-send-ip.bb[aktualizr-disable-send-ip.bb] disables the reporting of networking information to the server. This is enabled by default and supported by https://connect.ota.here.com/[HERE OTA Connect]. However, if you are using a different server that does not support this feature, you may want to disable it in aktualizr. 158* link:recipes-sota/config/aktualizr-disable-send-ip.bb[aktualizr-disable-send-ip.bb] disables the reporting of networking information to the server. This is enabled by default and supported by https://connect.ota.here.com/[HERE OTA Connect]. However, if you are using a different server that does not support this feature, you may want to disable it in aktualizr.
155* link:recipes-sota/config/aktualizr-log-debug.bb[aktualizr-log-debug.bb] sets the log level of aktualizr to 0 (trace). The default is 2 (info). This recipe is intended for development and debugging purposes. 159* link:recipes-sota/config/aktualizr-log-debug.bb[aktualizr-log-debug.bb] sets the log level of aktualizr to 0 (trace). The default is 2 (info). This recipe is intended for development and debugging purposes.
156 160
diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass
index 29da78e..41327e1 100644
--- a/classes/image_types_ostree.bbclass
+++ b/classes/image_types_ostree.bbclass
@@ -148,6 +148,13 @@ IMAGE_CMD_ostreecommit () {
148 if [ "${OSTREE_UPDATE_SUMMARY}" = "1" ]; then 148 if [ "${OSTREE_UPDATE_SUMMARY}" = "1" ]; then
149 ostree --repo=${OSTREE_REPO} summary -u 149 ostree --repo=${OSTREE_REPO} summary -u
150 fi 150 fi
151
152 # To enable simultaneous bitbaking of two images with the same branch name,
153 # create a new ref in the repo using the basename of the image. (This first
154 # requires deleting it if it already exists.) Fixes OTA-2211.
155 ostree --repo=${OSTREE_REPO} refs --delete ${OSTREE_BRANCHNAME}-${IMAGE_BASENAME}
156 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME})
157 ostree --repo=${OSTREE_REPO} refs --create=${OSTREE_BRANCHNAME}-${IMAGE_BASENAME} ${ostree_target_hash}
151} 158}
152 159
153IMAGE_TYPEDEP_ostreepush = "ostreecommit" 160IMAGE_TYPEDEP_ostreepush = "ostreecommit"
@@ -190,7 +197,7 @@ IMAGE_CMD_garagesign () {
190 --home-dir ${GARAGE_SIGN_REPO} \ 197 --home-dir ${GARAGE_SIGN_REPO} \
191 --credentials ${SOTA_PACKED_CREDENTIALS} 198 --credentials ${SOTA_PACKED_CREDENTIALS}
192 199
193 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}) 200 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}-${IMAGE_BASENAME})
194 201
195 # Use OSTree target hash as version if none was provided by the user 202 # Use OSTree target hash as version if none was provided by the user
196 target_version=${ostree_target_hash} 203 target_version=${ostree_target_hash}
@@ -243,7 +250,8 @@ IMAGE_CMD_garagecheck () {
243 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then 250 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
244 # if credentials are issued by a server that doesn't support offline signing, exit silently 251 # if credentials are issued by a server that doesn't support offline signing, exit silently
245 unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0 252 unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0
246 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}) 253
254 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}-${IMAGE_BASENAME})
247 255
248 garage-check --ref=${ostree_target_hash} \ 256 garage-check --ref=${ostree_target_hash} \
249 --credentials=${SOTA_PACKED_CREDENTIALS} \ 257 --credentials=${SOTA_PACKED_CREDENTIALS} \
diff --git a/classes/image_types_ota.bbclass b/classes/image_types_ota.bbclass
index a31cbd1..12375ec 100644
--- a/classes/image_types_ota.bbclass
+++ b/classes/image_types_ota.bbclass
@@ -59,7 +59,7 @@ IMAGE_CMD_ota () {
59 bbfatal "Invalid bootloader: ${OSTREE_BOOTLOADER}" 59 bbfatal "Invalid bootloader: ${OSTREE_BOOTLOADER}"
60 fi 60 fi
61 61
62 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}) 62 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}-${IMAGE_BASENAME})
63 63
64 ostree --repo=${OTA_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${ostree_target_hash} 64 ostree --repo=${OTA_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${ostree_target_hash}
65 kargs_list="" 65 kargs_list=""
diff --git a/classes/sota_am335x-evm-wifi.bbclass b/classes/sota_am335x-evm-wifi.bbclass
index adefb47..1458d44 100644
--- a/classes/sota_am335x-evm-wifi.bbclass
+++ b/classes/sota_am335x-evm-wifi.bbclass
@@ -7,7 +7,6 @@ IMAGE_BOOT_FILES_sota = "bootfiles/*"
7OSTREE_KERNEL_ARGS ?= "ramdisk_size=16384 root=/dev/ram0 rw rootfstype=ext4 rootwait rootdelay=2 ostree_root=/dev/mmcblk0p2 console=ttyO0,115200n8l" 7OSTREE_KERNEL_ARGS ?= "ramdisk_size=16384 root=/dev/ram0 rw rootfstype=ext4 rootwait rootdelay=2 ostree_root=/dev/mmcblk0p2 console=ttyO0,115200n8l"
8 8
9IMAGE_INSTALL_append_sota = " uim iw wl18xx-calibrator wlconf wl18xx-fw hostapd wpa-supplicant" 9IMAGE_INSTALL_append_sota = " uim iw wl18xx-calibrator wlconf wl18xx-fw hostapd wpa-supplicant"
10IMAGE_INSTALL_remove_sota = " connman connman-client"
11 10
12PREFERRED_VERSION_linux-ti-staging_sota = "4.4.54+gitAUTOINC+ecd4eada6f" 11PREFERRED_VERSION_linux-ti-staging_sota = "4.4.54+gitAUTOINC+ecd4eada6f"
13 12
diff --git a/classes/sota_m3ulcb.bbclass b/classes/sota_m3ulcb.bbclass
index 6b63af4..b93cc40 100644
--- a/classes/sota_m3ulcb.bbclass
+++ b/classes/sota_m3ulcb.bbclass
@@ -6,3 +6,6 @@ IMAGE_BOOT_FILES_sota += "m3ulcb-ota-bootfiles/*"
6 6
7OSTREE_BOOTLOADER ?= "u-boot" 7OSTREE_BOOTLOADER ?= "u-boot"
8UBOOT_MACHINE_sota = "m3ulcb_defconfig" 8UBOOT_MACHINE_sota = "m3ulcb_defconfig"
9
10PREFERRED_RPROVIDER_virtual/network-configuration ?= "connman"
11IMAGE_INSTALL_append_sota = " virtual/network-configuration "
diff --git a/classes/sota_minnowboard.bbclass b/classes/sota_minnowboard.bbclass
index 63510e3..a907217 100644
--- a/classes/sota_minnowboard.bbclass
+++ b/classes/sota_minnowboard.bbclass
@@ -6,5 +6,7 @@ IMAGE_BOOT_FILES_sota = ""
6 6
7IMAGE_FSTYPES_remove_sota = "live hddimg" 7IMAGE_FSTYPES_remove_sota = "live hddimg"
8OSTREE_KERNEL_ARGS ?= "ramdisk_size=16384 rw rootfstype=ext4 rootwait rootdelay=2 console=ttyS0,115200 console=tty0" 8OSTREE_KERNEL_ARGS ?= "ramdisk_size=16384 rw rootfstype=ext4 rootwait rootdelay=2 console=ttyS0,115200 console=tty0"
9
10IMAGE_INSTALL_append = " minnowboard-efi-startup" 9IMAGE_INSTALL_append = " minnowboard-efi-startup"
10
11PREFERRED_RPROVIDER_virtual/network-configuration ?= "connman"
12IMAGE_INSTALL_append_sota = " virtual/network-configuration "
diff --git a/classes/sota_porter.bbclass b/classes/sota_porter.bbclass
index 75ae579..80062e1 100644
--- a/classes/sota_porter.bbclass
+++ b/classes/sota_porter.bbclass
@@ -7,3 +7,5 @@ IMAGE_BOOT_FILES_sota += "porter-bootfiles/*"
7OSTREE_BOOTLOADER ?= "u-boot" 7OSTREE_BOOTLOADER ?= "u-boot"
8UBOOT_MACHINE_sota = "porter_config" 8UBOOT_MACHINE_sota = "porter_config"
9 9
10PREFERRED_RPROVIDER_virtual/network-configuration ?= "connman"
11IMAGE_INSTALL_append_sota = " virtual/network-configuration "
diff --git a/classes/sota_qemux86-64.bbclass b/classes/sota_qemux86-64.bbclass
index 0850af6..fc4aa7c 100644
--- a/classes/sota_qemux86-64.bbclass
+++ b/classes/sota_qemux86-64.bbclass
@@ -12,3 +12,5 @@ IMAGE_ROOTFS_EXTRA_SPACE = "${@bb.utils.contains('DISTRO_FEATURES', 'sota', '655
12 12
13# fix for u-boot/swig build issue 13# fix for u-boot/swig build issue
14HOSTTOOLS_NONFATAL += "x86_64-linux-gnu-gcc" 14HOSTTOOLS_NONFATAL += "x86_64-linux-gnu-gcc"
15
16IMAGE_INSTALL_append_sota = " virtual/network-configuration "
diff --git a/classes/sota_raspberrypi.bbclass b/classes/sota_raspberrypi.bbclass
index e1c0054..3add247 100644
--- a/classes/sota_raspberrypi.bbclass
+++ b/classes/sota_raspberrypi.bbclass
@@ -12,6 +12,9 @@ UBOOT_DTBO_LOADADDRESS = "0x06000000"
12# Deploy config fragment list to OSTree root fs 12# Deploy config fragment list to OSTree root fs
13IMAGE_INSTALL_append = " fit-conf" 13IMAGE_INSTALL_append = " fit-conf"
14 14
15DEV_MATCH_DIRECTIVE_pn-networkd-dhcp-conf = "Driver=smsc95xx lan78xx"
16IMAGE_INSTALL_append_sota = " virtual/network-configuration "
17
15PREFERRED_PROVIDER_virtual/bootloader_sota ?= "u-boot" 18PREFERRED_PROVIDER_virtual/bootloader_sota ?= "u-boot"
16UBOOT_ENTRYPOINT_sota ?= "0x00008000" 19UBOOT_ENTRYPOINT_sota ?= "0x00008000"
17 20
@@ -34,4 +37,3 @@ SOTA_DT_OVERLAYS_raspberrypi3 ?= "vc4-kms-v3d.dtbo rpi-ft5406.dtbo"
34OSTREE_KERNEL_ARGS_sota ?= " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 console=ttyS0,115200 usbhid.mousepoll=0 " 37OSTREE_KERNEL_ARGS_sota ?= " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 console=ttyS0,115200 usbhid.mousepoll=0 "
35 38
36SOTA_CLIENT_FEATURES_append = " ubootenv" 39SOTA_CLIENT_FEATURES_append = " ubootenv"
37
diff --git a/conf/distro/poky-sota-systemd.conf b/conf/distro/poky-sota-systemd.conf
index 7d008a9..b30b322 100644
--- a/conf/distro/poky-sota-systemd.conf
+++ b/conf/distro/poky-sota-systemd.conf
@@ -9,5 +9,4 @@ DISTRO_CODENAME = "sota"
9 9
10DISTRO_FEATURES_append = " systemd" 10DISTRO_FEATURES_append = " systemd"
11VIRTUAL-RUNTIME_init_manager = "systemd" 11VIRTUAL-RUNTIME_init_manager = "systemd"
12 12PREFERRED_RPROVIDER_virtual/network-configuration ??= "networkd-dhcp-conf"
13IMAGE_INSTALL_append = " connman connman-client"
diff --git a/conf/distro/poky-sota.conf b/conf/distro/poky-sota.conf
index 2bbc62b..3fb1d20 100644
--- a/conf/distro/poky-sota.conf
+++ b/conf/distro/poky-sota.conf
@@ -5,5 +5,3 @@ DISTRO = "poky-sota"
5DISTRO_NAME = "OTA-enabled Linux" 5DISTRO_NAME = "OTA-enabled Linux"
6DISTRO_VERSION = "1.0" 6DISTRO_VERSION = "1.0"
7DISTRO_CODENAME = "sota" 7DISTRO_CODENAME = "sota"
8
9IMAGE_INSTALL_append = " connman connman-client"
diff --git a/conf/include/bblayers/sota.inc b/conf/include/bblayers/sota.inc
index 26eea22..c4ecd4e 100644
--- a/conf/include/bblayers/sota.inc
+++ b/conf/include/bblayers/sota.inc
@@ -1,3 +1,4 @@
1BBLAYERS += "${METADIR}/meta-updater" 1BBLAYERS += "${METADIR}/meta-updater"
2BBLAYERS += "${METADIR}/meta-openembedded/meta-filesystems" 2BBLAYERS += "${METADIR}/meta-openembedded/meta-filesystems"
3BBLAYERS += "${METADIR}/meta-openembedded/meta-oe" 3BBLAYERS += "${METADIR}/meta-openembedded/meta-oe"
4BBLAYERS += "${METADIR}/meta-openembedded/meta-python"
diff --git a/conf/include/bblayers/sota_am335x-evm.inc b/conf/include/bblayers/sota_am335x-evm.inc
index f2d485d..909a7a4 100644
--- a/conf/include/bblayers/sota_am335x-evm.inc
+++ b/conf/include/bblayers/sota_am335x-evm.inc
@@ -1,2 +1 @@
1 BBLAYERS += "${METADIR}/meta-ti"
2BBLAYERS += " ${METADIR}/meta-ti "
diff --git a/conf/include/bblayers/sota_intel-corei7-64.inc b/conf/include/bblayers/sota_intel-corei7-64.inc
index 1771e6c..8e85a6c 100644
--- a/conf/include/bblayers/sota_intel-corei7-64.inc
+++ b/conf/include/bblayers/sota_intel-corei7-64.inc
@@ -1,2 +1,2 @@
1 1BBLAYERS += "${METADIR}/meta-updater-minnowboard"
2BBLAYERS += " ${METADIR}/meta-updater-minnowboard ${METADIR}/meta-intel " 2BBLAYERS += "${METADIR}/meta-intel"
diff --git a/conf/include/bblayers/sota_m3ulcb.inc b/conf/include/bblayers/sota_m3ulcb.inc
index 04f78e4..4f2e0a9 100644
--- a/conf/include/bblayers/sota_m3ulcb.inc
+++ b/conf/include/bblayers/sota_m3ulcb.inc
@@ -1,2 +1,3 @@
1 1BBLAYERS += "${METADIR}/meta-renesas"
2BBLAYERS += " ${METADIR}/meta-renesas ${METADIR}/meta-renesas-rcar-gen3 ${METADIR}/meta-openembedded/meta-multimedia" 2BBLAYERS += "${METADIR}/meta-renesas-rcar-gen3"
3BBLAYERS += "${METADIR}/meta-openembedded/meta-multimedia"
diff --git a/conf/include/bblayers/sota_porter.inc b/conf/include/bblayers/sota_porter.inc
index 6964ef0..a50b71c 100644
--- a/conf/include/bblayers/sota_porter.inc
+++ b/conf/include/bblayers/sota_porter.inc
@@ -1,2 +1,4 @@
1 1BBLAYERS += "${METADIR}/meta-renesas"
2BBLAYERS += " ${METADIR}/meta-renesas ${METADIR}/meta-renesas/meta-rcar-gen2 ${METADIR}/meta-openembedded/meta-multimedia ${METADIR}/meta-updater-porter" 2BBLAYERS += "${METADIR}/meta-renesas/meta-rcar-gen2"
3BBLAYERS += "${METADIR}/meta-openembedded/meta-multimedia"
4BBLAYERS += "${METADIR}/meta-updater-porter"
diff --git a/conf/include/bblayers/sota_qemux86-64.inc b/conf/include/bblayers/sota_qemux86-64.inc
index 12d32ff..9ccbfa6 100644
--- a/conf/include/bblayers/sota_qemux86-64.inc
+++ b/conf/include/bblayers/sota_qemux86-64.inc
@@ -1 +1 @@
BBLAYERS += " ${METADIR}/meta-updater-qemux86-64 " BBLAYERS += "${METADIR}/meta-updater-qemux86-64"
diff --git a/conf/include/bblayers/sota_raspberrypi2.inc b/conf/include/bblayers/sota_raspberrypi2.inc
index cc26679..ea420ba 100644
--- a/conf/include/bblayers/sota_raspberrypi2.inc
+++ b/conf/include/bblayers/sota_raspberrypi2.inc
@@ -1,3 +1,2 @@
1BBLAYERS += " ${METADIR}/meta-openembedded/meta-python " 1BBLAYERS += "${METADIR}/meta-updater-raspberrypi"
2 2BBLAYERS += "${METADIR}/meta-raspberrypi"
3BBLAYERS += " ${METADIR}/meta-updater-raspberrypi ${METADIR}/meta-raspberrypi "
diff --git a/conf/include/bblayers/sota_raspberrypi3.inc b/conf/include/bblayers/sota_raspberrypi3.inc
index cc26679..ea420ba 100644
--- a/conf/include/bblayers/sota_raspberrypi3.inc
+++ b/conf/include/bblayers/sota_raspberrypi3.inc
@@ -1,3 +1,2 @@
1BBLAYERS += " ${METADIR}/meta-openembedded/meta-python " 1BBLAYERS += "${METADIR}/meta-updater-raspberrypi"
2 2BBLAYERS += "${METADIR}/meta-raspberrypi"
3BBLAYERS += " ${METADIR}/meta-updater-raspberrypi ${METADIR}/meta-raspberrypi "
diff --git a/lib/oeqa/selftest/cases/updater.py b/lib/oeqa/selftest/cases/updater.py
index 08521d5..898096c 100644
--- a/lib/oeqa/selftest/cases/updater.py
+++ b/lib/oeqa/selftest/cases/updater.py
@@ -67,35 +67,6 @@ class GeneralTests(OESelftestTestCase):
67 self.assertEqual(result.status, 0, 67 self.assertEqual(result.status, 0,
68 "Java not found. Do you have a JDK installed on your host machine?") 68 "Java not found. Do you have a JDK installed on your host machine?")
69 69
70 def test_add_package(self):
71 deploydir = get_bb_var('DEPLOY_DIR_IMAGE')
72 imagename = get_bb_var('IMAGE_LINK_NAME', 'core-image-minimal')
73 image_path = deploydir + '/' + imagename + '.ota-ext4'
74 logger = logging.getLogger("selftest")
75
76 logger.info('Running bitbake with man in the image package list')
77 self.append_config('IMAGE_INSTALL_append = " man "')
78 bitbake('-c cleanall man-db')
79 bitbake('core-image-minimal')
80 result = runCmd('oe-pkgdata-util find-path /usr/bin/man')
81 self.assertEqual(result.output, 'man-db: /usr/bin/man')
82 path1 = os.path.realpath(image_path)
83 size1 = os.path.getsize(path1)
84 logger.info('First image %s has size %i' % (path1, size1))
85
86 logger.info('Running bitbake without man in the image package list')
87 self.append_config('IMAGE_INSTALL_remove = " man "')
88 bitbake('-c cleanall man-db')
89 bitbake('core-image-minimal')
90 result = runCmd('oe-pkgdata-util find-path /usr/bin/man', ignore_status=True)
91 self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
92 self.assertEqual(result.output, 'ERROR: Unable to find any package producing path /usr/bin/man')
93 path2 = os.path.realpath(image_path)
94 size2 = os.path.getsize(path2)
95 logger.info('Second image %s has size %i', path2, size2)
96 self.assertNotEqual(path1, path2, "Image paths are identical; image was not rebuilt.")
97 self.assertNotEqual(size1, size2, "Image sizes are identical; image was not rebuilt.")
98
99 70
100class AktualizrToolsTests(OESelftestTestCase): 71class AktualizrToolsTests(OESelftestTestCase):
101 72
@@ -235,7 +206,6 @@ class RpiTests(OESelftestTestCase):
235 def setUpLocal(self): 206 def setUpLocal(self):
236 # Add layers before changing the machine type, otherwise the sanity 207 # Add layers before changing the machine type, otherwise the sanity
237 # checker complains loudly. 208 # checker complains loudly.
238 layer_python = "meta-openembedded/meta-python"
239 layer_rpi = "meta-raspberrypi" 209 layer_rpi = "meta-raspberrypi"
240 layer_upd_rpi = "meta-updater-raspberrypi" 210 layer_upd_rpi = "meta-updater-raspberrypi"
241 result = runCmd('bitbake-layers show-layers') 211 result = runCmd('bitbake-layers show-layers')
@@ -244,11 +214,6 @@ class RpiTests(OESelftestTestCase):
244 # layers we need aren't where we expect them, we are out of luck. 214 # layers we need aren't where we expect them, we are out of luck.
245 path = os.path.abspath(os.path.dirname(__file__)) 215 path = os.path.abspath(os.path.dirname(__file__))
246 metadir = path + "/../../../../../" 216 metadir = path + "/../../../../../"
247 if re.search(layer_python, result.output) is None:
248 self.meta_python = metadir + layer_python
249 runCmd('bitbake-layers add-layer "%s"' % self.meta_python)
250 else:
251 self.meta_python = None
252 if re.search(layer_rpi, result.output) is None: 217 if re.search(layer_rpi, result.output) is None:
253 self.meta_rpi = metadir + layer_rpi 218 self.meta_rpi = metadir + layer_rpi
254 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi) 219 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi)
@@ -284,8 +249,6 @@ class RpiTests(OESelftestTestCase):
284 runCmd('bitbake-layers remove-layer "%s"' % self.meta_upd_rpi, ignore_status=True) 249 runCmd('bitbake-layers remove-layer "%s"' % self.meta_upd_rpi, ignore_status=True)
285 if self.meta_rpi: 250 if self.meta_rpi:
286 runCmd('bitbake-layers remove-layer "%s"' % self.meta_rpi, ignore_status=True) 251 runCmd('bitbake-layers remove-layer "%s"' % self.meta_rpi, ignore_status=True)
287 if self.meta_python:
288 runCmd('bitbake-layers remove-layer "%s"' % self.meta_python, ignore_status=True)
289 252
290 def test_rpi(self): 253 def test_rpi(self):
291 logger = logging.getLogger("selftest") 254 logger = logging.getLogger("selftest")
diff --git a/recipes-connectivity/connman/connman_%.bbappend b/recipes-connectivity/connman/connman_%.bbappend
new file mode 100644
index 0000000..b3633cc
--- /dev/null
+++ b/recipes-connectivity/connman/connman_%.bbappend
@@ -0,0 +1 @@
RPROVIDES_${PN} += "virtual/network-configuration"
diff --git a/recipes-connectivity/networkd-dhcp-conf/files/20-wired-dhcp.network b/recipes-connectivity/networkd-dhcp-conf/files/20-wired-dhcp.network
new file mode 100644
index 0000000..edb3678
--- /dev/null
+++ b/recipes-connectivity/networkd-dhcp-conf/files/20-wired-dhcp.network
@@ -0,0 +1,5 @@
1[Match]
2@MATCH_DIRECTIVE@
3
4[Network]
5DHCP=yes
diff --git a/recipes-connectivity/networkd-dhcp-conf/networkd-dhcp-conf.bb b/recipes-connectivity/networkd-dhcp-conf/networkd-dhcp-conf.bb
new file mode 100644
index 0000000..1a515a2
--- /dev/null
+++ b/recipes-connectivity/networkd-dhcp-conf/networkd-dhcp-conf.bb
@@ -0,0 +1,28 @@
1SUMMARY = "systemd-networkd config to setup wired interface with dhcp"
2DESCRIPTION = "Provides automatic dhcp network configuration for wired \
3interfaces through systemd-networkd"
4LICENSE = "MPL-2.0"
5LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad"
6
7inherit systemd
8
9RPROVIDES_${PN} = "virtual/network-configuration"
10
11SRC_URI_append = " file://20-wired-dhcp.network"
12PR = "r1"
13
14RDEPENDS_${PN} = "systemd"
15
16S = "${WORKDIR}"
17
18PACKAGE_ARCH = "${MACHINE_ARCH}"
19
20FILES_${PN} = "${systemd_unitdir}/network/*"
21
22DEV_MATCH_DIRECTIVE ?= "Name=en*"
23
24do_install() {
25 install -d ${D}/${systemd_unitdir}/network
26 install -m 0644 ${WORKDIR}/20-wired-dhcp.network ${D}/${systemd_unitdir}/network
27 sed -i -e 's|@MATCH_DIRECTIVE@|${DEV_MATCH_DIRECTIVE}|g' ${D}${systemd_unitdir}/network/20-wired-dhcp.network
28}
diff --git a/recipes-sota/aktualizr/aktualizr-auto-prov-creds.bb b/recipes-sota/aktualizr/aktualizr-auto-prov-creds.bb
index 34460af..0628a61 100644
--- a/recipes-sota/aktualizr/aktualizr-auto-prov-creds.bb
+++ b/recipes-sota/aktualizr/aktualizr-auto-prov-creds.bb
@@ -11,9 +11,14 @@ require credentials.inc
11do_install() { 11do_install() {
12 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then 12 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
13 install -m 0700 -d ${D}${localstatedir}/sota 13 install -m 0700 -d ${D}${localstatedir}/sota
14 cp ${SOTA_PACKED_CREDENTIALS} ${D}${localstatedir}/sota/sota_provisioning_credentials.zip 14 cp "${SOTA_PACKED_CREDENTIALS}" ${D}${localstatedir}/sota/sota_provisioning_credentials.zip
15 # Device should not be able to push data to treehub 15 # Device should not be able to push data to treehub
16 zip -d ${D}${localstatedir}/sota/sota_provisioning_credentials.zip treehub.json 16 zip -d ${D}${localstatedir}/sota/sota_provisioning_credentials.zip treehub.json
17 # Device has no use for the API Gateway. Remove if present. See:
18 # https://github.com/advancedtelematic/ota-plus-server/pull/1913/
19 if unzip -l ${D}${localstatedir}/sota/sota_provisioning_credentials.zip api_gateway.url > /dev/null; then
20 zip -d ${D}${localstatedir}/sota/sota_provisioning_credentials.zip api_gateway.url
21 fi
17 fi 22 fi
18} 23}
19 24
diff --git a/recipes-sota/aktualizr/aktualizr-ca-implicit-prov-creds.bb b/recipes-sota/aktualizr/aktualizr-ca-implicit-prov-creds.bb
index 7420983..b9bb1f6 100644
--- a/recipes-sota/aktualizr/aktualizr-ca-implicit-prov-creds.bb
+++ b/recipes-sota/aktualizr/aktualizr-ca-implicit-prov-creds.bb
@@ -3,6 +3,10 @@ SECTION = "base"
3LICENSE = "MPL-2.0" 3LICENSE = "MPL-2.0"
4LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad" 4LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad"
5 5
6# WARNING: it is NOT a production solution. The secure way to provision devices
7# is to create certificate request directly on the device (either with HSM/TPM
8# or with software) and then sign it with a CA stored on a disconnected machine.
9
6DEPENDS = "aktualizr aktualizr-native" 10DEPENDS = "aktualizr aktualizr-native"
7ALLOW_EMPTY_${PN} = "1" 11ALLOW_EMPTY_${PN} = "1"
8 12
diff --git a/recipes-sota/aktualizr/aktualizr-ca-implicit-prov.bb b/recipes-sota/aktualizr/aktualizr-ca-implicit-prov.bb
index 8dcda99..a932475 100644
--- a/recipes-sota/aktualizr/aktualizr-ca-implicit-prov.bb
+++ b/recipes-sota/aktualizr/aktualizr-ca-implicit-prov.bb
@@ -1,9 +1,6 @@
1SUMMARY = "Aktualizr configuration for implicit provisioning with CA" 1SUMMARY = "Aktualizr configuration for implicit provisioning with CA"
2DESCRIPTION = "Configuration for implicitly provisioning Aktualizr using externally provided or generated CA" 2DESCRIPTION = "Configuration for implicitly provisioning Aktualizr using externally provided or generated CA"
3 3
4# WARNING: it is NOT a production solution. The secure way to provision devices is to create certificate request directly on the device
5# (either with HSM/TPM or with software) and then sign it with a CA stored on a disconnected machine
6
7HOMEPAGE = "https://github.com/advancedtelematic/aktualizr" 4HOMEPAGE = "https://github.com/advancedtelematic/aktualizr"
8SECTION = "base" 5SECTION = "base"
9LICENSE = "MPL-2.0" 6LICENSE = "MPL-2.0"
diff --git a/recipes-sota/aktualizr/aktualizr_git.bb b/recipes-sota/aktualizr/aktualizr_git.bb
index fbc1bca..2c27935 100755
--- a/recipes-sota/aktualizr/aktualizr_git.bb
+++ b/recipes-sota/aktualizr/aktualizr_git.bb
@@ -5,8 +5,6 @@ SECTION = "base"
5LICENSE = "MPL-2.0" 5LICENSE = "MPL-2.0"
6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" 6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3"
7 7
8require garage-sign-version.inc
9
10DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native" 8DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native"
11RDEPENDS_${PN}_class-target = "aktualizr-check-discovery aktualizr-configs lshw" 9RDEPENDS_${PN}_class-target = "aktualizr-check-discovery aktualizr-configs lshw"
12RDEPENDS_${PN}-secondary = "aktualizr-check-discovery" 10RDEPENDS_${PN}-secondary = "aktualizr-check-discovery"
@@ -15,15 +13,22 @@ RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${
15PV = "1.0+git${SRCPV}" 13PV = "1.0+git${SRCPV}"
16PR = "7" 14PR = "7"
17 15
16GARAGE_SIGN_PV = "0.6.0-3-gc38b9f3"
17
18SRC_URI = " \ 18SRC_URI = " \
19 gitsm://github.com/advancedtelematic/aktualizr;branch=${BRANCH} \ 19 gitsm://github.com/advancedtelematic/aktualizr;branch=${BRANCH} \
20 file://aktualizr.service \ 20 file://aktualizr.service \
21 file://aktualizr-secondary.service \ 21 file://aktualizr-secondary.service \
22 file://aktualizr-secondary.socket \ 22 file://aktualizr-secondary.socket \
23 file://aktualizr-serialcan.service \ 23 file://aktualizr-serialcan.service \
24 ${@ d.expand("https://ats-tuf-cli-releases.s3-eu-central-1.amazonaws.com/cli-${GARAGE_SIGN_PV}.tgz;unpack=0") if d.getVar('GARAGE_SIGN_AUTOVERSION') != '1' else ''} \
24 " 25 "
25 26
26SRCREV = "1cad6d10286ade64b24021ca0e23de0d3b64f520" 27# for garage-sign archive
28SRC_URI[md5sum] = "30d7f0931e2236954679e75d1bae174f"
29SRC_URI[sha256sum] = "46d8c6448ce14cbb9af6a93eba7e29d38579e566dcd6518d22f723a8da16cad5"
30
31SRCREV = "ea03a5cf57def6b8d368f783cb12b91255365a80"
27BRANCH ?= "master" 32BRANCH ?= "master"
28 33
29S = "${WORKDIR}/git" 34S = "${WORKDIR}/git"
@@ -36,9 +41,7 @@ SYSTEMD_SERVICE_${PN}-secondary = "aktualizr-secondary.socket"
36 41
37EXTRA_OECMAKE = "-DCMAKE_BUILD_TYPE=Release -DAKTUALIZR_VERSION=${PV}" 42EXTRA_OECMAKE = "-DCMAKE_BUILD_TYPE=Release -DAKTUALIZR_VERSION=${PV}"
38 43
39GARAGE_SIGN_OPS = "${@ '-DGARAGE_SIGN_VERSION=%s' % d.getVar('GARAGE_SIGN_VERSION') if d.getVar('GARAGE_SIGN_VERSION') is not None else ''} \ 44GARAGE_SIGN_OPS = "${@ d.expand('-DGARAGE_SIGN_ARCHIVE=${WORKDIR}/cli-${GARAGE_SIGN_PV}.tgz') if d.getVar('GARAGE_SIGN_AUTOVERSION') != '1' else ''}"
40 ${@ '-DGARAGE_SIGN_SHA256=%s' % d.getVar('GARAGE_SIGN_SHA256') if d.getVar('GARAGE_SIGN_SHA256') is not None else ''} \
41 "
42 45
43PACKAGECONFIG ?= "ostree ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} ${@bb.utils.filter('SOTA_CLIENT_FEATURES', 'hsm serialcan ubootenv', d)}" 46PACKAGECONFIG ?= "ostree ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} ${@bb.utils.filter('SOTA_CLIENT_FEATURES', 'hsm serialcan ubootenv', d)}"
44PACKAGECONFIG_class-native = "sota-tools" 47PACKAGECONFIG_class-native = "sota-tools"
@@ -66,14 +69,14 @@ do_install_append () {
66 install -m 0700 -d ${D}${sysconfdir}/sota/conf.d 69 install -m 0700 -d ${D}${sysconfdir}/sota/conf.d
67 70
68 if [ -n "${SOTA_HARDWARE_ID}" ]; then 71 if [ -n "${SOTA_HARDWARE_ID}" ]; then
69 echo "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml 72 echo -e "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml
70 fi 73 fi
71 74
72 if [ -n "${SOTA_SECONDARY_CONFIG_DIR}" ]; then 75 if [ -n "${SOTA_SECONDARY_CONFIG_DIR}" ]; then
73 if [ -d "${SOTA_SECONDARY_CONFIG_DIR}" ]; then 76 if [ -d "${SOTA_SECONDARY_CONFIG_DIR}" ]; then
74 install -m 0700 -d ${D}${sysconfdir}/sota/ecus 77 install -m 0700 -d ${D}${sysconfdir}/sota/ecus
75 install -m 0644 "${SOTA_SECONDARY_CONFIG_DIR}"/* ${D}${sysconfdir}/sota/ecus/ 78 install -m 0644 "${SOTA_SECONDARY_CONFIG_DIR}"/* ${D}${sysconfdir}/sota/ecus/
76 echo "[uptane]\nsecondary_configs_dir = /etc/sota/ecus/\n" > ${D}${libdir}/sota/conf.d/30-secondary-configs-dir.toml 79 echo -e "[uptane]\nsecondary_configs_dir = /etc/sota/ecus/\n" > ${D}${libdir}/sota/conf.d/30-secondary-configs-dir.toml
77 else 80 else
78 bbwarn "SOTA_SECONDARY_CONFIG_DIR is set to an invalid directory (${SOTA_SECONDARY_CONFIG_DIR})" 81 bbwarn "SOTA_SECONDARY_CONFIG_DIR is set to an invalid directory (${SOTA_SECONDARY_CONFIG_DIR})"
79 fi 82 fi
diff --git a/recipes-sota/aktualizr/garage-sign-version.inc b/recipes-sota/aktualizr/garage-sign-version.inc
deleted file mode 100644
index 2cea6c9..0000000
--- a/recipes-sota/aktualizr/garage-sign-version.inc
+++ /dev/null
@@ -1,36 +0,0 @@
1
2python () {
3 if d.getVar("GARAGE_SIGN_VERSION") or not d.getVar("SOTA_PACKED_CREDENTIALS"):
4 return
5 import json
6 import urllib.request
7 import zipfile
8 with zipfile.ZipFile(d.getVar("SOTA_PACKED_CREDENTIALS"), 'r') as zip_ref:
9 try:
10 with zip_ref.open('tufrepo.url', mode='r') as url_file:
11 url = url_file.read().decode().strip(' \t\n') + '/health/version'
12 except (KeyError, ValueError, RuntimeError):
13 return
14 connected = False
15 tries = 3
16 for i in range(tries):
17 try:
18 r = urllib.request.urlopen(url)
19 if r.code == 200:
20 connected = True
21 break
22 else:
23 print('Bad return code from server ' + url + ': ' + str(r.code) +
24 ' (attempt ' + str(i + 1) + ' of ' + str(tries) + ')')
25 except urllib.error.URLError as e:
26 print('Error connecting to server ' + url + ': ' + str(e) +
27 ' (attempt ' + str(i + 1) + ' of ' + str(tries) + ')')
28 if not connected:
29 return
30 resp = r.read().decode('utf-8')
31 j = json.loads(resp)
32 version = 'cli-' + j['version'] + '.tgz'
33 d.setVar("GARAGE_SIGN_VERSION", version)
34}
35
36# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/config/aktualizr-auto-reboot.bb b/recipes-sota/config/aktualizr-auto-reboot.bb
new file mode 100644
index 0000000..ad4d17c
--- /dev/null
+++ b/recipes-sota/config/aktualizr-auto-reboot.bb
@@ -0,0 +1,21 @@
1SUMMARY = "Enable auto reboot to apply updates"
2DESCRIPTION = "Configures aktualizr to automatically reboot after new updates are installed in order to apply the updates immediately"
3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr"
4SECTION = "base"
5LICENSE = "MPL-2.0"
6LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad"
7
8SRC_URI = " \
9 file://35-enable-auto-reboot.toml \
10 "
11
12do_install_append () {
13 install -m 0700 -d ${D}${libdir}/sota/conf.d
14 install -m 0644 ${WORKDIR}/35-enable-auto-reboot.toml ${D}${libdir}/sota/conf.d/35-enable-auto-reboot.toml
15}
16
17FILES_${PN} = " \
18 ${libdir}/sota/conf.d/35-enable-auto-reboot.toml \
19 "
20
21# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/config/files/35-enable-auto-reboot.toml b/recipes-sota/config/files/35-enable-auto-reboot.toml
new file mode 100644
index 0000000..f83810e
--- /dev/null
+++ b/recipes-sota/config/files/35-enable-auto-reboot.toml
@@ -0,0 +1,2 @@
1[uptane]
2force_install_completion = true
diff --git a/recipes-sota/fit-conf/fit-conf.bb b/recipes-sota/fit-conf/fit-conf.bb
index c6cecec..f24a94a 100644
--- a/recipes-sota/fit-conf/fit-conf.bb
+++ b/recipes-sota/fit-conf/fit-conf.bb
@@ -2,6 +2,8 @@ SUMMARY = "FIT image configuration for u-boot to use"
2LICENSE = "MIT" 2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" 3LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
4 4
5PACKAGE_ARCH = "${MACHINE_ARCH}"
6
5do_install() { 7do_install() {
6 mkdir -p ${D}${libdir} 8 mkdir -p ${D}${libdir}
7 echo -n "fit_conf=" >${D}${libdir}/fit_conf 9 echo -n "fit_conf=" >${D}${libdir}/fit_conf
diff --git a/recipes-test/images/secondary-image.bb b/recipes-test/images/secondary-image.bb
index 1a41169..61df85b 100644
--- a/recipes-test/images/secondary-image.bb
+++ b/recipes-test/images/secondary-image.bb
@@ -15,8 +15,7 @@ IMAGE_INSTALL_remove = " \
15 aktualizr-ca-implicit-prov-creds \ 15 aktualizr-ca-implicit-prov-creds \
16 aktualizr-hsm-prov \ 16 aktualizr-hsm-prov \
17 aktualizr-uboot-env-rollback \ 17 aktualizr-uboot-env-rollback \
18 connman \ 18 virtual/network-configuration \
19 connman-client \
20 " 19 "
21 20
22IMAGE_INSTALL_append = " \ 21IMAGE_INSTALL_append = " \