public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: "alexander.heinisch via isar-users" <isar-users@googlegroups.com>
To: isar-users@googlegroups.com
Cc: jan.kiszka@siemens.com, quirin.gylstorff@siemens.com,
	Alexander Heinisch <alexander.heinisch@siemens.com>
Subject: [PATCH 1/2] meta-isar: Added unattended mode for deploy-image-wic installer script.
Date: Tue,  8 Oct 2024 12:22:34 +0200	[thread overview]
Message-ID: <20241008102235.34078-2-alexander.heinisch@siemens.com> (raw)
In-Reply-To: <20241008102235.34078-1-alexander.heinisch@siemens.com>

From: Alexander Heinisch <alexander.heinisch@siemens.com>

In some cases (e.g. automated mass rollouts for precomissioning devices)
it is valueable to not rely on a screen and a keyboard to deploy the
target images on the device.

Therefore, extended on the auto.install patch to allow for completely
unattended installations.

In addition to the auto.install file to provide configuration for the installer we added support
for the kernel cmdline.
 - installer.unattended
 - installer.image.uri ...file name of the image to be installed (parameter name uri chosen since we plan to support download of images in upcoming patches)
 - installer.target.dev ...target device name (e.g. /dev/sda) for the image to be installed to
 - installer.target.overwrite ...strategy how to handle target devices not empty (possible values: OVERWRITE - overwrite data on target | ABORT - abort installation if target not empty)

This introduces a **Breaking change!**

This patch changes behaviour since when auto.install is found
the script is assumed to run unattended. That means no dialogs are shown and no
user interaction is enforced! It also requires all the configurations to be in place
and valid when such file is provided!

Signed-off-by: Alexander Heinisch <alexander.heinisch@siemens.com>
---
 .../deploy-image/deploy-image_0.1.bb          |  7 +-
 .../files/{ => usr/bin}/deploy-image-wic.sh   | 76 ++++++++++-------
 .../usr/lib/deploy-image-wic/handle-config.sh | 83 +++++++++++++++++++
 3 files changed, 134 insertions(+), 32 deletions(-)
 rename meta-isar/recipes-installer/deploy-image/files/{ => usr/bin}/deploy-image-wic.sh (71%)
 mode change 100644 => 100755
 create mode 100644 meta-isar/recipes-installer/deploy-image/files/usr/lib/deploy-image-wic/handle-config.sh

diff --git a/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
index fe524e52..242ca88e 100644
--- a/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
+++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
@@ -7,11 +7,14 @@ DESCRIPTION = "Install image to device"
 
 inherit dpkg-raw
 
-SRC_URI = "file://deploy-image-wic.sh \
+SRC_URI = "file://usr/bin/deploy-image-wic.sh \
+           file://usr/lib/deploy-image-wic/handle-config.sh \
           "
 DEBIAN_DEPENDS = "bmap-tools, pv, dialog, util-linux, parted, fdisk, gdisk, pigz, xz-utils, pbzip2, zstd"
 do_install[cleandirs] = "${D}/usr/bin/ \
+                         ${D}/usr/lib/deploy-image-wic \
                         "
 do_install() {
-  install -m 0755  ${WORKDIR}/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+    install -m 0755  ${WORKDIR}/usr/bin/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+    install -m 0755  ${WORKDIR}/usr/lib/deploy-image-wic/handle-config.sh ${D}/usr/lib/deploy-image-wic/handle-config.sh
 }
diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/usr/bin/deploy-image-wic.sh
old mode 100644
new mode 100755
similarity index 71%
rename from meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
rename to meta-isar/recipes-installer/deploy-image/files/usr/bin/deploy-image-wic.sh
index 95188fe3..108a5975
--- a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
+++ b/meta-isar/recipes-installer/deploy-image/files/usr/bin/deploy-image-wic.sh
@@ -6,21 +6,18 @@
 
 installdata=${INSTALL_DATA:-/install}
 
