From patchwork Mon Sep 22 17:04:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Heinisch, Alexander" X-Patchwork-Id: 4371 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Mon, 22 Sep 2025 19:05:04 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-il1-f190.google.com (mail-il1-f190.google.com [209.85.166.190]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 58MH51g6020755 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 22 Sep 2025 19:05:02 +0200 Received: by mail-il1-f190.google.com with SMTP id e9e14a558f8ab-4248c63531esf31138885ab.0 for ; Mon, 22 Sep 2025 10:05:02 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1758560695; cv=pass; d=google.com; s=arc-20240605; b=EBim89h2M0eqtyNuXh1dH8frWHt1Gc/Gpv5JKH6bSKDnYfprvWe+y3WyqLBiGtf2lP PBQnX7y3YmCYNbIQCZtawUA6VjTg4B46Tqo2zvCqUIfIabiqgsWFtPWpsgzAsTwDb5wp e3dHzjYphhSuezkn6kK/umK+79/QKhMl1yfHsX3USzEERBbvxEVo+bVp3YXvketv3iaw MpRgT8zwRhVvXM40nIQlig8Ytq5zd7uvbB35JkkgUP6O4RR3CWEapdguRhh/kwJVRvA8 DIVLCxncGeZNqYlbFj4SfNkXee4qHUUW88OjlPeGYblHnpJNv7kEoG7FzTStZHkpzXWb lmxQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to:feedback-id:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=TkZOw9SPokPLLB3V8DzhLkPzgkAXF5iyT/dNYXI3uYk=; fh=FnxHZiPIW2Ymt3u9+3+QP97BMTdJYj3467BynTzHbG4=; b=BQYjbg0zJQxmjXYMgkMMmCMzAPaGQto9/+Z1s/I4RJOSRqTwjkXrL6sRmRTupP2msv 20zxLDLvdc5EUAAoXlLgxT5OEe+vkGgChcyKVjEjEfAJDYJlct/MPezs7ihnVwwuWBLC 8hJSXVqeHTESjGotf15OUajwKctSjhoPc1fvA2h7RNOQjwkj/gzpO0IdmIMBLD0innB3 aNAeMH48ISlcd7ASgrzhoThZgPsGsdprd0nph88NZ4lIGmwiAx5OcFrKZWL28Rx7cWB2 cHUEyP5WVoO4xe+sM/rsFKkZE/lj/KuX/bcQOqcj4d/rKm4Q4n0Lo5RJQDd6OuL0sbFd 3hRA==; darn=isar-build.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=WvAfXrhT; spf=pass (google.com: domain of fm-1330684-20250922170451f1911053a60002079d-viysql@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1330684-20250922170451f1911053a60002079d-VIYsQL@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1758560695; x=1759165495; darn=isar-build.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=TkZOw9SPokPLLB3V8DzhLkPzgkAXF5iyT/dNYXI3uYk=; b=D8QfpBQmNQg/oWoRvjGqzdY+Knc7h7c68uTG2zLheld6f7Lg+UeACkLqfsawsBSkfN Fyy+phgR96NtwG0h397nPS+3JEFwXdA2UNLYMTF7MO+vLy0sULB1zbWDkDVEoj7j3SLs O/4In+knqW9grEdlrYwsNagrZFix5D1F3BR56lvjuHCYg6kXALTWRL2QdVoCWgoKSs7z GhgnJURqxTRdFGC6dVhaNUbrbpIvVEsQB76vmNjdfgqdOIpqWbkdTDkLjAoKXHyZL+sd monsBFQ6PE8r3CQOd1eo1dmf1HeQPyE1KyCqzXEaGhBitnKgLvWgPPjnR9H3fjhfilyW 5kfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758560695; x=1759165495; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-beenthere:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=TkZOw9SPokPLLB3V8DzhLkPzgkAXF5iyT/dNYXI3uYk=; b=UbsXWGWEnaDCOmQz5CGqPjswLy8EydsKpvK+APKfFXqRQkzl++wyYv+bJENXfFYBlP ednmLhO2CShTdQngQ4p1EoyKKxaBo4CF1LrlGz+liOcKxHU0pakR6rlvU7cV2HJSewAE QLxgw4iBc8gymW6W18ML1BU8btqOje40RaVbFxeL2r5oVxGMx8dG09VWL9NAf0lHoXk4 z4fPDp9lJXgP6pvUVDCS3f0QeLNY40EjeMP2oDa/foIEYIICh4SuGPYs1ZmGjsUsCjTh 0DmUq9R80APuznt9jdznXcDusGQoDYqsR3bwZNoZtUVo6kudQF63uO7OIhQOStt/wsFs Ca3A== X-Forwarded-Encrypted: i=2; AJvYcCXmfcp7zAqF9JbElsrbrzil6AsO91fJjkN61U6JVj0xNVtKf07IwaSKbtcrI/Qt8g7qTs4i4v8=@isar-build.org X-Gm-Message-State: AOJu0Yy0gIJ4ZBBQOhBqlXnOkL+8YzeJK+/ol7XZ11jv4Wh2t+Uek+0T xLQsKYEIVyBsKJn08dzqUbcHG+usQ8qkgXqqhFhpjisjlyLTV5zYiYU9 X-Google-Smtp-Source: AGHT+IEuAMstvqqtk94W6cRcMSFSN5TeNFv3FDBk4xqITe5JlWtJL0UJaH9RfFFzh5U0Wjc7PKcW2w== X-Received: by 2002:a05:6e02:2144:b0:425:70d9:2612 with SMTP id e9e14a558f8ab-42570d92695mr79779115ab.8.1758560694626; Mon, 22 Sep 2025 10:04:54 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com; h=ARHlJd52e82fdOQ04nLrP5K1BDSKkW20auZnIkUGwnZsgbf2bw== Received: by 2002:a05:6e02:4407:20b0:40a:24e:f416 with SMTP id e9e14a558f8ab-4257b82cfcels3292825ab.2.-pod-prod-00-us-canary; Mon, 22 Sep 2025 10:04:53 -0700 (PDT) X-Received: by 2002:a05:6e02:4715:b0:425:79c1:df84 with SMTP id e9e14a558f8ab-42579c1efddmr67945795ab.4.1758560693255; Mon, 22 Sep 2025 10:04:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1758560693; cv=none; d=google.com; s=arc-20240605; b=XRKJQfhBd5NqhWhQr+L/cM1TJJv3eotYRJegPR4ATaVLOvOWPMnsHTww2owKmNy64f w5Wroowvi2vJPZKLfwjNFuuTj9O47yqpVDVra8BEQ+Z7EvNr9csZiDbQA9kR8SYbTSLA uNbpAoHVxrYMywSKGhJ/xyqswF/Ti2ntZtv9XqsOg4wVrjrEoRCp5eZpol0H0GTrafqA wg8skGLB/qtjK+5hiYDsRFiUZq/RC4fJxqiRdrqUDuFkr5HWcnkS0OceWPzn0loZydsS suFUVaTtcDzliUzJ9YYf+3iT40itWDYZrsZidUHg0A9LOHsKagAYgRPWyONkR11w80xk 6WgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=feedback-id:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=TJrN/V/yGwsm+kfHfehYjYba+yxXCH3leDEVfHxxw+c=; fh=p2NZNdSy+UicSjYUSvZGU+QYmFFPVZWXjWkELGSBm8Q=; b=ZyQfGBzYnbwylGIVL3/+1VsUAbis6rxcSv/0inrxziIa597OiG1ARgOsmj5YU57vI0 177XXp0OMaAPP0Xmz44qw6Ln+L0p4a8zOYKe4ywf+3pRKO0b+q+7c1tzzeajjsPF+Bk4 rWOVLB3QG2Ub0JQOc3jXRU6BuZ5nh5ZqDmpfC6tmlMP68Mg30m0B3Zxi4gyXi9EBmb5H Wu1uCP8XZduL8lfzQMexyDGE1Is1npYoxnDn56rRX4ti5JvRW0I5Syxkt9ugsltG7u+R e9b/+ot7MbDDLa3AJGVArYCH0yEQbJZPVrz72dzTaQEymdLggY0RLrbzI360fqegrOWt 2GGQ==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=WvAfXrhT; spf=pass (google.com: domain of fm-1330684-20250922170451f1911053a60002079d-viysql@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1330684-20250922170451f1911053a60002079d-VIYsQL@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from mta-64-227.siemens.flowmailer.net (mta-64-227.siemens.flowmailer.net. [185.136.64.227]) by gmr-mx.google.com with ESMTPS id 8926c6da1cb9f-53d4a031c70si609333173.3.2025.09.22.10.04.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Sep 2025 10:04:52 -0700 (PDT) Received-SPF: pass (google.com: domain of fm-1330684-20250922170451f1911053a60002079d-viysql@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) client-ip=185.136.64.227; Received: by mta-64-227.siemens.flowmailer.net with ESMTPSA id 20250922170451f1911053a60002079d for ; Mon, 22 Sep 2025 19:04:51 +0200 X-Patchwork-Original-From: "alexander.heinisch via isar-users" From: "Heinisch, Alexander" To: isar-users@googlegroups.com Cc: Alexander Heinisch Subject: [PATCH 2/6] isar-installer: Added target bootstrapper framework Date: Mon, 22 Sep 2025 19:04:41 +0200 Message-Id: <20250922170445.1393839-3-alexander.heinisch@siemens.com> In-Reply-To: <20250922170445.1393839-1-alexander.heinisch@siemens.com> References: <20250922170445.1393839-1-alexander.heinisch@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1330684:519-21489:flowmailer X-Original-Sender: alexander.heinisch@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=WvAfXrhT; spf=pass (google.com: domain of fm-1330684-20250922170451f1911053a60002079d-viysql@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1330684-20250922170451f1911053a60002079d-VIYsQL@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com X-Original-From: alexander.heinisch@siemens.com Reply-To: alexander.heinisch@siemens.com Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Status: No, score=-4.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2,RCVD_IN_RP_CERTIFIED, RCVD_IN_RP_RNBL,RCVD_IN_RP_SAFE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= From: Alexander Heinisch Currently the installer deploys images embedded to itself. In many situations this is fine, but for some more demanding requirements are in place. e.g.: - enrollment of keys (e.g. Secure Boot), - setup for disk encryption, - collection and reporting of device information (serial number, mac addresses, ...) - resize / repartition of disk during comissioning - generation of a commissioning report While many of these tasks can be done on first-boot doing so during device setup can be beneficial in many cases. e.g. - additional time required for "first-boot" when performing tasks with high effort on site may not be desired - the comissioning environment oftentimes allows for failures during that phase - worst case the device is put aside. On site failures during the wrong bootstrapping phases (secure boot setup, disk encryption) can be severe. This patch extends current installer behaviour to support a flexible framework to define multiple tasks to be executed in sequence during the "target (device) bootstrapping" phase. Signed-off-by: Alexander Heinisch --- meta-isar/classes/target-bootstrapper.bbclass | 37 ++++++++++++++++ .../files/target-bootstrapper.override.conf | 3 ++ .../target-bootstrapper-service.bb | 38 ++++++++++++++++ .../files/target-bootstrapper.sh.tmpl | 44 +++++++++++++++++++ .../target-bootstrapper.bb | 41 +++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 meta-isar/classes/target-bootstrapper.bbclass create mode 100644 meta-isar/recipes-installer/target-bootstrapper-service/files/target-bootstrapper.override.conf create mode 100644 meta-isar/recipes-installer/target-bootstrapper-service/target-bootstrapper-service.bb create mode 100644 meta-isar/recipes-installer/target-bootstrapper/files/target-bootstrapper.sh.tmpl create mode 100644 meta-isar/recipes-installer/target-bootstrapper/target-bootstrapper.bb diff --git a/meta-isar/classes/target-bootstrapper.bbclass b/meta-isar/classes/target-bootstrapper.bbclass new file mode 100644 index 00000000..15974bf8 --- /dev/null +++ b/meta-isar/classes/target-bootstrapper.bbclass @@ -0,0 +1,37 @@ +# This software is a part of ISAR. +# Copyright (C) Siemens AG, 2024-2025 +# +# SPDX-License-Identifier: MIT + +python() { + additional_packages = d.getVar('TARGET_BOOTSTRAPPER_ADDITIONAL_PACKAGES').split() + + names = [] + workdirs = [] + scripts = [] + efforts = [] + effort_total = 0 + + for package in additional_packages: + additional_package_task = f"TARGET_BOOTSTRAPPER_TASK_{package}" + + names.append(package) + workdirs.append(d.getVarFlag(additional_package_task, "workdir") or ".") + + script = d.getVarFlag(additional_package_task, "script") + if not script: + bb.warn("Script not set for {task_name} - consider setting {task_name}[script] = \"\"".format(task_name=additional_package_task)) + + scripts.append(script or "/bin/true") + + effort = d.getVarFlag(additional_package_task, "effort") or "1" + efforts.append(effort) + + effort_total = effort_total + int(effort) + + d.setVar('TMPL_TARGET_BOOTSTRAPPER_TASK_NAMES', ' '.join(names)) + d.setVar('TMPL_TARGET_BOOTSTRAPPER_TASK_WORKDIRS', ' '.join(workdirs)) + d.setVar('TMPL_TARGET_BOOTSTRAPPER_TASK_SCRIPTS', ' '.join(scripts)) + d.setVar('TMPL_TARGET_BOOTSTRAPPER_TASK_EFFORTS', ' '.join(efforts)) + d.setVar('TMPL_TARGET_BOOTSTRAPPER_TASK_TOTAL_EFFORT', str(effort_total)) +} diff --git a/meta-isar/recipes-installer/target-bootstrapper-service/files/target-bootstrapper.override.conf b/meta-isar/recipes-installer/target-bootstrapper-service/files/target-bootstrapper.override.conf new file mode 100644 index 00000000..a7948418 --- /dev/null +++ b/meta-isar/recipes-installer/target-bootstrapper-service/files/target-bootstrapper.override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=/bin/sh -c "target-bootstrapper.sh || (echo 'Rebooting in 60 s'; sleep 60); reboot" diff --git a/meta-isar/recipes-installer/target-bootstrapper-service/target-bootstrapper-service.bb b/meta-isar/recipes-installer/target-bootstrapper-service/target-bootstrapper-service.bb new file mode 100644 index 00000000..c3441494 --- /dev/null +++ b/meta-isar/recipes-installer/target-bootstrapper-service/target-bootstrapper-service.bb @@ -0,0 +1,38 @@ +# This software is a part of ISAR. +# Copyright (C) Siemens AG, 2024-2025 +# +# SPDX-License-Identifier: MIT + +DESCRIPTION = "systemd service to run target bootstrapper on ${TARGET_BOOTSTRAPPER_TTY_SERVICES}" + +TARGET_BOOTSTRAPPER_TTY_SERVICES ??= "\ + getty@tty1 \ + serial-getty@ttyS0 \ + " + +python(){ + if not d.getVar('TARGET_BOOTSTRAPPER_TTY_SERVICES'): + bb.error("No ttys for target bootstrapper configured - review TARGET_BOOTSTRAPPER_TTY_SERVICES setting") + + if (bb.utils.to_boolean(d.getVar('INSTALLER_UNATTENDED')) and + len(d.getVar('TARGET_BOOTSTRAPPER_TTY_SERVICES').split()) != 1): + bb.warn("Multiple ttys are configured for target bootstrapper in unattended mode. - potential race condition detected!") +} + +inherit dpkg-raw + +SRC_URI = "\ + file://target-bootstrapper.override.conf \ + " + +DEPENDS += " target-bootstrapper" +DEBIAN_DEPENDS = "target-bootstrapper" + +do_install[cleandirs] = "${D}/usr/lib/systemd/system/" +do_install() { + for svc_name in ${TARGET_BOOTSTRAPPER_TTY_SERVICES} + do + mkdir -p ${D}/usr/lib/systemd/system/${svc_name}.service.d/ + install -m 0644 ${WORKDIR}/target-bootstrapper.override.conf ${D}/usr/lib/systemd/system/${svc_name}.service.d/10-target-bootstrapper.override.conf + done +} diff --git a/meta-isar/recipes-installer/target-bootstrapper/files/target-bootstrapper.sh.tmpl b/meta-isar/recipes-installer/target-bootstrapper/files/target-bootstrapper.sh.tmpl new file mode 100644 index 00000000..13be023a --- /dev/null +++ b/meta-isar/recipes-installer/target-bootstrapper/files/target-bootstrapper.sh.tmpl @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# This software is a part of ISAR. +# Copyright (C) Siemens AG, 2024 +# +# SPDX-License-Identifier: MIT + +task_names=($TMPL_TARGET_BOOTSTRAPPER_TASK_NAMES) +task_workdirs=($TMPL_TARGET_BOOTSTRAPPER_TASK_WORKDIRS) +task_scripts=($TMPL_TARGET_BOOTSTRAPPER_TASK_SCRIPTS) +task_efforts=($TMPL_TARGET_BOOTSTRAPPER_TASK_EFFORTS) +handled_effort=0 +total_effort=$TMPL_TARGET_BOOTSTRAPPER_TASK_TOTAL_EFFORT + +tasks_total=${#task_names[@]} +tasks_indices=${!task_names[@]} + +echo "Found $tasks_total tasks to execute for target bootstrapping." +echo "" + +for idx in ${tasks_indices} +do + echo "Task $(( idx+1 ))/${tasks_total} - $((handled_effort*100/total_effort))%" + echo "Handling task ${task_names[$idx]}" + + echo "Entering workdir ${task_workdirs[$idx]}..." + pushd ${task_workdirs[$idx]} > /dev/null + + ## execute task in subshell + (./${task_scripts[$idx]}) + execution_result=$? + if [ ${execution_result} -eq 0 ]; then + echo "${task_names[$idx]} executed sucessfully" + else + echo "${task_names[$idx]} failed with ${execution_result}" -> abort! + exit ${execution_result} + fi + + echo "Leaving workdir ${task_workdirs[$idx]}..." + popd > /dev/null + + handled_effort=$((handled_effort+task_efforts[idx])) +done + +echo "All tasks completed!" diff --git a/meta-isar/recipes-installer/target-bootstrapper/target-bootstrapper.bb b/meta-isar/recipes-installer/target-bootstrapper/target-bootstrapper.bb new file mode 100644 index 00000000..4c0fa6c3 --- /dev/null +++ b/meta-isar/recipes-installer/target-bootstrapper/target-bootstrapper.bb @@ -0,0 +1,41 @@ +# This software is a part of ISAR. +# Copyright (C) Siemens AG, 2024-2025 +# +# SPDX-License-Identifier: MIT + +inherit dpkg-raw +inherit target-bootstrapper + +DESCRIPTION = "Device bootstrapping framework" + +TARGET_BOOTSTRAPPER_ADDITIONAL_PACKAGES ??= "deploy-image" +TARGET_BOOTSTRAPPER_TASK_deploy-image[script] ??= "deploy-image-wic.sh" +TARGET_BOOTSTRAPPER_TASK_deploy-image[workdir] ??= "/usr/bin" +TARGET_BOOTSTRAPPER_TASK_deploy-image[effort] ??= "2" + +DEPENDS += " ${@isar_multiarch_packages('TARGET_BOOTSTRAPPER_ADDITIONAL_PACKAGES', d)}" +DEBIAN_DEPENDS += " \ + , bash \ + , ${@ ', '.join(isar_multiarch_packages('TARGET_BOOTSTRAPPER_ADDITIONAL_PACKAGES', d).split())} \ + " + +SRC_URI = " \ + file://target-bootstrapper.sh.tmpl \ + " + +TEMPLATE_FILES = " \ + target-bootstrapper.sh.tmpl \ + " + +TEMPLATE_VARS = " \ + TMPL_TARGET_BOOTSTRAPPER_TASK_NAMES \ + TMPL_TARGET_BOOTSTRAPPER_TASK_WORKDIRS \ + TMPL_TARGET_BOOTSTRAPPER_TASK_SCRIPTS \ + TMPL_TARGET_BOOTSTRAPPER_TASK_EFFORTS \ + TMPL_TARGET_BOOTSTRAPPER_TASK_TOTAL_EFFORT \ + " + +do_install[cleandirs] = "${D}/usr/bin/" +do_install() { + install -m 0755 ${WORKDIR}/target-bootstrapper.sh ${D}/usr/bin/ +}