summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-sota/README.md107
-rw-r--r--meta-sota/classes/image_types_ostree.bbclass19
-rw-r--r--meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb80
-rw-r--r--meta-sota/recipes-sota/sota-tools/sota-tools_git.bb24
4 files changed, 196 insertions, 34 deletions
diff --git a/meta-sota/README.md b/meta-sota/README.md
new file mode 100644
index 0000000..0e47cf6
--- /dev/null
+++ b/meta-sota/README.md
@@ -0,0 +1,107 @@
+meta-sota
+=========
+
+This layer enables over-the-air updates with OSTree and RVI SOTA client.
+
+[OSTree](https://github.com/ostreedev/ostree) is a tool for atomic full file
+system upgrades with rollback capability. Main advantage of OSTree compared
+to traditional dual partition model is that OSTree minimizes network bandwidth
+and data storage footprint by sharing files with the same contents across file
+system deployments.
+
+[RVI SOTA client](https://github.com/advancedtelematic/rvi_sota_client) adds
+authentication and provisioning capabilities to OTA and is integrated with
+OSTree.
+
+Build
+-----
+
+With AGL you can just add agl-sota feature while configuring your build
+environment as in
+
+ source meta-agl/scripts/aglsetup.sh -m porter agl-demo agl-appfw-smack agl-devel agl-sota
+
+you can then just run
+
+ bitbake agl-demo-platform
+
+and get as a result "ostree_repo" folder in your images directory
+(tmp/deploy/images/${MACHINE}/ostree_repo) containing your OSTree repository
+with rootfs committed as an OSTree deployment, 'otaimg' bootstrap image which
+is an OSTree physical sysroot as a burnable filesystem image and optionally
+some machine-dependent live images (e.g. '*.rpi-sdimg-ota' for Raspberry Pi or
+'*.porter-sdimg-ota' Renesas Porter board).
+
+Although aglsetup.sh hooks provide reasonable defaults for SOTA-related
+variables you may want to tune some of them.
+
+SOTA-related variables in local.conf
+------------------------------------
+
+* OSTREE_REPO - path to your OSTree repository.
+ Defaults to "${DEPLOY_DIR_IMAGE}/ostree_repo"
+* OSTREE_BRANCHNAME - the branch your rootfs will be committed to.
+ Defaults to "agl-ota"
+* OSTREE_OSNAME - OS deployment name on your target device. For more
+ information about deployments and osnames see
+ [OSTree documentation](https://ostree.readthedocs.io/en/latest/manual/deployment/)
+ Defaults to "agl".
+* 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 proxy.
+* OSTREE_REMOTE_URL - when set adds pushing your ostree commit to a remote
+ repo. Defaults to an empty string.
+* OSTREE_REMOTE_USER and OSTREE_REMOTE_PASSWORD - should be set if
+ OSTREE_REMOTE_URL is set. Used to authenticate to the server set in
+ OSTREE_REMOTE_URL. Both default to an empty string.
+
+Usage
+-----
+
+### OSTree ###
+OSTree includes its own simple http server. It just exposes the whole OSTree
+repository to the network so that any remote device can pull data from it to
+device's local repository. To use OSTree http server you need OSTree installed
+on your build machine. Alternatively, you could run version built inside Yocto
+using bitbake's [devshell](http://www.openembedded.org/wiki/Devshell).
+
+To expose your repo run ostree trivial-httpd using any free port.
+
+ ostree trivial-httpd tmp/deploy/images/qemux86-64/ostree_repo -P 57556
+
+You can then run from inside your device or QEMU emulation, provided your
+network is set up correctly.
+
+ # agl-remote identifies the remote server in your local repo
+ ostree remote add --no-gpg-verify agl-remote http://192.168.7.1:57556 agl-ota
+
+ # agl-ota is a branch name in the remote repo, set in OSTREE_BRANCHNAME
+ ostree pull agl-remote agl-ota
+
+ # agl is OS name as set in OSTREE_OSNAME
+ ostree admin deploy --os=agl agl-remote:agl-ota
+
+After restart you should boot into the newly deployed OS image.
+
+E.g. for the raspberrypi3 you can try this sequence:
+
+ # add remote
+ ostree remote add --no-gpg-verify agl-snapshot https://download.automotivelinux.org/AGL/snapshots/master/latest/raspberrypi3/deploy/images/raspberrypi3/ostree_repo/ agl-ota
+
+ # pull
+ ostree pull agl-snapshot agl-ota
+
+ # deploy
+ ostree admin deploy --os=agl agl-snapshot:agl-ota
+
+### SOTA tools ###
+SOTA tools now contains only one tool, garage-push that lets you push the
+changes in OSTree repository generated by bitbake process. It communicates with
+an http server capable of querying files with HEAD requests and uploading them
+with POST requests. garage-push is used as following:
+
+ garage-push --repo=/path/to/ostree-repo --ref=mybranch --url=https://my.ostree.server/ --user=username --password=password
+
+You can set OSTREE_REMOTE_URL, OSTREE_REMOTE_USER and OSTREE_REMOTE_PASSWORD in
+your local.conf to make your build results be automatically synchronized with a
+remote server.
diff --git a/meta-sota/classes/image_types_ostree.bbclass b/meta-sota/classes/image_types_ostree.bbclass
index fcba6d9..453692e 100644
--- a/meta-sota/classes/image_types_ostree.bbclass
+++ b/meta-sota/classes/image_types_ostree.bbclass
@@ -124,3 +124,22 @@ IMAGE_CMD_ostree () {
rm -rf ${OSTREE_ROOTFS}
}
+IMAGE_TYPEDEP_ostreepush = "ostree"
+IMAGE_DEPENDS_ostreepush = "sota-tools-native:do_populate_sysroot"
+IMAGE_CMD_ostreepush () {
+ if [ ${OSTREE_REMOTE_URL} ]; then
+ if [ -z ${OSTREE_REMOTE_USER} ]; then
+ bberror "OSTREE_REMOTE_PASSWORD isn't set"
+ fi
+
+ if [ -z ${OSTREE_REMOTE_PASSWORD} ]; then
+ bberror "OSTREE_REMOTE_PASSWORD isn't set"
+ fi
+
+ garage-push --repo=${OSTREE_REPO} \
+ --ref=${OSTREE_BRANCHNAME} \
+ --url=${OSTREE_REMOTE_URL} \
+ --user=${OSTREE_REMOTE_USER} \
+ --password=${OSTREE_REMOTE_PASSWORD}
+ fi
+}
diff --git a/meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb b/meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb
index c6cb0bb..20c32cd 100644
--- a/meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb
+++ b/meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb
@@ -2,16 +2,17 @@ DESCRIPTION = "sota-client rust recipe"
HOMEPAGE = "https://github.com/advancedtelematic/rvi_sota_client"
LICENSE = "MPL-2.0"
-
LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea"
inherit cargo systemd
S = "${WORKDIR}/git"
-SRCREV = "484e98981f5ddbf61a9e4ca6190c9f2c2fcdec4c"
-PV = "0.2.17.5.g484e989"
-PR = "${SRCPV}"
+SRCREV = "63437b6978bc1c2e3d6a9a5914fe165fdd2a0f5f"
+
+# Generate with:
+# git describe --tags | cut -b2-
+PV = "0.2.20-2-g63437b6"
BBCLASSEXTEND = "native"
@@ -24,80 +25,78 @@ FILES_${PN} = " \
"
SRC_URI = " \
-crate://crates.io/aho-corasick/0.5.2 \
+crate://crates.io/aho-corasick/0.5.3 \
crate://crates.io/time/0.1.35 \
-crate://crates.io/url/1.1.1 \
+crate://crates.io/url/1.2.1 \
crate://crates.io/ws2_32-sys/0.2.1 \
crate://crates.io/hyper/0.9.4 \
crate://crates.io/log/0.3.6 \
crate://crates.io/unicase/1.4.0 \
-crate://crates.io/bitflags/0.5.0 \
+crate://crates.io/bitflags/0.7.0 \
crate://crates.io/bit-set/0.2.0 \
-crate://crates.io/lazy_static/0.1.16 \
+crate://crates.io/lazy_static/0.2.1 \
crate://crates.io/rust-crypto/0.2.36 \
crate://crates.io/typeable/0.1.2 \
crate://crates.io/pkg-config/0.3.8 \
crate://crates.io/httparse/1.1.2 \
-crate://crates.io/openssl/0.7.13 \
+crate://crates.io/openssl/0.8.3 \
crate://crates.io/user32-sys/0.2.0 \
-crate://crates.io/regex/0.1.71 \
+crate://crates.io/regex/0.1.77 \
crate://crates.io/unicode-normalization/0.1.2 \
crate://crates.io/idna/0.1.0 \
crate://crates.io/unicode-bidi/0.2.3 \
crate://crates.io/rand/0.3.14 \
-crate://crates.io/gcc/0.3.28 \
+crate://crates.io/gcc/0.3.37 \
crate://crates.io/chan/0.1.18 \
crate://crates.io/kernel32-sys/0.2.2 \
-crate://crates.io/winapi/0.2.7 \
-crate://crates.io/crossbeam/0.2.9 \
+crate://crates.io/winapi/0.2.8 \
+crate://crates.io/crossbeam/0.2.10 \
crate://crates.io/bitflags/0.4.0 \
crate://crates.io/thread-id/2.0.0 \
-crate://crates.io/mime/0.2.1 \
-crate://crates.io/thread_local/0.2.6 \
+crate://crates.io/mime/0.2.2 \
+crate://crates.io/thread_local/0.2.7 \
crate://crates.io/utf8-ranges/0.1.3 \
-crate://crates.io/net2/0.2.23 \
-crate://crates.io/dbus/0.3.3 \
+crate://crates.io/net2/0.2.26 \
+crate://crates.io/dbus/0.4.1 \
crate://crates.io/winapi-build/0.1.1 \
-crate://crates.io/chan-signal/0.1.6 \
+crate://crates.io/chan-signal/0.1.7 \
crate://crates.io/bit-vec/0.4.3 \
-crate://crates.io/toml/0.1.30 \
+crate://crates.io/toml/0.2.1 \
crate://crates.io/quick-error/0.2.2 \
-crate://crates.io/ws/0.5.0 \
+crate://crates.io/ws/0.5.3 \
crate://crates.io/traitobject/0.0.1 \
crate://crates.io/cfg-if/0.1.0 \
-crate://crates.io/matches/0.1.2 \
+crate://crates.io/matches/0.1.3 \
crate://crates.io/getopts/0.2.14 \
-crate://crates.io/sha1/0.1.1 \
-crate://crates.io/openssl-sys/0.7.13 \
+crate://crates.io/sha1/0.2.0 \
+crate://crates.io/openssl-sys/0.7.17 \
crate://crates.io/cookie/0.2.5 \
crate://crates.io/libressl-pnacl-sys/2.1.6 \
-crate://crates.io/lazy_static/0.2.1 \
crate://crates.io/language-tags/0.2.2 \
crate://crates.io/semver/0.1.20 \
crate://crates.io/unix_socket/0.5.0 \
crate://crates.io/memchr/0.1.11 \
crate://crates.io/gdi32-sys/0.2.0 \
-crate://crates.io/nom/1.2.3 \
+crate://crates.io/nom/1.2.4 \
crate://crates.io/mio/0.5.1 \
-crate://crates.io/tempdir/0.3.4 \
-crate://crates.io/miow/0.1.2 \
+crate://crates.io/tempdir/0.3.5 \
+crate://crates.io/miow/0.1.3 \
crate://crates.io/pnacl-build-helper/1.4.10 \
-crate://crates.io/libc/0.2.12 \
+crate://crates.io/libc/0.2.17 \
crate://crates.io/nix/0.5.1 \
-crate://crates.io/byteorder/0.5.3 \
crate://crates.io/rustc_version/0.1.7 \
crate://crates.io/slab/0.1.3 \
crate://crates.io/rustc-serialize/0.3.19 \
-crate://crates.io/env_logger/0.3.3 \
+crate://crates.io/env_logger/0.3.5 \
crate://crates.io/vecio/0.1.0 \
crate://crates.io/rotor/0.6.3 \
-crate://crates.io/openssl-sys-extras/0.7.13 \
-crate://crates.io/regex-syntax/0.3.3 \
+crate://crates.io/openssl-sys-extras/0.7.14 \
+crate://crates.io/regex-syntax/0.3.7 \
crate://crates.io/bytes/0.3.0 \
crate://crates.io/void/1.0.2 \
crate://crates.io/spmc/0.2.1 \
crate://crates.io/openssl-verify/0.1.0 \
-crate-index://crates.io/6127fc24b0b6fe73fe4d339817fbf000b9a798a2 \
+crate-index://crates.io/7670a5aa394d0dcd7598905b352d1634ca74d84a \
git://github.com/advancedtelematic/rvi_sota_client \
"
SRC_URI[index.md5sum] = "79f10f436dbf26737cc80445746f16b4"
@@ -113,6 +112,20 @@ RDEPENDS_${PN} = " libcrypto \
lshw \
jq \
"
+export SOTA_VERSION = "${PV}"
+
+do_compile_prepend() {
+ # Fetch and build the specific build of hyper that is specified in cargo.toml.
+ # meta-rust doesn't support fetching crates that don't point to a specific tag
+ # and rvi-sota-client needs a specific work-around to function correctly.
+ make rust-openssl
+}
+
+do_compile_append() {
+ # Ensure that the 'make rust-openssl' above resulted in the local build of
+ # rust-openssl being used rather than the default one.
+ strings target/${TARGET_SYS}/release/sota_client | grep ${EXTENDPE}${PV}-${PR}/git/rust-openssl -q || (bberror "local rust-open ssl package not used"; exit 1)
+}
do_install() {
install -d ${D}${bindir}
@@ -123,6 +136,5 @@ do_install() {
install -c ${S}/run/sota_client.service ${D}${systemd_unitdir}/system
install -d ${D}${sysconfdir}
- echo `git log -1 --pretty=format:%H` > ${D}${sysconfdir}/sota_client.version
install -c ${S}/run/sota_certificates ${D}${sysconfdir}
}
diff --git a/meta-sota/recipes-sota/sota-tools/sota-tools_git.bb b/meta-sota/recipes-sota/sota-tools/sota-tools_git.bb
new file mode 100644
index 0000000..acd8e4a
--- /dev/null
+++ b/meta-sota/recipes-sota/sota-tools/sota-tools_git.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "Utility to push data to a server"
+LICENSE = "MPL-2.0"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea"
+
+S = "${WORKDIR}/git"
+
+SRC_URI = "gitsm://github.com/advancedtelematic/sota-tools.git;branch=master"
+SRCREV = "7ff1d92c161ba4fb047a1e1e4cba5424b4adca00"
+
+inherit cmake
+
+DEPENDS = "boost"
+
+BBCLASSEXTEND = "native"
+
+FILES_${PN} = "${bindir}/garage-push"
+
+EXTRA_OECMAKE = "-DWARNING_AS_ERROR=OFF"
+
+do_install() {
+ install -d ${D}/${bindir}
+ install -m 755 garage-push ${D}/${bindir}
+}