-AUTO_INSTALL=false
-OVERWRITE=
-
-if [ -f "$installdata/auto.install" ]; then
-    exec 3<"$installdata/auto.install"
-    read -r DISK_IMAGE <&3
-    read -r TARGET_DEVICE <&3
-    read -r OVERWRITE <&3
-    exec 3>&-
-    if [ ! -b ${TARGET_DEVICE} ]; then
-        dialog --msgbox "Target device is not a valid block device. Installation aborted." 6 60
-        exit 1
-    fi
-    AUTO_INSTALL=true
-else
+SCRIPT_DIR=$( dirname -- "$( readlink -f -- "$0"; )"; )
+
+. ${SCRIPT_DIR}/../lib/deploy-image-wic/handle-config.sh
+
+
+# Map config params
+AUTO_INSTALL=${installer_unattended}
+DISK_IMAGE=${installer_image_uri}
+TARGET_DEVICE=${installer_target_dev}
+OVERWRITE=${installer_target_overwrite}
+
+if ! $AUTO_INSTALL; then
     DISK_IMAGE=$(find "$installdata" -type f -iname "*.wic*" -a -not -iname "*.wic.bmap" -exec basename {} \;)
     if [ -z "$DISK_IMAGE" ] || [ ! -f "$installdata/$DISK_IMAGE" ]; then
         pushd "$installdata"
@@ -36,16 +33,14 @@ else
             fi
         fi
     fi
-fi
 
-if [ ! -f "$installdata/$DISK_IMAGE" ]; then
-    dialog --msgbox "Could not find an image to install. Installation aborted." 6 60
-    exit 1
-fi
-DISK_BMAP=$(find "$installdata" -type f -iname "${DISK_IMAGE%.wic*}.wic.bmap")
-# inspired by poky/meta/recipes-core/initrdscripts/files/install-efi.sh
+    if [ ! -f "$installdata/$DISK_IMAGE" ]; then
+        dialog --msgbox "Could not find an image to install. Installation aborted." 6 60
+        exit 1
+    fi
+    DISK_BMAP=$(find "$installdata" -type f -iname "${DISK_IMAGE%.wic*}.wic.bmap")
 
-if ! $AUTO_INSTALL; then
+    # inspired by poky/meta/recipes-core/initrdscripts/files/install-efi.sh
     target_device_list=""
     current_root_dev_type=$(findmnt / -o fstype -n)
     if [ ${current_root_dev_type} = "nfs" ]; then
@@ -126,25 +121,46 @@ if ! $AUTO_INSTALL; then
                 --yesno "Start installing\n'$DISK_IMAGE'\nto $TARGET_DEVICE (capacity: $TARGET_DEVICE_SIZE)" 7 60; then
         exit 0
     fi
+
+    # set absolute paths to be compatible with unattended mode
+    DISK_IMAGE="$installdata/$DISK_IMAGE"
+
+    if [ -z "$DISK_BMAP" ]; then
+        DISK_BMAP="$installdata/$DISK_BMAP"
+    fi
 fi
 
-if [ "$OVERWRITE" != "OVERWRITE" ] && ! cmp /dev/zero "$TARGET_DEVICE" -n 1M && \
-   ! dialog --defaultno \
-            --yesno "WARNING: Target device is not empty! Continue anyway?" 5 60; then
-    exit 0
+if ! cmp /dev/zero "$TARGET_DEVICE" -n 1M; then
+    if ! $AUTO_INSTALL && \
+       ! dialog --defaultno \
+                --yesno "WARNING: Target device is not empty! Continue anyway?" 5 60; then
+        exit 0
+    else
+        if [ "$OVERWRITE" != "OVERWRITE" ]; then
+            echo "Target device is not empty! -> Abort"
+            echo "If you want to override existing data set \"installer_target_overwrite=OVERWRITE\""
+        fi
+    fi
 fi
 
 bmap_options=""
 if [ -z "$DISK_BMAP" ]; then
     bmap_options="--nobmap"
 fi
-clear
-if ! bmaptool copy ${bmap_options} "$installdata/$DISK_IMAGE" "${TARGET_DEVICE}"; then
+
+if ! $AUTO_INSTALL; then
+    clear
+fi
+
+if ! bmaptool copy ${bmap_options} "$DISK_IMAGE" "${TARGET_DEVICE}"; then
     exit 1
 fi
 
 if ! $AUTO_INSTALL; then
     dialog --title "Reboot" \
