From 06f1d5958e368eb35a96b95260a23ff887d27d0b Mon Sep 17 00:00:00 2001 From: Anton Gerasimov Date: Tue, 8 Nov 2016 11:23:19 +0100 Subject: A tool for uploading OSTree objects to a server together with integration code Bug-AGL: SPEC-194 Change-Id: I650e190bbda67ad48233bc5aedc0c10ff14aa58f Signed-off-by: Anton Gerasimov --- meta-sota/README.md | 107 +++++++++++++++++++++ meta-sota/classes/image_types_ostree.bbclass | 19 ++++ .../recipes-sota/sota-tools/sota-tools_git.bb | 24 +++++ 3 files changed, 150 insertions(+) create mode 100644 meta-sota/README.md create mode 100644 meta-sota/recipes-sota/sota-tools/sota-tools_git.bb 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/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} +} -- cgit 1.2.3-korg