summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING.MIT17
-rw-r--r--README.adoc20
-rw-r--r--classes/image_repo_manifest.bbclass2
-rw-r--r--classes/image_types_ostree.bbclass39
-rw-r--r--classes/image_types_ota.bbclass6
-rw-r--r--classes/sota.bbclass6
l---------lib/oeqa/selftest/cases/qemucommand.py1
-rw-r--r--lib/oeqa/selftest/cases/updater.py (renamed from lib/oeqa/selftest/updater.py)142
l---------lib/oeqa/selftest/qemucommand.py1
-rw-r--r--recipes-sota/aktualizr/aktualizr-auto-prov.bb45
-rw-r--r--recipes-sota/aktualizr/aktualizr-hsm-test-prov.bb15
-rw-r--r--recipes-sota/aktualizr/aktualizr-implicit-prov.bb19
-rw-r--r--recipes-sota/aktualizr/aktualizr_git.bb36
-rw-r--r--recipes-sota/aktualizr/credentials.inc1
-rw-r--r--recipes-sota/aktualizr/environment.inc17
-rw-r--r--recipes-sota/aktualizr/files/aktualizr-manual-provision.service13
-rw-r--r--recipes-sota/aktualizr/files/aktualizr-serialcan.service15
-rw-r--r--recipes-sota/aktualizr/files/aktualizr.service (renamed from recipes-sota/aktualizr/files/aktualizr-autoprovision.service)3
-rw-r--r--recipes-sota/aktualizr/files/sota_autoprov.toml14
-rw-r--r--recipes-sota/aktualizr/files/sota_hsm_test.toml18
-rw-r--r--recipes-sota/aktualizr/files/sota_implicit_prov.toml11
-rw-r--r--recipes-sota/garage-sign/garage-sign.bb34
-rw-r--r--recipes-sota/ostree/ostree_git.bb7
-rw-r--r--recipes-support/ca-certificates/ca-certificates_%.bbappend2
-rw-r--r--recipes-support/glib-networking/glib-networking_%.bbappend8
-rw-r--r--recipes-support/libsoup/libsoup-2.4_%.bbappend3
-rw-r--r--recipes-support/slcand-start/files/slcand@.service8
-rw-r--r--recipes-support/slcand-start/slcand-start.bb21
-rw-r--r--scripts/qemucommand.py11
29 files changed, 285 insertions, 250 deletions
diff --git a/COPYING.MIT b/COPYING.MIT
new file mode 100644
index 0000000..fb950dc
--- /dev/null
+++ b/COPYING.MIT
@@ -0,0 +1,17 @@
1Permission is hereby granted, free of charge, to any person obtaining a copy
2of this software and associated documentation files (the "Software"), to deal
3in the Software without restriction, including without limitation the rights
4to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
5copies of the Software, and to permit persons to whom the Software is
6furnished to do so, subject to the following conditions:
7
8The above copyright notice and this permission notice shall be included in
9all copies or substantial portions of the Software.
10
11THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
17THE SOFTWARE.
diff --git a/README.adoc b/README.adoc
index b4608d5..0917e45 100644
--- a/README.adoc
+++ b/README.adoc
@@ -1,10 +1,10 @@
1= meta-updater 1= meta-updater
2 2
3This layer enables over-the-air updates (OTA) with https://github.com/ostreedev/ostree[OSTree] and https://github.com/advancedtelematic/rvi_sota_client[RVI SOTA client]. 3This layer enables over-the-air updates (OTA) with https://github.com/ostreedev/ostree[OSTree] and https://github.com/advancedtelematic/aktualizr[Aktualizr].
4 4
5https://github.com/ostreedev/ostree[OSTree] is a tool for atomic full file system upgrades with rollback capability. OSTree has several advantages over traditional dual-bank systems, but the most important one is that it minimizes network bandwidth and data storage footprint by sharing files with the same contents across file system deployments. 5https://github.com/ostreedev/ostree[OSTree] is a tool for atomic full file system upgrades with rollback capability. OSTree has several advantages over traditional dual-bank systems, but the most important one is that it minimizes network bandwidth and data storage footprint by sharing files with the same contents across file system deployments.
6 6
7https://github.com/advancedtelematic/rvi_sota_client[RVI SOTA client] and/or https://github.com/advancedtelematic/aktualizr[aktualizr] add authentication and provisioning capabilities to OTA and are integrated with OSTree. You can connect with the open-source https://github.com/advancedtelematic/rvi_sota_server[RVI SOTA server] or sign up for a free account at https://app.atsgarage.com[ATS Garage] to get started. 7https://github.com/advancedtelematic/aktualizr[Aktualizr] (and https://github.com/advancedtelematic/rvi_sota_client[RVI SOTA client]) add authentication and provisioning capabilities to OTA and are integrated with OSTree. You can connect with the open-source https://github.com/advancedtelematic/rvi_sota_server[RVI SOTA server] or sign up for a free account at https://app.atsgarage.com[ATS Garage] to get started.
8 8
9== Build 9== Build
10 10
@@ -22,8 +22,6 @@ If you already have a Yocto-based project and you want to add atomic filesystem
22 22
23You can then build your image as usual, with bitbake. After building the root file system, bitbake will then create an https://ostree.readthedocs.io/en/latest/manual/adapting-existing/[OSTree-enabled version] of it, commit it to your local OSTree repo and (optionally) push it to a remote server. Additionally, a live disk image will be created (normally named $\{IMAGE_NAME}.-sdimg-ota e.g. core-image-raspberrypi3.rpi-sdimg-ota). You can control this behaviour through <<variables in your local.conf,OSTree-related variables in your local.conf>>. 23You can then build your image as usual, with bitbake. After building the root file system, bitbake will then create an https://ostree.readthedocs.io/en/latest/manual/adapting-existing/[OSTree-enabled version] of it, commit it to your local OSTree repo and (optionally) push it to a remote server. Additionally, a live disk image will be created (normally named $\{IMAGE_NAME}.-sdimg-ota e.g. core-image-raspberrypi3.rpi-sdimg-ota). You can control this behaviour through <<variables in your local.conf,OSTree-related variables in your local.conf>>.
24 24
25=== Build with OpenIVI
26
27=== Build in AGL 25=== Build in AGL
28 26
29With AGL you can just add agl-sota feature while configuring your build environment: 27With AGL you can just add agl-sota feature while configuring your build environment:
@@ -67,11 +65,15 @@ Although we have used U-Boot so far, other boot loaders can be configured work w
67 65
68== SOTA-related variables in local.conf 66== SOTA-related variables in local.conf
69 67
70* OSTREE_REPO - path to your OSTree repository. Defaults to "$\{DEPLOY_DIR_IMAGE}/ostree_repo" 68* `OSTREE_REPO` - path to your OSTree repository. Defaults to `$\{DEPLOY_DIR_IMAGE}/ostree_repo`
71* OSTREE_BRANCHNAME - the branch your rootfs will be committed to. Defaults to "ota" 69* `OSTREE_OSNAME` - OS deployment name on your target device. For more information about deployments and osnames see the https://ostree.readthedocs.io/en/latest/manual/deployment/[OSTree documentation]. Defaults to "poky".
72* OSTREE_OSNAME - OS deployment name on your target device. For more information about deployments and osnames see the https://ostree.readthedocs.io/en/latest/manual/deployment/[OSTree documentation]. Defaults to "poky". 70* `OSTREE_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.
73* OSTREE_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. 71* `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].
74* 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 JSON credentials file in https://github.com/advancedtelematic/sota-tools#credentials[the format accepted by garage-push]. 72* `SOTA_CLIENT_PROV` - which provisioning method to use. Valid options are https://github.com/advancedtelematic/aktualizr/blob/master/docs/automatic-provisioning.adoc[`aktualizr-auto-prov`], https://github.com/advancedtelematic/aktualizr/blob/master/docs/implicit-provisioning.adoc[`aktualizr-implicit-prov`], and `aktualizr-hsm-test-prov`. The default is `aktualizr-auto-prov`. This can also be set to an empty string to avoid using a provisioning recipe.
73* `SOTA_CLIENT_FEATURES` - extensions to aktualizr. Multiple can be specified if separated by spaces. Valid options are `hsm` (to build with HSM support) and `secondary-example` (to install an example https://github.com/advancedtelematic/aktualizr/blob/master/docs/legacysecondary.adoc[legacy secondary interface] in the image).
74* `SOTA_LEGACY_SECONDARY_INTERFACE` - path to a legacy secondary interface installed on the device. To use the example interface from the Aktualizr repo, use `/usr/bin/example-interface` and make sure `SOTA_CLIENT_FEATURES = "secondary-example"`.
75* `SOTA_SECONDARY_ECUS` - a list of paths separated by spaces of JSON configuration files for virtual secondaries on the host. These will be installed into `/var/sota/ecus` on the device.
76* `SOTA_VIRTUAL_SECONDARIES` - a list of paths separated by spaces of JSON configuration files for virtual secondaries installed on the device. If `SOTA_SECONDARY_ECUS` is used to install them, then you can expect them to be installed in `/var/sota/ecus`.
75 77
76== Usage 78== Usage
77 79
diff --git a/classes/image_repo_manifest.bbclass b/classes/image_repo_manifest.bbclass
index 7f41a97..467fd9a 100644
--- a/classes/image_repo_manifest.bbclass
+++ b/classes/image_repo_manifest.bbclass
@@ -16,7 +16,7 @@ buildinfo () {
16 if [ $(which repo) ]; then 16 if [ $(which repo) ]; then
17 repo manifest --revision-as-HEAD -o ${IMAGE_ROOTFS}${sysconfdir}/manifest.xml || bbwarn "Android repo tool failed to run; manifest not copied" 17 repo manifest --revision-as-HEAD -o ${IMAGE_ROOTFS}${sysconfdir}/manifest.xml || bbwarn "Android repo tool failed to run; manifest not copied"
18 else 18 else
19 bbwarn "Android repo tool not food; manifest not copied." 19 bbwarn "Android repo tool not found; manifest not copied."
20 fi 20 fi
21} 21}
22 22
diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass
index e6bea76..f350449 100644
--- a/classes/image_types_ostree.bbclass
+++ b/classes/image_types_ostree.bbclass
@@ -119,6 +119,7 @@ IMAGE_CMD_ostree () {
119 fi 119 fi
120 120
121 if [ -n "${SOTA_SECONDARY_ECUS}" ]; then 121 if [ -n "${SOTA_SECONDARY_ECUS}" ]; then
122 mkdir -p var/sota/ecus
122 cp ${SOTA_SECONDARY_ECUS} var/sota/ecus 123 cp ${SOTA_SECONDARY_ECUS} var/sota/ecus
123 fi 124 fi
124 125
@@ -179,11 +180,11 @@ IMAGE_CMD_ostreepush () {
179} 180}
180 181
181IMAGE_TYPEDEP_garagesign = "ostreepush" 182IMAGE_TYPEDEP_garagesign = "ostreepush"
182do_image_ostreepush[depends] += "garage-sign-native:do_populate_sysroot" 183do_image_garage_sign[depends] += "aktualizr-native:do_populate_sysroot"
183IMAGE_CMD_garagesign () { 184IMAGE_CMD_garagesign () {
184 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then 185 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
185 # if credentials are issued by a server that doesn't support offline signing, exit silently 186 # if credentials are issued by a server that doesn't support offline signing, exit silently
186 unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec 2>&1 >/dev/null || exit 0 187 unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0
187 188
188 java_version=$( java -version 2>&1 | awk -F '"' '/version/ {print $2}' ) 189 java_version=$( java -version 2>&1 | awk -F '"' '/version/ {print $2}' )
189 if [ "${java_version}" = "" ]; then 190 if [ "${java_version}" = "" ]; then
@@ -194,15 +195,8 @@ IMAGE_CMD_garagesign () {
194 exit 1 195 exit 1
195 fi 196 fi
196 197
197 if [ ! -d "${GARAGE_SIGN_REPO}" ]; then 198 rm -rf ${GARAGE_SIGN_REPO}
198 garage-sign init --repo ${GARAGE_SIGN_REPO} --home-dir ${GARAGE_SIGN_REPO} --credentials ${SOTA_PACKED_CREDENTIALS} 199 garage-sign init --repo tufrepo --home-dir ${GARAGE_SIGN_REPO} --credentials ${SOTA_PACKED_CREDENTIALS}
199 fi
200
201 if [ -n "${GARAGE_SIGN_REPOSERVER}" ]; then
202 reposerver_args="--reposerver ${GARAGE_SIGN_REPOSERVER}"
203 else
204 reposerver_args=""
205 fi
206 200
207 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME}) 201 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME})
208 202
@@ -210,11 +204,11 @@ IMAGE_CMD_garagesign () {
210 # in which case targets.json should be pulled again and the whole procedure repeated 204 # in which case targets.json should be pulled again and the whole procedure repeated
211 push_success=0 205 push_success=0
212 for push_retries in $( seq 3 ); do 206 for push_retries in $( seq 3 ); do
213 garage-sign targets pull --repo ${GARAGE_SIGN_REPO} --home-dir ${GARAGE_SIGN_REPO} ${reposerver_args} 207 garage-sign targets pull --repo tufrepo --home-dir ${GARAGE_SIGN_REPO}
214 garage-sign targets add --repo ${GARAGE_SIGN_REPO} --home-dir ${GARAGE_SIGN_REPO} --name ${OSTREE_BRANCHNAME} --format OSTREE --version ${OSTREE_BRANCHNAME} --length 0 --url "https://example.com/" --sha256 ${ostree_target_hash} --hardwareids ${MACHINE} 208 garage-sign targets add --repo tufrepo --home-dir ${GARAGE_SIGN_REPO} --name ${OSTREE_BRANCHNAME} --format OSTREE --version ${ostree_target_hash} --length 0 --url "https://example.com/" --sha256 ${ostree_target_hash} --hardwareids ${MACHINE}
215 garage-sign targets sign --repo ${GARAGE_SIGN_REPO} --home-dir ${GARAGE_SIGN_REPO} --key-name=targets 209 garage-sign targets sign --repo tufrepo --home-dir ${GARAGE_SIGN_REPO} --key-name=targets
216 errcode=0 210 errcode=0
217 garage-sign targets push --repo ${GARAGE_SIGN_REPO} --home-dir ${GARAGE_SIGN_REPO} ${reposerver_args} || errcode=$? 211 garage-sign targets push --repo tufrepo --home-dir ${GARAGE_SIGN_REPO} || errcode=$?
218 if [ "$errcode" -eq "0" ]; then 212 if [ "$errcode" -eq "0" ]; then
219 push_success=1 213 push_success=1
220 break 214 break
@@ -227,9 +221,20 @@ IMAGE_CMD_garagesign () {
227 bberror "Couldn't push to garage repository" 221 bberror "Couldn't push to garage repository"
228 exit 1 222 exit 1
229 fi 223 fi
230 else
231 bbwarn "SOTA_PACKED_CREDENTIALS not set. Please add SOTA_PACKED_CREDENTIALS."
232 fi 224 fi
233} 225}
234 226
227IMAGE_TYPEDEP_garagecheck = "ostreepush garagesign"
228do_image_garagecheck[depends] += "aktualizr-native:do_populate_sysroot"
229IMAGE_CMD_garagecheck () {
230 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
231 # if credentials are issued by a server that doesn't support offline signing, exit silently
232 unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0
233 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME})
234
235 garage-check --ref=${ostree_target_hash} \
236 --credentials=${SOTA_PACKED_CREDENTIALS} \
237 --cacert=${STAGING_ETCDIR_NATIVE}/ssl/certs/ca-certificates.crt
238 fi
239}
235# vim:set ts=4 sw=4 sts=4 expandtab: 240# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/classes/image_types_ota.bbclass b/classes/image_types_ota.bbclass
index b15178a..b827444 100644
--- a/classes/image_types_ota.bbclass
+++ b/classes/image_types_ota.bbclass
@@ -85,14 +85,16 @@ IMAGE_CMD_otaimg () {
85 bberror "Invalid bootloader: ${OSTREE_BOOTLOADER}" 85 bberror "Invalid bootloader: ${OSTREE_BOOTLOADER}"
86 fi; 86 fi;
87 87
88 ostree --repo=${PHYS_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${OSTREE_BRANCHNAME} 88 ostree_target_hash=$(cat ${OSTREE_REPO}/refs/heads/${OSTREE_BRANCHNAME})
89
90 ostree --repo=${PHYS_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${ostree_target_hash}
89 export OSTREE_BOOT_PARTITION="/boot" 91 export OSTREE_BOOT_PARTITION="/boot"
90 kargs_list="" 92 kargs_list=""
91 for arg in ${OSTREE_KERNEL_ARGS}; do 93 for arg in ${OSTREE_KERNEL_ARGS}; do
92 kargs_list="${kargs_list} --karg-append=$arg" 94 kargs_list="${kargs_list} --karg-append=$arg"
93 done 95 done
94 96
95 ostree admin --sysroot=${PHYS_SYSROOT} deploy ${kargs_list} --os=${OSTREE_OSNAME} ${OSTREE_BRANCHNAME} 97 ostree admin --sysroot=${PHYS_SYSROOT} deploy ${kargs_list} --os=${OSTREE_OSNAME} ${ostree_target_hash}
96 98
97 # Copy deployment /home and /var/sota to sysroot 99 # Copy deployment /home and /var/sota to sysroot
98 HOME_TMP=`mktemp -d ${WORKDIR}/home-tmp-XXXXX` 100 HOME_TMP=`mktemp -d ${WORKDIR}/home-tmp-XXXXX`
diff --git a/classes/sota.bbclass b/classes/sota.bbclass
index f5a42c1..bbb9ac9 100644
--- a/classes/sota.bbclass
+++ b/classes/sota.bbclass
@@ -11,10 +11,10 @@ SOTA_CLIENT ??= "aktualizr"
11SOTA_CLIENT_PROV ??= "aktualizr-auto-prov" 11SOTA_CLIENT_PROV ??= "aktualizr-auto-prov"
12IMAGE_INSTALL_append_sota = " ostree os-release ${SOTA_CLIENT} ${SOTA_CLIENT_PROV}" 12IMAGE_INSTALL_append_sota = " ostree os-release ${SOTA_CLIENT} ${SOTA_CLIENT_PROV}"
13IMAGE_CLASSES += " image_types_ostree image_types_ota" 13IMAGE_CLASSES += " image_types_ostree image_types_ota"
14IMAGE_FSTYPES += "${@bb.utils.contains('DISTRO_FEATURES', 'sota', 'ostreepush garagesign otaimg wic', ' ', d)}" 14IMAGE_FSTYPES += "${@bb.utils.contains('DISTRO_FEATURES', 'sota', 'ostreepush garagesign garagecheck otaimg wic', ' ', d)}"
15 15
16PACKAGECONFIG_append_pn-curl = "${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', " ssl", " ", d)}" 16PACKAGECONFIG_append_pn-curl = " ssl"
17PACKAGECONFIG_remove_pn-curl = "${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', " gnutls", " ", d)}" 17PACKAGECONFIG_remove_pn-curl = "gnutls"
18 18
19WKS_FILE_sota ?= "sdimage-sota.wks" 19WKS_FILE_sota ?= "sdimage-sota.wks"
20 20
diff --git a/lib/oeqa/selftest/cases/qemucommand.py b/lib/oeqa/selftest/cases/qemucommand.py
new file mode 120000
index 0000000..075cdb8
--- /dev/null
+++ b/lib/oeqa/selftest/cases/qemucommand.py
@@ -0,0 +1 @@
../../../../scripts/qemucommand.py \ No newline at end of file
diff --git a/lib/oeqa/selftest/updater.py b/lib/oeqa/selftest/cases/updater.py
index ad99964..7d7bde7 100644
--- a/lib/oeqa/selftest/updater.py
+++ b/lib/oeqa/selftest/cases/updater.py
@@ -1,15 +1,15 @@
1import unittest
2import os 1import os
3import logging 2import logging
4import subprocess 3import subprocess
5import time 4import time
5import unittest
6 6
7from oeqa.selftest.base import oeSelfTest 7from oeqa.selftest.case import OESelftestTestCase
8from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars 8from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
9from oeqa.selftest.qemucommand import QemuCommand 9from qemucommand import QemuCommand
10 10
11 11
12class SotaToolsTests(oeSelfTest): 12class SotaToolsTests(OESelftestTestCase):
13 13
14 @classmethod 14 @classmethod
15 def setUpClass(cls): 15 def setUpClass(cls):
@@ -31,31 +31,22 @@ class SotaToolsTests(oeSelfTest):
31 result = runCmd('%s --help' % p, ignore_status=True) 31 result = runCmd('%s --help' % p, ignore_status=True)
32 self.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) 32 self.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output)
33 33
34 34 def test_garagesign_help(self):
35class GarageSignTests(oeSelfTest): 35 bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'aktualizr-native')
36
37 @classmethod
38 def setUpClass(cls):
39 logger = logging.getLogger("selftest")
40 logger.info('Running bitbake to build garage-sign-native')
41 bitbake('garage-sign-native')
42
43 def test_help(self):
44 bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'garage-sign-native')
45 p = bb_vars['SYSROOT_DESTDIR'] + bb_vars['bindir'] + "/" + "garage-sign" 36 p = bb_vars['SYSROOT_DESTDIR'] + bb_vars['bindir'] + "/" + "garage-sign"
46 self.assertTrue(os.path.isfile(p), msg = "No garage-sign found (%s)" % p) 37 self.assertTrue(os.path.isfile(p), msg = "No garage-sign found (%s)" % p)
47 result = runCmd('%s --help' % p, ignore_status=True) 38 result = runCmd('%s --help' % p, ignore_status=True)
48 self.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) 39 self.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output)
49 40
50 41
51class HsmTests(oeSelfTest): 42class HsmTests(OESelftestTestCase):
52 43
53 def test_hsm(self): 44 def test_hsm(self):
54 self.write_config('SOTA_CLIENT_FEATURES="hsm hsm-test"') 45 self.write_config('SOTA_CLIENT_FEATURES="hsm"')
55 bitbake('core-image-minimal') 46 bitbake('core-image-minimal')
56 47
57 48
58class GeneralTests(oeSelfTest): 49class GeneralTests(OESelftestTestCase):
59 50
60 def test_feature_sota(self): 51 def test_feature_sota(self):
61 result = get_bb_var('DISTRO_FEATURES').find('sota') 52 result = get_bb_var('DISTRO_FEATURES').find('sota')
@@ -114,53 +105,20 @@ class GeneralTests(oeSelfTest):
114 self.assertNotEqual(size1, size2, "Image sizes are identical; image was not rebuilt.") 105 self.assertNotEqual(size1, size2, "Image sizes are identical; image was not rebuilt.")
115 106
116 107
117class QemuTests(oeSelfTest): 108class QemuTests(OESelftestTestCase):
118 109
119 @classmethod 110 @classmethod
120 def setUpClass(cls): 111 def setUpClass(cls):
121 logger = logging.getLogger("selftest") 112 cls.qemu, cls.s = qemu_launch(machine='qemux86-64')
122 logger.info('Running bitbake to build core-image-minimal')
123 bitbake('core-image-minimal')
124 # Create empty object.
125 args = type('', (), {})()
126 args.imagename = 'core-image-minimal'
127 args.mac = None
128 # Could use DEPLOY_DIR_IMAGE here but it's already in the machine
129 # subdirectory.
130 args.dir = 'tmp/deploy/images'
131 args.efi = False
132 args.machine = None
133 args.kvm = None # Autodetect
134 args.no_gui = True
135 args.gdb = False
136 args.pcap = None
137 args.overlay = None
138 args.dry_run = False
139
140 cls.qemu = QemuCommand(args)
141 cmdline = cls.qemu.command_line()
142 print('Booting image with run-qemu-ota...')
143 cls.s = subprocess.Popen(cmdline)
144 time.sleep(10)
145 113
146 @classmethod 114 @classmethod
147 def tearDownClass(cls): 115 def tearDownClass(cls):
148 try: 116 qemu_terminate(cls.s)
149 cls.s.terminate()
150 except KeyboardInterrupt:
151 pass
152
153 def run_test_qemu(self, command):
154 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' +
155 str(self.qemu.ssh_port) + ' "' + command + '"']
156 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
157 value, err = s2.communicate()
158 return value, err
159 117
160 def test_hostname(self): 118 def test_hostname(self):
161 print('') 119 print('')
162 print('Checking machine name (hostname) of device:') 120 print('Checking machine name (hostname) of device:')
163 value, err = self.run_test_qemu('hostname') 121 value, err = qemu_send_command(self.qemu.ssh_port, 'hostname')
164 machine = get_bb_var('MACHINE', 'core-image-minimal') 122 machine = get_bb_var('MACHINE', 'core-image-minimal')
165 self.assertEqual(err, b'', 'Error: ' + err.decode()) 123 self.assertEqual(err, b'', 'Error: ' + err.decode())
166 # Strip off line ending. 124 # Strip off line ending.
@@ -172,8 +130,80 @@ class QemuTests(oeSelfTest):
172 def test_var_sota(self): 130 def test_var_sota(self):
173 print('') 131 print('')
174 print('Checking contents of /var/sota:') 132 print('Checking contents of /var/sota:')
175 value, err = self.run_test_qemu('ls /var/sota') 133 value, err = qemu_send_command(self.qemu.ssh_port, 'ls /var/sota')
176 self.assertEqual(err, b'', 'Error: ' + err.decode()) 134 self.assertEqual(err, b'', 'Error: ' + err.decode())
177 print(value.decode()) 135 print(value.decode())
178 136
179 137
138class GrubTests(OESelftestTestCase):
139
140 def setUpLocal(self):
141 # This is a bit of a hack but I can't see a better option.
142 path = os.path.abspath(os.path.dirname(__file__))
143 metadir = path + "/../../../../"
144 grub_config = 'OSTREE_BOOTLOADER = "grub"\nMACHINE = "intel-corei7-64"'
145 self.append_config(grub_config)
146 self.meta_intel = metadir + "meta-intel"
147 self.meta_minnow = metadir + "meta-updater-minnowboard"
148 runCmd('bitbake-layers add-layer "%s"' % self.meta_intel)
149 runCmd('bitbake-layers add-layer "%s"' % self.meta_minnow)
150 self.qemu, self.s = qemu_launch(efi=True, machine='intel-corei7-64')
151
152 def tearDownLocal(self):
153 qemu_terminate(self.s)
154 runCmd('bitbake-layers remove-layer "%s"' % self.meta_intel, ignore_status=True)
155 runCmd('bitbake-layers remove-layer "%s"' % self.meta_minnow, ignore_status=True)
156
157 def test_grub(self):
158 print('')
159 print('Checking machine name (hostname) of device:')
160 value, err = qemu_send_command(self.qemu.ssh_port, 'hostname')
161 machine = get_bb_var('MACHINE', 'core-image-minimal')
162 self.assertEqual(err, b'', 'Error: ' + err.decode())
163 # Strip off line ending.
164 value_str = value.decode()[:-1]
165 self.assertEqual(value_str, machine,
166 'MACHINE does not match hostname: ' + machine + ', ' + value_str)
167 print(value_str)
168
169
170def qemu_launch(efi=False, machine=None):
171 logger = logging.getLogger("selftest")
172 logger.info('Running bitbake to build core-image-minimal')
173 bitbake('core-image-minimal')
174 # Create empty object.
175 args = type('', (), {})()
176 args.imagename = 'core-image-minimal'
177 args.mac = None
178 # Could use DEPLOY_DIR_IMAGE here but it's already in the machine
179 # subdirectory.
180 args.dir = 'tmp/deploy/images'
181 args.efi = efi
182 args.machine = machine
183 args.kvm = None # Autodetect
184 args.no_gui = True
185 args.gdb = False
186 args.pcap = None
187 args.overlay = None
188 args.dry_run = False
189
190 qemu = QemuCommand(args)
191 cmdline = qemu.command_line()
192 print('Booting image with run-qemu-ota...')
193 s = subprocess.Popen(cmdline)
194 time.sleep(10)
195 return qemu, s
196
197def qemu_terminate(s):
198 try:
199 s.terminate()
200 except KeyboardInterrupt:
201 pass
202
203def qemu_send_command(port, command):
204 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' +
205 str(port) + ' "' + command + '"']
206 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
207 value, err = s2.communicate()
208 return value, err
209
diff --git a/lib/oeqa/selftest/qemucommand.py b/lib/oeqa/selftest/qemucommand.py
deleted file mode 120000
index bc06dde..0000000
--- a/lib/oeqa/selftest/qemucommand.py
+++ /dev/null
@@ -1 +0,0 @@
1../../../scripts/qemucommand.py \ No newline at end of file
diff --git a/recipes-sota/aktualizr/aktualizr-auto-prov.bb b/recipes-sota/aktualizr/aktualizr-auto-prov.bb
index 4f9fe4f..2190512 100644
--- a/recipes-sota/aktualizr/aktualizr-auto-prov.bb
+++ b/recipes-sota/aktualizr/aktualizr-auto-prov.bb
@@ -1,28 +1,24 @@
1SUMMARY = "Aktualizr systemd service and configurations" 1SUMMARY = "Aktualizr configuration for autoprovisioning"
2DESCRIPTION = "Systemd service and configurations for autoprovisioning Aktualizr, the SOTA Client application written in C++" 2DESCRIPTION = "Systemd service and configurations for autoprovisioning Aktualizr, the SOTA Client application written in C++"
3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr" 3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr"
4SECTION = "base" 4SECTION = "base"
5LICENSE = "MPL-2.0" 5LICENSE = "MPL-2.0"
6LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" 6LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=9741c346eef56131163e13b9db1241b3"
7DEPENDS = "zip-native" 7DEPENDS = "aktualizr-native zip-native"
8RDEPENDS_${PN} = "aktualizr" 8RDEPENDS_${PN} = "aktualizr"
9PV = "1.0" 9PV = "1.0"
10PR = "6" 10PR = "6"
11 11
12SRC_URI = " \ 12SRC_URI = " \
13 file://LICENSE \ 13 file://LICENSE \
14 file://aktualizr-manual-provision.service \
15 file://aktualizr-autoprovision.service \
16 file://sota_autoprov.toml \
17 " 14 "
18 15
19SYSTEMD_SERVICE_${PN} = "aktualizr.service" 16require environment.inc
20 17require credentials.inc
21inherit systemd
22 18
23export SOTA_PACKED_CREDENTIALS 19export SOTA_PACKED_CREDENTIALS
24 20
25do_install_append() { 21do_install() {
26 if [ -n "${SOTA_AUTOPROVISION_CREDENTIALS}" ]; then 22 if [ -n "${SOTA_AUTOPROVISION_CREDENTIALS}" ]; then
27 bbwarn "SOTA_AUTOPROVISION_CREDENTIALS are ignored. Please use SOTA_PACKED_CREDENTIALS" 23 bbwarn "SOTA_AUTOPROVISION_CREDENTIALS are ignored. Please use SOTA_PACKED_CREDENTIALS"
28 fi 24 fi
@@ -36,27 +32,24 @@ do_install_append() {
36 bbwarn "OSTREE_PUSH_CREDENTIALS is ignored. Please use SOTA_PACKED_CREDENTIALS" 32 bbwarn "OSTREE_PUSH_CREDENTIALS is ignored. Please use SOTA_PACKED_CREDENTIALS"
37 fi 33 fi
38 34
35 install -d ${D}${libdir}/sota
36 install -d ${D}${localstatedir}/sota
39 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then 37 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
40 install -d ${D}/${systemd_unitdir}/system 38 install -m 0644 ${STAGING_DIR_NATIVE}${libdir}/sota/sota_autoprov.toml ${D}${libdir}/sota/sota.toml
41 install -m 0644 ${WORKDIR}/aktualizr-autoprovision.service ${D}/${systemd_unitdir}/system/aktualizr.service 39
42 install -d ${D}${libdir}/sota 40 # deploy SOTA credentials
43 install -m "0644" ${WORKDIR}/sota_autoprov.toml ${D}${libdir}/sota/sota.toml 41 if [ -e ${SOTA_PACKED_CREDENTIALS} ]; then
44 42 cp ${SOTA_PACKED_CREDENTIALS} ${D}${localstatedir}/sota/sota_provisioning_credentials.zip
45 # deploy SOTA credentials 43 # Device should not be able to push data to treehub
46 if [ -e ${SOTA_PACKED_CREDENTIALS} ]; then 44 zip -d ${D}${localstatedir}/sota/sota_provisioning_credentials.zip treehub.json
47 mkdir -p ${D}/var/sota 45 fi
48 cp ${SOTA_PACKED_CREDENTIALS} ${D}/var/sota/sota_provisioning_credentials.zip
49 # Device should not be able to push data to treehub
50 zip -d ${D}/var/sota/sota_provisioning_credentials.zip treehub.json
51 fi
52 else
53 install -d ${D}/${systemd_unitdir}/system
54 install -m 0644 ${WORKDIR}/aktualizr-manual-provision.service ${D}/${systemd_unitdir}/system/aktualizr.service
55 fi 46 fi
56} 47}
57 48
58FILES_${PN} = " \ 49FILES_${PN} = " \
59 ${systemd_unitdir}/system/aktualizr.service \
60 ${libdir}/sota/sota.toml \ 50 ${libdir}/sota/sota.toml \
61 /var/sota/sota_provisioning_credentials.zip \ 51 ${localstatedir}/sota \
52 ${localstatedir}/sota/sota_provisioning_credentials.zip \
62 " 53 "
54
55# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/aktualizr/aktualizr-hsm-test-prov.bb b/recipes-sota/aktualizr/aktualizr-hsm-test-prov.bb
index c443c56..1e893fa 100644
--- a/recipes-sota/aktualizr/aktualizr-hsm-test-prov.bb
+++ b/recipes-sota/aktualizr/aktualizr-hsm-test-prov.bb
@@ -1,4 +1,4 @@
1SUMMARY = "Aktualizr systemd service and configuration with HSM support" 1SUMMARY = "Aktualizr configuration with HSM support"
2DESCRIPTION = "Systemd service and configurations for Aktualizr, the SOTA Client application written in C++" 2DESCRIPTION = "Systemd service and configurations for Aktualizr, the SOTA Client application written in C++"
3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr" 3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr"
4SECTION = "base" 4SECTION = "base"
@@ -10,25 +10,22 @@ RDEPENDS_${PN} = "aktualizr softhsm softhsm-testtoken"
10 10
11SRC_URI = " \ 11SRC_URI = " \
12 file://LICENSE \ 12 file://LICENSE \
13 file://aktualizr-autoprovision.service \
14 file://sota_hsm_test.toml \
15 " 13 "
16PV = "1.0" 14PV = "1.0"
17PR = "6" 15PR = "6"
18 16
19SYSTEMD_SERVICE_${PN} = "aktualizr.service"
20 17
21inherit systemd 18require environment.inc
19require credentials.inc
22 20
23do_install() { 21do_install() {
24 install -d ${D}/${systemd_unitdir}/system
25 install -m 0644 ${WORKDIR}/aktualizr-autoprovision.service ${D}/${systemd_unitdir}/system/aktualizr.service
26 install -d ${D}${libdir}/sota 22 install -d ${D}${libdir}/sota
27 aktualizr_implicit_writer -c ${SOTA_PACKED_CREDENTIALS} --no-root-ca \ 23 aktualizr_implicit_writer -c ${SOTA_PACKED_CREDENTIALS} --no-root-ca \
28 -i ${WORKDIR}/sota_hsm_test.toml -o ${D}${libdir}/sota/sota.toml -p ${D} 24 -i ${STAGING_DIR_NATIVE}${libdir}/sota/sota_hsm_test.toml -o ${D}${libdir}/sota/sota.toml -p ${D}
29} 25}
30 26
31FILES_${PN} = " \ 27FILES_${PN} = " \
32 ${systemd_unitdir}/system/aktualizr.service \
33 ${libdir}/sota/sota.toml \ 28 ${libdir}/sota/sota.toml \
34 " 29 "
30
31# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/aktualizr/aktualizr-implicit-prov.bb b/recipes-sota/aktualizr/aktualizr-implicit-prov.bb
index 21e38c9..b5bf420 100644
--- a/recipes-sota/aktualizr/aktualizr-implicit-prov.bb
+++ b/recipes-sota/aktualizr/aktualizr-implicit-prov.bb
@@ -1,4 +1,4 @@
1SUMMARY = "Aktualizr systemd service and configurations" 1SUMMARY = "Aktualizr configuration for implicit provisioning"
2DESCRIPTION = "Systemd service and configurations for implicitly provisioning Aktualizr, the SOTA Client application written in C++" 2DESCRIPTION = "Systemd service and configurations for implicitly provisioning Aktualizr, the SOTA Client application written in C++"
3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr" 3HOMEPAGE = "https://github.com/advancedtelematic/aktualizr"
4SECTION = "base" 4SECTION = "base"
@@ -11,24 +11,23 @@ PR = "1"
11 11
12SRC_URI = " \ 12SRC_URI = " \
13 file://LICENSE \ 13 file://LICENSE \
14 file://aktualizr-autoprovision.service \
15 file://sota_implicit_prov.toml \
16 " 14 "
17 15
18SYSTEMD_SERVICE_${PN} = "aktualizr.service"
19 16
20inherit systemd 17require environment.inc
18require credentials.inc
21 19
22do_install() { 20do_install() {
23 install -d ${D}/${systemd_unitdir}/system
24 install -m 0644 ${WORKDIR}/aktualizr-autoprovision.service ${D}/${systemd_unitdir}/system/aktualizr.service
25 install -d ${D}${libdir}/sota 21 install -d ${D}${libdir}/sota
26 aktualizr_implicit_writer -c ${SOTA_PACKED_CREDENTIALS} \ 22 if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then
27 -i ${WORKDIR}/sota_implicit_prov.toml -o ${D}${libdir}/sota/sota.toml -p ${D} 23 aktualizr_implicit_writer -c ${SOTA_PACKED_CREDENTIALS} \
24 -i ${STAGING_DIR_NATIVE}${libdir}/sota/sota_implicit_prov.toml -o ${D}${libdir}/sota/sota.toml -p ${D}
25 fi
28} 26}
29 27
30FILES_${PN} = " \ 28FILES_${PN} = " \
31 ${systemd_unitdir}/system/aktualizr.service \
32 ${libdir}/sota/sota.toml \ 29 ${libdir}/sota/sota.toml \
33 ${libdir}/sota/root.crt \ 30 ${libdir}/sota/root.crt \
34 " 31 "
32
33# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/aktualizr/aktualizr_git.bb b/recipes-sota/aktualizr/aktualizr_git.bb
index 162065e..48ed652 100644
--- a/recipes-sota/aktualizr/aktualizr_git.bb
+++ b/recipes-sota/aktualizr/aktualizr_git.bb
@@ -11,41 +11,69 @@ DEPENDS_append_class-native = "glib-2.0-native "
11 11
12RDEPENDS_${PN}_class-target = "lshw " 12RDEPENDS_${PN}_class-target = "lshw "
13RDEPENDS_${PN}_append_class-target = "${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', ' engine-pkcs11', '', d)} " 13RDEPENDS_${PN}_append_class-target = "${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', ' engine-pkcs11', '', d)} "
14RDEPENDS_${PN}_append_class-target = " ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', ' slcand-start', '', d)} "
14 15
15PV = "1.0+git${SRCPV}" 16PV = "1.0+git${SRCPV}"
16PR = "7" 17PR = "7"
17 18
18SRC_URI = " \ 19SRC_URI = " \
19 git://github.com/advancedtelematic/aktualizr;branch=${BRANCH} \ 20 gitsm://github.com/advancedtelematic/aktualizr;branch=${BRANCH} \
21 file://aktualizr.service \
22 file://aktualizr-serialcan.service \
20 " 23 "
21SRCREV = "f043191ae622a96cf2f4d48f9073d5cfa9f16e3f" 24SRCREV = "e53f2a5747bba3e4f40609aa27f3d89e80c2d784"
22BRANCH ?= "master" 25BRANCH ?= "master"
23 26
24S = "${WORKDIR}/git" 27S = "${WORKDIR}/git"
25 28
26inherit cmake 29inherit cmake
27 30
31inherit systemd
32SYSTEMD_SERVICE_${PN} = "aktualizr.service"
33
28BBCLASSEXTEND =+ "native" 34BBCLASSEXTEND =+ "native"
29 35
30EXTRA_OECMAKE = "-DWARNING_AS_ERROR=OFF -DCMAKE_BUILD_TYPE=Release -DAKTUALIZR_VERSION=${PV} " 36EXTRA_OECMAKE = "-DWARNING_AS_ERROR=OFF -DCMAKE_BUILD_TYPE=Release -DAKTUALIZR_VERSION=${PV} "
31EXTRA_OECMAKE_append_class-target = "-DBUILD_OSTREE=ON ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', '-DBUILD_P11=ON', '', d)} " 37EXTRA_OECMAKE_append_class-target = " -DBUILD_OSTREE=ON -DBUILD_ISOTP=ON ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'hsm', '-DBUILD_P11=ON', '', d)} "
32EXTRA_OECMAKE_append_class-native = "-DBUILD_SOTA_TOOLS=ON -DBUILD_OSTREE=OFF " 38EXTRA_OECMAKE_append_class-native = " -DBUILD_SOTA_TOOLS=ON -DBUILD_OSTREE=OFF "
33 39
34do_install_append () { 40do_install_append () {
35 rm -f ${D}${bindir}/aktualizr_cert_provider 41 rm -f ${D}${bindir}/aktualizr_cert_provider
36} 42}
37do_install_append_class-target () { 43do_install_append_class-target () {
38 rm -f ${D}${bindir}/aktualizr_implicit_writer 44 rm -f ${D}${bindir}/aktualizr_implicit_writer
45 ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'secondary-example', '', 'rm -f ${D}${bindir}/example-interface', d)}
46 ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'secondary-isotp-example', '', 'rm -f ${D}${bindir}/isotp-test-interface', d)}
47
48 install -d ${D}${systemd_unitdir}/system
49 aktualizr_service=${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', '${WORKDIR}/aktualizr-serialcan.service', '${WORKDIR}/aktualizr.service', d)}
50 install -m 0644 ${aktualizr_service} ${D}${systemd_unitdir}/system/aktualizr.service
39} 51}
40do_install_append_class-native () { 52do_install_append_class-native () {
41 rm -f ${D}${bindir}/aktualizr 53 rm -f ${D}${bindir}/aktualizr
54 rm -f ${D}${bindir}/aktualizr-info
55 rm -f ${D}${bindir}/example-interface
56 install -d ${D}${libdir}/sota
57 install -m 0644 ${S}/config/sota_autoprov.toml ${D}/${libdir}/sota/sota_autoprov.toml
58 install -m 0644 ${S}/config/sota_hsm_test.toml ${D}/${libdir}/sota/sota_hsm_test.toml
59 install -m 0644 ${S}/config/sota_implicit_prov.toml ${D}/${libdir}/sota/sota_implicit_prov.toml
60
61 install -m 0755 ${B}/src/sota_tools/garage-sign-prefix/src/garage-sign/bin/* ${D}${bindir}
62 install -m 0644 ${B}/src/sota_tools/garage-sign-prefix/src/garage-sign/lib/* ${D}${libdir}
42} 63}
43 64
44FILES_${PN}_class-target = " \ 65FILES_${PN}_class-target = " \
45 ${bindir}/aktualizr \ 66 ${bindir}/aktualizr \
67 ${bindir}/aktualizr-info \
68 ${systemd_unitdir}/system/aktualizr.service \
46 " 69 "
70FILES_${PN}_append_class-target = " ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'secondary-example', ' ${bindir}/example-interface', '', d)} "
71FILES_${PN}_append_class-target = " ${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'secondary-isotp-example', ' ${bindir}/isotp-test-interface', '', d)} "
47FILES_${PN}_class-native = " \ 72FILES_${PN}_class-native = " \
48 ${bindir}/aktualizr_implicit_writer \ 73 ${bindir}/aktualizr_implicit_writer \
49 ${bindir}/garage-deploy \ 74 ${bindir}/garage-deploy \
50 ${bindir}/garage-push \ 75 ${bindir}/garage-push \
76 ${libdir}/sota/* \
51 " 77 "
78
79# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/recipes-sota/aktualizr/credentials.inc b/recipes-sota/aktualizr/credentials.inc
new file mode 100644
index 0000000..256c8ff
--- /dev/null
+++ b/recipes-sota/aktualizr/credentials.inc
@@ -0,0 +1 @@
SRC_URI_append = "${@('file://' + d.getVar('SOTA_PACKED_CREDENTIALS', True)) if d.getVar('SOTA_PACKED_CREDENTIALS', True) else ''}"
diff --git a/recipes-sota/aktualizr/environment.inc b/recipes-sota/aktualizr/environment.inc
new file mode 100644
index 0000000..cba77e7
--- /dev/null
+++ b/recipes-sota/aktualizr/environment.inc
@@ -0,0 +1,17 @@
1export SOTA_LEGACY_SECONDARY_INTERFACE
2export SOTA_VIRTUAL_SECONDARIES
3
4do_install_append() {
5 if [ -n "${SOTA_LEGACY_SECONDARY_INTERFACE}" ]; then
6 AKTUALIZR_PARAMETERS_LEGACYSEC="--legacy-interface ${SOTA_LEGACY_SECONDARY_INTERFACE}";
7 fi
8
9 AKTUALIZR_PARAMETERS_CONFIGFILE="--config /usr/lib/sota/sota.toml"
10 for sec in ${SOTA_VIRTUAL_SECONDARIES}; do
11 AKTUALIZR_PARAMETERS_VIRTUALSECS="${AKTUALIZR_PARAMETERS_VIRTUALSECS} --secondary-config $sec"
12 done
13
14 echo "AKTUALIZR_CMDLINE_PARAMETERS=${AKTUALIZR_PARAMETERS_CONFIGFILE} ${AKTUALIZR_PARAMETERS_LEGACYSEC} ${AKTUALIZR_PARAMETERS_VIRTUALSECS}" > ${D}${libdir}/sota/sota.env
15}
16
17FILES_${PN}_append = " ${libdir}/sota/sota.env"
diff --git a/recipes-sota/aktualizr/files/aktualizr-manual-provision.service b/recipes-sota/aktualizr/files/aktualizr-manual-provision.service
deleted file mode 100644
index a70f2f9..0000000
--- a/recipes-sota/aktualizr/files/aktualizr-manual-provision.service
+++ /dev/null
@@ -1,13 +0,0 @@
1[Unit]
2Description=Aktualizr SOTA Client
3Wants=network-online.target
4After=network.target network-online.target
5Requires=network-online.target
6
7[Service]
8RestartSec=10
9Restart=always
10ExecStart=/usr/bin/aktualizr --config /sysroot/boot/sota.toml --loglevel 2
11
12[Install]
13WantedBy=multi-user.target
diff --git a/recipes-sota/aktualizr/files/aktualizr-serialcan.service b/recipes-sota/aktualizr/files/aktualizr-serialcan.service
new file mode 100644
index 0000000..b42f348
--- /dev/null
+++ b/recipes-sota/aktualizr/files/aktualizr-serialcan.service
@@ -0,0 +1,15 @@
1[Unit]
2Description=Aktualizr SOTA Client
3Wants=network-online.target slcand@ttyACM0.service
4After=network.target network-online.target slcand@ttyACM0.service
5
6Requires=network-online.target
7
8[Service]
9RestartSec=10
10Restart=always
11EnvironmentFile=/usr/lib/sota/sota.env
12ExecStart=/bin/sh -c "(ip addr | grep can0) && /usr/bin/aktualizr $AKTUALIZR_CMDLINE_PARAMETERS"
13
14[Install]
15WantedBy=multi-user.target
diff --git a/recipes-sota/aktualizr/files/aktualizr-autoprovision.service b/recipes-sota/aktualizr/files/aktualizr.service
index 8cb8d78..b6df9d7 100644
--- a/recipes-sota/aktualizr/files/aktualizr-autoprovision.service
+++ b/recipes-sota/aktualizr/files/aktualizr.service
@@ -7,7 +7,8 @@ Requires=network-online.target
7[Service] 7[Service]
8RestartSec=10 8RestartSec=10
9Restart=always 9Restart=always
10ExecStart=/usr/bin/aktualizr --config /usr/lib/sota/sota.toml 10EnvironmentFile=/usr/lib/sota/sota.env
11ExecStart=/usr/bin/aktualizr $AKTUALIZR_CMDLINE_PARAMETERS
11 12
12[Install] 13[Install]
13WantedBy=multi-user.target 14WantedBy=multi-user.target
diff --git a/recipes-sota/aktualizr/files/sota_autoprov.toml b/recipes-sota/aktualizr/files/sota_autoprov.toml
deleted file mode 100644
index 9fbb093..0000000
--- a/recipes-sota/aktualizr/files/sota_autoprov.toml
+++ /dev/null
@@ -1,14 +0,0 @@
1[tls]
2certificates_directory = "/var/sota/"
3ca_file = "root.crt"
4client_certificate = "client.pem"
5pkey_file = "pkey.pem"
6
7[uptane]
8metadata_path = "/var/sota/metadata"
9private_key_path = "ecukey.der"
10public_key_path = "ecukey.pub"
11
12[provision]
13provision_path = "/var/sota/sota_provisioning_credentials.zip"
14
diff --git a/recipes-sota/aktualizr/files/sota_hsm_test.toml b/recipes-sota/aktualizr/files/sota_hsm_test.toml
deleted file mode 100644
index 28aefc2..0000000
--- a/recipes-sota/aktualizr/files/sota_hsm_test.toml
+++ /dev/null
@@ -1,18 +0,0 @@
1[tls]
2certificates_directory = "/var/sota/"
3ca_file = "/var/sota/token/root.crt"
4client_certificate = "01"
5cert_source = "pkcs11"
6pkey_file = "02"
7pkey_source = "pkcs11"
8
9[p11]
10module = "/usr/lib/softhsm/libsofthsm2.so"
11pass = "1234"
12
13[uptane]
14metadata_path = "/var/sota/metadata"
15key_source = "pkcs11"
16private_key_path = "03"
17public_key_path = "03"
18
diff --git a/recipes-sota/aktualizr/files/sota_implicit_prov.toml b/recipes-sota/aktualizr/files/sota_implicit_prov.toml
deleted file mode 100644
index 756c868..0000000
--- a/recipes-sota/aktualizr/files/sota_implicit_prov.toml
+++ /dev/null
@@ -1,11 +0,0 @@
1[tls]
2certificates_directory = "/var/sota/"
3ca_file = "/usr/lib/sota/root.crt"
4client_certificate = "client.pem"
5pkey_file = "pkey.pem"
6
7[uptane]
8metadata_path = "/var/sota/metadata"
9private_key_path = "ecukey.der"
10public_key_path = "ecukey.pub"
11
diff --git a/recipes-sota/garage-sign/garage-sign.bb b/recipes-sota/garage-sign/garage-sign.bb
deleted file mode 100644
index d5388bc..0000000
--- a/recipes-sota/garage-sign/garage-sign.bb
+++ /dev/null
@@ -1,34 +0,0 @@
1SUMMARY = "garage-sign"
2DESCRIPTION = "Metadata signing tool for ATS Garage"
3HOMEPAGE = "https://ats-tuf-cli-releases.s3-eu-central-1.amazonaws.com/index.html"
4SECTION = "base"
5LICENSE = "CLOSED"
6LIC_FILES_CHKSUM = "file://${S}/docs/LICENSE;md5=3025e77db7bd3f1d616b3ffd11d54c94"
7DEPENDS = ""
8
9PV = "0.2.0-35-g0544c33"
10
11SRC_URI = " \
12 https://ats-tuf-cli-releases.s3-eu-central-1.amazonaws.com/cli-${PV}.tgz \
13 "
14
15SRC_URI[md5sum] = "1546e06d1e747f67aee5ed7096bf1c74"
16SRC_URI[sha256sum] = "1432348bca8ca5ad75df1218f348f480d429d7509d6454deb6e16ff31c5e08fc"
17
18S = "${WORKDIR}/${BPN}"
19
20BBCLASSEXTEND =+ "native"
21
22do_install() {
23 install -d ${D}${bindir}
24 install -m "0755" -t ${D}${bindir} ${S}/bin/*
25 install -d ${D}${libdir}
26 install -m "0644" -t ${D}${libdir} ${S}/lib/*
27}
28
29FILES_${PN} = " \
30 /usr/bin \
31 /usr/bin/garage-sign.bat \
32 /usr/bin/garage-sign \
33 /usr/lib/* \
34 "
diff --git a/recipes-sota/ostree/ostree_git.bb b/recipes-sota/ostree/ostree_git.bb
index 724976a..ad85775 100644
--- a/recipes-sota/ostree/ostree_git.bb
+++ b/recipes-sota/ostree/ostree_git.bb
@@ -8,22 +8,23 @@ INHERIT_remove_class-native = "systemd"
8 8
9SRC_URI = "gitsm://github.com/ostreedev/ostree.git;branch=master" 9SRC_URI = "gitsm://github.com/ostreedev/ostree.git;branch=master"
10 10
11SRCREV="ae61321046ad7f4148a5884c8c6c8b2594ff840e" 11SRCREV="854a823e05d6fe8b610c02c2a71eaeb2bf1e98a6"
12 12
13PV = "v2017.13" 13PV = "v2017.13"
14PR = "1"
14 15
15S = "${WORKDIR}/git" 16S = "${WORKDIR}/git"
16 17
17BBCLASSEXTEND = "native" 18BBCLASSEXTEND = "native"
18 19
19DEPENDS += "attr libarchive glib-2.0 pkgconfig gpgme libgsystem fuse libsoup-2.4 e2fsprogs gtk-doc-native curl xz" 20DEPENDS += "attr libarchive glib-2.0 pkgconfig gpgme libgsystem fuse e2fsprogs gtk-doc-native curl xz"
20DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}" 21DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}"
21DEPENDS_remove_class-native = "systemd-native" 22DEPENDS_remove_class-native = "systemd-native"
22 23
23RDEPENDS_${PN} = "python util-linux-libuuid util-linux-libblkid util-linux-libmount libcap bash" 24RDEPENDS_${PN} = "python util-linux-libuuid util-linux-libblkid util-linux-libmount libcap bash"
24RDEPENDS_${PN}_remove_class-native = "python-native" 25RDEPENDS_${PN}_remove_class-native = "python-native"
25 26
26EXTRA_OECONF = "--with-libarchive --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf --disable-man --with-smack --with-builtin-grub2-mkconfig --with-curl" 27EXTRA_OECONF = "CFLAGS='-Wno-error=missing-prototypes' --with-libarchive --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf --disable-man --with-smack --with-builtin-grub2-mkconfig --with-curl --without-soup"
27EXTRA_OECONF_append_class-native = " --enable-wrpseudo-compat" 28EXTRA_OECONF_append_class-native = " --enable-wrpseudo-compat"
28 29
29# Path to ${prefix}/lib/ostree/ostree-grub-generator is hardcoded on the 30# Path to ${prefix}/lib/ostree/ostree-grub-generator is hardcoded on the
diff --git a/recipes-support/ca-certificates/ca-certificates_%.bbappend b/recipes-support/ca-certificates/ca-certificates_%.bbappend
index afaadfd..cc95a68 100644
--- a/recipes-support/ca-certificates/ca-certificates_%.bbappend
+++ b/recipes-support/ca-certificates/ca-certificates_%.bbappend
@@ -1 +1 @@
SYSROOT_DIRS += "/etc" SYSROOT_DIRS += "${sysconfdir}"
diff --git a/recipes-support/glib-networking/glib-networking_%.bbappend b/recipes-support/glib-networking/glib-networking_%.bbappend
deleted file mode 100644
index 22e6f05..0000000
--- a/recipes-support/glib-networking/glib-networking_%.bbappend
+++ /dev/null
@@ -1,8 +0,0 @@
1BBCLASSEXTEND_append_sota = " native nativesdk"
2
3# Hackery to prevent relocatable_native_pcfiles from crashing
4do_install_append_class-native () {
5 if [ -d ${D}${libdir}/pkgconfig ]; then
6 rmdir ${D}${libdir}/pkgconfig
7 fi
8}
diff --git a/recipes-support/libsoup/libsoup-2.4_%.bbappend b/recipes-support/libsoup/libsoup-2.4_%.bbappend
deleted file mode 100644
index 18383f1..0000000
--- a/recipes-support/libsoup/libsoup-2.4_%.bbappend
+++ /dev/null
@@ -1,3 +0,0 @@
1BBCLASSEXTEND_append_sota = " native nativesdk"
2
3DEPENDS_append_class-native = "${@bb.utils.contains('DISTRO_FEATURES', 'sota', ' glib-networking-native', ' ', d)}"
diff --git a/recipes-support/slcand-start/files/slcand@.service b/recipes-support/slcand-start/files/slcand@.service
new file mode 100644
index 0000000..c539568
--- /dev/null
+++ b/recipes-support/slcand-start/files/slcand@.service
@@ -0,0 +1,8 @@
1[Unit]
2Description=Serial CAN daemon (can-utils)
3
4[Service]
5Type=forking
6ExecStart=/usr/bin/slcand -o -c -s4 %I can0
7ExecStartPost=/bin/sh -c '/bin/sleep 3; /sbin/ip link set can0 up'
8
diff --git a/recipes-support/slcand-start/slcand-start.bb b/recipes-support/slcand-start/slcand-start.bb
new file mode 100644
index 0000000..dfefaea
--- /dev/null
+++ b/recipes-support/slcand-start/slcand-start.bb
@@ -0,0 +1,21 @@
1SUMMARY = "Mock smartcard for aktualizr"
2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \
4 file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
5
6
7inherit systemd
8
9RDEPENDS_${PN} = "can-utils"
10
11SRC_URI = "file://slcand@.service"
12
13SYSTEMD_SERVICE_${PN} = "slcand@.service"
14
15do_install() {
16 install -d ${D}${systemd_unitdir}/system
17 install -m 0644 ${WORKDIR}/slcand@.service ${D}${systemd_unitdir}/system/slcand@.service
18}
19
20FILES_${PN} = "${systemd_unitdir}/system/createtoken.service"
21
diff --git a/scripts/qemucommand.py b/scripts/qemucommand.py
index 82a9540..9a893d8 100644
--- a/scripts/qemucommand.py
+++ b/scripts/qemucommand.py
@@ -46,7 +46,7 @@ class QemuCommand(object):
46 if len(machines) == 1: 46 if len(machines) == 1:
47 self.machine = machines[0] 47 self.machine = machines[0]
48 else: 48 else:
49 raise ValueError("Could not autodetect machine type from %s" % args.dir) 49 raise ValueError("Could not autodetect machine type. More than one entry in %s. Maybe --machine qemux86-64?" % args.dir)
50 if args.efi: 50 if args.efi:
51 self.bios = 'OVMF.fd' 51 self.bios = 'OVMF.fd'
52 else: 52 else:
@@ -118,10 +118,9 @@ class QemuCommand(object):
118 118
119 def img_command_line(self): 119 def img_command_line(self):
120 cmdline = [ 120 cmdline = [
121 "qemu-img", "create", 121 "qemu-img", "create",
122 "-o", "backing_file=%s" % self.image, 122 "-o", "backing_file=%s" % self.image,
123 "-f", "qcow2", 123 "-f", "qcow2",
124 self.overlay] 124 self.overlay]
125 return cmdline 125 return cmdline
126 126
127