From patchwork Sat Dec 30 10:02:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Angelo Compagnucci X-Patchwork-Id: 854085 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=busybox.net (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=amarulasolutions-com.20150623.gappssmtp.com header.i=@amarulasolutions-com.20150623.gappssmtp.com header.b="hsqPH8v7"; dkim-atps=neutral Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3z7zXd70Kxz9t2M for ; Sat, 30 Dec 2017 21:02:41 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 6101E87974; Sat, 30 Dec 2017 10:02:39 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id S60l5oLDpt4A; Sat, 30 Dec 2017 10:02:31 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id C6D1E858F4; Sat, 30 Dec 2017 10:02:30 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 36A3E1C0B30 for ; Sat, 30 Dec 2017 10:02:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 33B87866BF for ; Sat, 30 Dec 2017 10:02:25 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id GEimMBf4RV9P for ; Sat, 30 Dec 2017 10:02:24 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail-wr0-f177.google.com (mail-wr0-f177.google.com [209.85.128.177]) by fraxinus.osuosl.org (Postfix) with ESMTPS id CA1BF86004 for ; Sat, 30 Dec 2017 10:02:23 +0000 (UTC) Received: by mail-wr0-f177.google.com with SMTP id o101so14657604wrb.6 for ; Sat, 30 Dec 2017 02:02:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BCdV5O/3soxjQjOO//hV7TBvliMS1z+KM5iWG+guY6k=; b=hsqPH8v7rn9TFfPH+SdM0XxYLWPxzi+mw/p9GAC1IG2DLwk1zq1wzYrGOVuGtoAZpt C/bZQtyAxSNEweWq+QvDr11b6BqPhuB3TeAO0jDqCUZep1WHNZwDlRauuMHyCmGUpZ3r 2HMgIrBCiYM8TX7UrHiQsQ0e3fJ2kkYUB/GZ0QjmcAslhrujllrmCciNxkcLAmxSOhSQ GAWzAkV6/4rA+CTcxPOH5IlrPrgtkr8zkA2E9Qzqcde33PmWs2ZRmYfYVUeJEWxto8Rl W6HfVjdt1G9lISFSp5YRJVPPQs1z/1aon4BfQrMMxK0el91GM8TMR48D0nbf/oWt7zwi V/Fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BCdV5O/3soxjQjOO//hV7TBvliMS1z+KM5iWG+guY6k=; b=Icm+fSSFNGsSerkM6OE7JmUobB6SYGg/sIH+WS18GPmquHz1ZgEjQGset6uhvYxbxh DQfDRh2fH63H9zewbi8i4LC++t0pNQED2wkprP2Pku+Lh1O16XFz/RlwcHn6djJ0CYNn NDK0Isde2aQqPxs10BUtPeBbwGad7uCeAA5m/oV6AF1UyElzLCm2zC7kx4a03fClgjCi tLQQ6vP02Rxd3ZhuMaDQAWkSv0E7XuB2gXR+GzfTN0qP1S7n30aIruoZiNb3s2okmHW2 wndzLIdaz/AN0GXPsYoSIBD42csQAmRTSNKe9+SKd22lqkqKHRBwUNPDQh+9tQqeOwCh X26g== X-Gm-Message-State: AKGB3mKO0tetsamUPQmsl2KCCN529jsilgv0X4iapdaoqB/+P3G8ujcT u11gA2OdOAvT23uLN/WjrX14ZlOUSW4= X-Google-Smtp-Source: ACJfBot59cBX/UorqRkS7fX5MsNo35o73JteJMGuLWUfW1rhmkACRqE5dhauzi23gRWuThfno/dR2A== X-Received: by 10.223.179.215 with SMTP id x23mr36337613wrd.198.1514628141836; Sat, 30 Dec 2017 02:02:21 -0800 (PST) Received: from localhost.localdomain ([89.202.204.147]) by smtp.gmail.com with ESMTPSA id n65sm66180723wrb.17.2017.12.30.02.02.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 30 Dec 2017 02:02:21 -0800 (PST) From: Angelo Compagnucci To: buildroot@buildroot.org Date: Sat, 30 Dec 2017 11:02:07 +0100 Message-Id: <1514628127-15938-8-git-send-email-angelo@amarulasolutions.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1514628127-15938-1-git-send-email-angelo@amarulasolutions.com> References: <1514628127-15938-1-git-send-email-angelo@amarulasolutions.com> Subject: [Buildroot] [PATCH v2 7/7] package/mender: new package X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.24 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Angelo Compagnucci MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" From: Angelo Compagnucci This patch add mender, an open source over-the-air (OTA) software updater for embedded Linux devices. Signed-off-by: Angelo Compagnucci --- package/Config.in | 1 + package/mender/Config.in | 14 +++++++++ package/mender/mender-device-identity | 52 ++++++++++++++++++++++++++++++++ package/mender/mender-inventory-hostinfo | 21 +++++++++++++ package/mender/mender-inventory-network | 47 +++++++++++++++++++++++++++++ package/mender/mender.conf | 14 +++++++++ package/mender/mender.hash | 2 ++ package/mender/mender.mk | 31 +++++++++++++++++++ package/mender/mender.service | 15 +++++++++ package/mender/server.crt | 22 ++++++++++++++ package/mender/tenant.conf | 0 11 files changed, 219 insertions(+) create mode 100644 package/mender/Config.in create mode 100644 package/mender/mender-device-identity create mode 100644 package/mender/mender-inventory-hostinfo create mode 100644 package/mender/mender-inventory-network create mode 100644 package/mender/mender.conf create mode 100644 package/mender/mender.hash create mode 100644 package/mender/mender.mk create mode 100644 package/mender/mender.service create mode 100644 package/mender/server.crt create mode 100644 package/mender/tenant.conf diff --git a/package/mender/tenant.conf b/package/mender/tenant.conf new file mode 100644 index 0000000..e69de29 diff --git a/package/Config.in b/package/Config.in index bd39a37..5104fc0 100644 --- a/package/Config.in +++ b/package/Config.in @@ -1941,6 +1941,7 @@ menu "System tools" source "package/kvmtool/Config.in" source "package/libostree/Config.in" source "package/lxc/Config.in" + source "package/mender/Config.in" source "package/monit/Config.in" source "package/ncdu/Config.in" source "package/numactl/Config.in" diff --git a/package/mender/Config.in b/package/mender/Config.in new file mode 100644 index 0000000..201128a --- /dev/null +++ b/package/mender/Config.in @@ -0,0 +1,14 @@ +config BR2_PACKAGE_MENDER + bool "mender" + depends on BR2_PACKAGE_HOST_GO_ARCH_SUPPORTS + depends on BR2_PACKAGE_HOST_GO_CGO_LINKING_SUPPORTS + depends on BR2_TOOLCHAIN_HAS_THREADS + depends on BR2_INIT_SYSTEMD + + help + Mender is an open source over-the-air (OTA) software updater for + embedded Linux devices. Mender comprises a client running at the + embedded device, as well as a server that manages deployments + across many devices. + + https://github.com/mendersoftware/mender diff --git a/package/mender/mender-device-identity b/package/mender/mender-device-identity new file mode 100644 index 0000000..d87f843 --- /dev/null +++ b/package/mender/mender-device-identity @@ -0,0 +1,52 @@ +#!/bin/sh + +# Example script called by Mender agent to collect device identity data. The +# script needs to be located at +# $(datadir)/mender/identity/mender-device-identity path for the agent to find +# it. The script shall exit with non-0 status on errors. In this case the agent +# will discard any output the script may have produced. +# +# The script shall output identity data in = format, one +# entry per line. Example +# +# $ ./mender-device-identity +# mac=de:ad:ca:fe:00:01 +# cpuid=1112233 +# +# The example script collects the MAC address of a network interface with the +# type ARPHRD_ETHER and it will pick the interface with the lowest ifindex +# number if there are multiple interfaces with that type. The identity data is +# output in the following format: +# +# mac=00:01:02:03:04:05 +# + +set -ue + +SCN=/sys/class/net +min=65535 +arphrd_ether=1 +ifdev= + +# find iface with lowest ifindex, skip non ARPHRD_ETHER types (lo, sit ...) +for dev in $SCN/*; do + iftype=$(cat $dev/type) + if [ $iftype -ne $arphrd_ether ]; then + continue + fi + + idx=$(cat $dev/ifindex) + if [ $idx -lt $min ]; then + min=$idx + ifdev=$dev + fi +done + +if [ -z "$ifdev" ]; then + echo "no suitable interfaces found" >&2 + exit 1 +else + echo "using interface $ifdev" >&2 + # grab MAC address + echo "mac=$(cat $ifdev/address)" +fi diff --git a/package/mender/mender-inventory-hostinfo b/package/mender/mender-inventory-hostinfo new file mode 100644 index 0000000..cf508fd --- /dev/null +++ b/package/mender/mender-inventory-hostinfo @@ -0,0 +1,21 @@ +#!/bin/sh +# +# The example script collects information about current host +# + +set -ue + +LC_ALL=C +export LC_ALL + +grep 'model name' /proc/cpuinfo | uniq | awk -F': ' ' + // { printf("cpu_model=%s\n", $2);} +' +echo "kernel=$(cat /proc/version)" + +cat /proc/meminfo | awk ' +/MemTotal/ {printf("mem_total_kB=%d\n", $2)} +' + +echo "hostname=$(cat /etc/hostname)" + diff --git a/package/mender/mender-inventory-network b/package/mender/mender-inventory-network new file mode 100644 index 0000000..b017c4e --- /dev/null +++ b/package/mender/mender-inventory-network @@ -0,0 +1,47 @@ +#!/bin/sh +# +# Example script called by Mender agent to collect inventory data for a +# particular devce. The script needs to be located in $(datadir)/mender and its +# name shall start with `mender-inventory-` prefix. The script shall exit with +# non-0 status on errors. In this case the agent will discard any output the +# script may have produced. +# +# The script shall output inventory data in = format, one entry per +# line. Entries appearing multiple times will be joined in a list under the same +# key. +# +# $ ./mender-inventory-network +# mac_br-fbfdad18c33c=02:42:7e:74:96:85 +# network_interfaces=br-fbfdad18c33c +# ipv4_br-fbfdad18c33c=172.21.0.1/16 +# mac_enp0s25=de:ad:be:ef:bb:05 +# network_interfaces=enp0s25 +# ipv4_enp0s25=123.22.0.197/16 +# ipv4_enp0s25=10.20.20.105/16 +# ipv6_enp0s25=fe80::2aad:beff:feef:bb05/64 +# +# +# The example script collects the list of network interfaces, as well as +# ethernet and IP addresses of each of the interfaces. +# + +set -ue + +SCN=/sys/class/net +min=65535 +ifdev= + +# find iface with lowest ifindex, except loopback +for devpath in $SCN/*; do + dev=$(basename $devpath) + if [ $dev = "lo" ]; then + continue + fi + echo "mac_$dev=$(cat $devpath/address)" + echo "network_interfaces=$dev" + + ip addr show dev $dev | awk -v dev=$dev ' + /inet / { printf("ipv4_%s=%s\n", dev, $2) } + /inet6 / {printf("ipv6_%s=%s\n", dev, $2) } + ' +done diff --git a/package/mender/mender.conf b/package/mender/mender.conf new file mode 100644 index 0000000..a5c7c54 --- /dev/null +++ b/package/mender/mender.conf @@ -0,0 +1,14 @@ +{ + "ClientProtocol": "http", + "HttpsClient": { + "Certificate": "", + "Key": "" + }, + "RootfsPartA": "@MENDER_ROOTFS_PART_A@", + "RootfsPartB": "@MENDER_ROOTFS_PART_B@", + "UpdatePollIntervalSeconds": @MENDER_UPDATE_POLL_INTERVAL_SECONDS@, + "InventoryPollIntervalSeconds": @MENDER_INVENTORY_POLL_INTERVAL_SECONDS@, + "RetryPollIntervalSeconds": @MENDER_RETRY_POLL_INTERVAL_SECONDS@, + "ServerURL": "@MENDER_SERVER_URL@", + "ServerCertificate": "@MENDER_CERT_LOCATION@" +} diff --git a/package/mender/mender.hash b/package/mender/mender.hash new file mode 100644 index 0000000..574b675 --- /dev/null +++ b/package/mender/mender.hash @@ -0,0 +1,2 @@ +# Locally computed: +sha256 a2fd103185431946c3455fef0c08909d13413a09638463266e5b6889df8163c5 mender-1.2.1.tar.gz diff --git a/package/mender/mender.mk b/package/mender/mender.mk new file mode 100644 index 0000000..40d270c --- /dev/null +++ b/package/mender/mender.mk @@ -0,0 +1,31 @@ +################################################################################ +# +# mender +# +################################################################################ + +MENDER_VERSION = 1.2.1 +MENDER_SOURCE = mender-$(MENDER_VERSION).tar.gz +MENDER_SITE = $(call github,mendersoftware,mender,$(MENDER_VERSION)) + +define MENDER_INSTALL_TARGET_CMDS + $(INSTALL) -dm 0755 $(TARGET_DIR)/etc/mender/ + $(INSTALL) -dm 0755 $(TARGET_DIR)/var/share/mender/identity/ + $(INSTALL) -dm 0755 $(TARGET_DIR)/var/share/mender/inventory/ + $(INSTALL) -D -m 0644 package/mender/mender.conf \ + $(TARGET_DIR)/etc/mender/mender.conf + $(INSTALL) -D -m 0644 package/mender/tenant.conf \ + $(TARGET_DIR)/etc/mender/mender.conf + $(INSTALL) -D -m 0644 package/mender/server.crt \ + $(TARGET_DIR)/etc/mender/server.crt + $(INSTALL) -D -m 0755 package/mender/mender-device-identity \ + $(TARGET_DIR)/var/share/mender/identity/mender-device-identity + $(INSTALL) -D -m 0755 package/mender/mender-inventory-network \ + $(TARGET_DIR)/var/share/mender/inventory/mender-inventory-network + $(INSTALL) -D -m 0755 package/mender/mender-inventory-hostinfo \ + $(TARGET_DIR)/var/share/mender/inventory/mender-inventory-hostinfo + $(INSTALL) -D -m 0644 package/mender/mender.service \ + $(TARGET_DIR)/usr/lib/systemd/system/mender.service +endef + +$(eval $(golang-package)) diff --git a/package/mender/mender.service b/package/mender/mender.service new file mode 100644 index 0000000..ec77fbc --- /dev/null +++ b/package/mender/mender.service @@ -0,0 +1,15 @@ +[Unit] +Description=Mender OTA update service +After=systemd-resolved.service + +[Service] +Type=idle +User=root +Group=root +ExecStartPre=/bin/mkdir -p -m 0700 /data/mender +ExecStartPre=/bin/ln -sf /etc/mender/tenant.conf /var/lib/mender/authtentoken +ExecStart=/usr/bin/mender -daemon +Restart=on-abort + +[Install] +WantedBy=multi-user.target diff --git a/package/mender/server.crt b/package/mender/server.crt new file mode 100644 index 0000000..79a57e1 --- /dev/null +++ b/package/mender/server.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIBfTCCASOgAwIBAgIJAJOS76a0qWuZMAoGCCqGSM49BAMCMBsxGTAXBgNVBAMM +EGRvY2tlci5tZW5kZXIuaW8wHhcNMTYxMjE0MTk1MjQ2WhcNMjYxMjEyMTk1MjQ2 +WjAbMRkwFwYDVQQDDBBkb2NrZXIubWVuZGVyLmlvMFkwEwYHKoZIzj0CAQYIKoZI +zj0DAQcDQgAE7AVYis6MWGPGQYU1/tlLEnskRifDIhvkRb8Y4nQPekRkLkiBYYT3 +iJ46wHrnejbHaLstU9GRdKWOmOuU6HGdO6NQME4wHQYDVR0OBBYEFGOIU4q++Vz8 +9HuT1jg9V+wFeJcyMB8GA1UdIwQYMBaAFGOIU4q++Vz89HuT1jg9V+wFeJcyMAwG +A1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAPLnEeWPNeN7eDCEYRitBfyO +X1yf2kzOm4ohBE5GY9gzAiBCq7HOSkzQDkelmQCCCpGXf/UwYNgQJjSoeGfk0j1a +TQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIBhDCCASmgAwIBAgIJALQrf4QDot4IMAoGCCqGSM49BAMCMB4xHDAaBgNVBAMM +E3MzLmRvY2tlci5tZW5kZXIuaW8wHhcNMTYxMjE0MTk1MjQ2WhcNMjYxMjEyMTk1 +MjQ2WjAeMRwwGgYDVQQDDBNzMy5kb2NrZXIubWVuZGVyLmlvMFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEEc/Y3T+l3DvINePkpvVZORMIdHVs29jgsl48ia7z/NRX +HlKtKxVGJyFN5Y7sBZeLgBYH3F4Bo3KfmxI7ad0tI6NQME4wHQYDVR0OBBYEFIUm +cip00QZYpe4ULflbGNJan+Y9MB8GA1UdIwQYMBaAFIUmcip00QZYpe4ULflbGNJa +n+Y9MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANHij9VZBDHOUPaC +pFiagnWnYL2HBR72W1xTKQbrLLTXAiEAvpwA4HzSnGmLd3010+jqQuMRHArN5WaX +h0fy7niBbIQ= +-----END CERTIFICATE-----