diff options
-rw-r--r-- | meta-sota/README.md | 107 | ||||
-rw-r--r-- | meta-sota/classes/image_types_ostree.bbclass | 19 | ||||
-rw-r--r-- | meta-sota/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb | 80 | ||||
-rw-r--r-- | meta-sota/recipes-sota/sota-tools/sota-tools_git.bb | 24 |
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} +} |