-           --msgbox "Installation is successful. System will be rebooted. Please remove the USB stick." 6 60
+           --msgbox "Installation was successful. System will be rebooted. Please remove the USB stick." 6 60
+else
+    echo "Installation was successful."
 fi
+
 exit 0
diff --git a/meta-isar/recipes-installer/deploy-image/files/usr/lib/deploy-image-wic/handle-config.sh b/meta-isar/recipes-installer/deploy-image/files/usr/lib/deploy-image-wic/handle-config.sh
new file mode 100644
index 00000000..af37150e
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/usr/lib/deploy-image-wic/handle-config.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+installer_unattended=false
+installer_image_uri=
+installer_target_dev=
+installer_target_overwrite=
+
+if [ -f "$installdata/auto.install" ]; then
+    exec 3<"$installdata/auto.install"
+    read -r installer_image_uri <&3
+    read -r installer_target_dev <&3
+    read -r installer_target_overwrite <&3
+    exec 3>&-
+
+    installer_unattended=true
+fi
+
+# But let kernel cmdline overrule
+for x in $(cat /proc/cmdline); do
+    case $x in
+        installer.unattended*)
+            installer_unattended=true
+        ;;
+        installer.image.uri=*)
+            installer_image_uri=${x#installer.image.uri=}
+            installer_unattended=true
+        ;;
+        installer.target.dev=*)
+            installer_target_dev=${x#installer.target.dev=}
+            installer_unattended=true
+        ;;
+        installer.target.overwrite*)
+            installer_target_overwrite="OVERWRITE"
+            installer_unattended=true
+        ;;
+    esac
+done
+
+## Check config
+all_values_set=false
+if [ -n "${installer_image_uri}" ] && [ -n "${installer_target_dev}" ] && [ -n "${installer_target_overwrite}" ]; then
+    all_values_set=true
+fi
+
+if ${installer_unattended} && ! ${all_values_set}; then
+    echo "When running in unattended mode all values needed for installation have to be set! -> Abort"
+    exit 1
+fi
+
+if ${installer_unattended}; then
+    echo "Got config:"
+    echo "  installer_unattended=${installer_unattended}"
+    echo "  installer_image_uri=${installer_image_uri}"
+    echo "  installer_target_dev=${installer_target_dev}"
+    echo "  installer_target_overwrite=${installer_target_overwrite}"
+
+    case ${installer_target_overwrite} in
+        OVERWRITE|ABORT)
+        ;;
+        *)
+            echo "When running in unattended mode only \"installer_target_overwrite=OVERWRITE | ABORT\" is valid! You specified \"${installer_target_overwrite}\" -> Abort"
+            exit 1
+        ;;
+    esac
+
+    if [ ! -b ${installer_target_dev} ]; then
+        echo "Target device \"${installer_target_dev}\" is not a valid block device. -> Abort"
+        exit 1
+    fi
+
+    if [ ! -f "${installer_image_uri}" ]; then
+        if [ ! -f "$installdata/${installer_image_uri}" ]; then
+            echo "Could not find image file ${installer_image_uri} nor $installdata/${installer_image_uri} to install. -> Abort"
+            exit 1
+        else
+            installer_image_uri=$installdata/${installer_image_uri}
+        fi
+    fi
+fi
-- 
2.43.0

-- 
You received this message because you are subscribed to the Google Groups "isar-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/isar-users/20241008102235.34078-2-alexander.heinisch%40siemens.com.

  reply	other threads:[~2024-10-08 10:23 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-08 10:22 [PATCH 0/2] " alexander.heinisch via isar-users
2024-10-08 10:22 ` alexander.heinisch via isar-users [this message]
2024-10-08 10:22 ` [PATCH 2/2] meta-isar: Unified variable names in deploy-image script alexander.heinisch via isar-users
2024-10-14 17:28 ` [PATCH 0/2] Added unattended mode for deploy-image-wic installer script Uladzimir Bely

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241008102235.34078-2-alexander.heinisch@siemens.com \
    --to=isar-users@googlegroups.com \
    --cc=alexander.heinisch@siemens.com \
    --cc=jan.kiszka@siemens.com \
    --cc=quirin.gylstorff@siemens.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox