From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Mon, 08 Jun 2026 07:19:54 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-pf1-f185.google.com (mail-pf1-f185.google.com [209.85.210.185]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 6585Jqp8028720 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 8 Jun 2026 07:19:53 +0200 Received: by mail-pf1-f185.google.com with SMTP id d2e1a72fcca58-84233efcaadsf2663903b3a.1 for ; Sun, 07 Jun 2026 22:19:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1780895986; cv=pass; d=google.com; s=arc-20240605; b=V0dmy4eucaZz2OAQlWDjyIrecgAABqs2BF3PTNs8AyNph+kG58PKxoajDjRqojprZi rXXxW2C15c2o8lGNrgAxMqHSG9AZ5okuMPkCJrYp6mN4UOp13y7xC3HDKJgbaPqU9Xy+ CCnuekBVQA9AQwDqyl0Lo9eI4qrZ3CK4Y1ZyUIhoEY1ggOlyc79x7LNreSTflDEhk7Vt f9Og5AQqZ2M+m5FxIKPSPBGEk7XmYshTHgJnO9ClOoQj/ronlFOtn+z3tWYM21m8crNN wn5/g5fx1iW/l1o7R41X9hq35UPwZxmgldJLWRNbo5kJdyHEHnrsv2Rg+tAgDHLV93H+ DbpA== 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 :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=AH7IJhIl84+WWLyMRh3Zr/MTar123JOnWd/rqpQ0tPk=; fh=Uv4X5eZ5RMJL2jmnGZHvbiC02nYcLxYZGbdsMyPnBMM=; b=ciz+LfgFA0szjfvKbxxEwNfX5sq0lN+Rg9NLbY2YGcUO6p9d7xosDAl2DvSFiONtht L52WaK0KoAP4t38xEZvpGCg90dg1TO6J0WJq+5ibZycPQ42Oy7WZMYxH00TdBF6Chhfs 0WKm7Onf9rHaR7DQ0Vl6xEs0QiLj6DrT3Hm4yws0nWMl3W0QZoSzjj09D0hycXJp+JJZ HGCONCKf3qwNkBGCG//wJl0cfflZ91L08L3qWZB2KEzugcYA+2Ok80GNvCMNgC2F8svN UEkuHIWu4i04DAh24DtjnKhgWbFJipggOa9jwm4KJj873PsDTuZDJ7eh88Tf2ENyt6nw ZTQQ==; darn=ilbers.de ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=Pwd4IqZy; spf=pass (google.com: domain of fm-1328757-2026060805194353b1824e4700020751-x0cbrw@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328757-2026060805194353b1824e4700020751-x0CBRw@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=20251104; t=1780895986; x=1781500786; darn=ilbers.de; 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 :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AH7IJhIl84+WWLyMRh3Zr/MTar123JOnWd/rqpQ0tPk=; b=xnwXEr2rlZRrq87pj6k2GFpzDlvG3UU+2uiPd5NE5HQ9gc6Q1QWXLgV8B3xJxI8Rrd SZPPog4o4fBARjQaSjqypIzO2CS5LP3Y8bZwV+hcJIQ9TzAejJXHgvSOr4aoiIvFxCsz i0h8zIHe81f4qQXsvWg9jFNl5RXHcO5tc9uHKHsTbBE9BgOgfX4lQcD45VRuzLEzSxiI gGkeuZMFmjbCrR3uw0bkuL8hjHwv3NwG6YZHpqhCuOrSFZTCcTaK4AK/LcYVBUEgD1M+ VxaqJ86aW6A3ad6klgMzuhh0B8Dfcjn9j9K39+svNz+31mh6IJRKVZfkiJbq519bydqY AvSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780895986; x=1781500786; 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 :content-transfer-encoding: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=AH7IJhIl84+WWLyMRh3Zr/MTar123JOnWd/rqpQ0tPk=; b=GcTnAzpg3cmkvTTriL0d33tC4D3xgAFl+xtqoQI21MSSMVkw8vYbHwvp4w4++p7/td naXnyqjNbivfEVkhlqpMPQ3KEuw1zgGrkQfd9aB2U/1KI4njsO9fWUjU/Hcw+Kg5YKjJ GC3r6c5qSuWBS2d3wj0i5x7Kq0MmljCHLbJVy1uvk5dg9FuKDh6bx4ljR0h04YDDG9f0 631f8E4DwWIRg9LC5c+CK08AxKPZzClwVsKSGX9S/zmjI6XW9UaWsBCaDBryjURW3lZ+ xhXOors0pPAJQaOoj+7Uor6HFlkvgOtTnWqH34H5k95R5+U/09lT2F7v4WxHotvTkhUc IJwA== X-Forwarded-Encrypted: i=2; AFNElJ8dpG2YT7+Umjexx0AeQImAWPJ889DCHniGkOor0jet4vhv53LJG1UDcfNOQdRnzunB3kLE@ilbers.de X-Gm-Message-State: AOJu0Yyk/nO4DaWEFEV4+96E8PNfO4YBkUpwLtTPeZiJ5rkcVbbJePkj SbvVEbKsDJUVd9769wa9aMzO03dnyFG8AvuTZwPxzGKQ0Vg/U+FDRKvU X-Received: by 2002:a05:6a00:4510:b0:842:6e9f:9dc with SMTP id d2e1a72fcca58-842b10b308bmr13303746b3a.34.1780895986513; Sun, 07 Jun 2026 22:19:46 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com; h="AX0PUUeShhMF9B4/IoghGB0zqTkPiu+6y5HvCrsmB8MEOUz/cw==" Received: by 2002:a05:6a00:a8d:b0:82a:6b57:a7a6 with SMTP id d2e1a72fcca58-8429cd3a247ls4361483b3a.2.-pod-prod-02-us; Sun, 07 Jun 2026 22:19:45 -0700 (PDT) X-Received: by 2002:a05:6a20:7490:b0:3b2:86c9:baa5 with SMTP id adf61e73a8af0-3b4ccfdbb5dmr16955088637.38.1780895985027; Sun, 07 Jun 2026 22:19:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780895985; cv=none; d=google.com; s=arc-20240605; b=IFNWqD/WXWMGnwY+yVRBYG2b5A/OL+DFYZqeWKECjvg2MbY6VEbEtmgh+sSD7qMkQc 7mcn1W2pqS2hWDe7eX/1Ir5Tihj5bexL2fr306mc54iyFWI3kGVTM4C6UadhuQTXnxvH btqqOELGKJnhp8E5TQ9K3VRDf8wjvVRL6VjLCAHR2UWkieomI9EJisNpgpBzu4Ox7ARO iT3KZC0nTK+BKae4W3RYMzxUeGDeAM/yNcCkCT8jKrLo57UFPWWUmqyZbVMZZMlRNhoP MXnmPdNwz1m6IJUOcxYOnX4RI+UFoykqwa2+icEoBS4SxNEirOh1nN8TibWUy5r6vNez /IEQ== 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=ukvus698i4Fg7M59mfl1qbqT+qDigW87Jl2QKddtQxI=; fh=pR4tJPO4NbHlIB/rP4bIo54Z1zh5hd/ksAGQ0tcKkYM=; b=JOPj/2SpHI5mCwJ4ZFXUFOnQUw/cXig92PN65zTEifKlaZlZJlnuYrS+7UOFPp975w kG2t2PV5X8hDCuyJVWKKuD1yR5AKN0bzq40rzCNP5QQdI9rGjm4zNOqzCk+oUQcPvplv eJXztX5b9jQbSkFllbppKyUsbEmg1pgeZShDYy6UTu5yeUq5U46QRpzM9qr/0k0qQO/B 2GgTJCZCWFFDQ79ncb1uKnMIkMBJ4RU0Or6ZdpnY+b/sRp9D1G92f5prFj98acHpyoK6 c01DAEoP3BkceJR5f8nJA8UUPvwIgugiqpRaujpUlEsd6/8wI3z1rRLNUpS6nLP5PF3V bMTw==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=Pwd4IqZy; spf=pass (google.com: domain of fm-1328757-2026060805194353b1824e4700020751-x0cbrw@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328757-2026060805194353b1824e4700020751-x0CBRw@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net. [185.136.65.227]) by gmr-mx.google.com with ESMTPS id 41be03b00d2f7-c85df08cc94si474019a12.6.2026.06.07.22.19.44 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 07 Jun 2026 22:19:45 -0700 (PDT) Received-SPF: pass (google.com: domain of fm-1328757-2026060805194353b1824e4700020751-x0cbrw@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) client-ip=185.136.65.227; Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 2026060805194353b1824e4700020751 for ; Mon, 08 Jun 2026 07:19:43 +0200 From: "'Kasturi shekar' via isar-users" To: isar-users@googlegroups.com Cc: Kasturi Shekar Subject: [PATCH v3 2/4] installer: extract attended UI to installer_ui.sh Date: Mon, 8 Jun 2026 10:47:33 +0530 Message-ID: <20260608051737.946413-3-kasturi.shekar@siemens.com> In-Reply-To: <20260608051737.946413-1-kasturi.shekar@siemens.com> References: <8b658081-ce7b-4ffc-b108-1691f5a8ceaf@ilbers.de> <20260608051737.946413-1-kasturi.shekar@siemens.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1328757:519-21489:flowmailer X-Original-Sender: kasturi.shekar@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=Pwd4IqZy; spf=pass (google.com: domain of fm-1328757-2026060805194353b1824e4700020751-x0cbrw@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328757-2026060805194353b1824e4700020751-x0CBRw@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com X-Original-From: Kasturi shekar Reply-To: Kasturi shekar 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_H3,RCVD_IN_MSPIKE_WL, 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-TUID: qj9bzsEcqPQb From: Kasturi Shekar Move attended dialog interactions into installer_ui.sh The new UI module provides: - image selection menu - target device selection menu - install and overwrite confirmation dialogs - error and info dialogs - attended progress gauge hooks Signed-off-by: Kasturi Shekar --- .../files/usr/bin/installer_ui.sh | 217 +++++++++++++----- 1 file changed, 161 insertions(+), 56 deletions(-) mode change 100755 =3D> 100644 meta-isar/recipes-installer/deploy-image/fi= les/usr/bin/installer_ui.sh diff --git a/meta-isar/recipes-installer/deploy-image/files/usr/bin/install= er_ui.sh b/meta-isar/recipes-installer/deploy-image/files/usr/bin/installer= _ui.sh old mode 100755 new mode 100644 index 33685c6f..9d3ba5de --- a/meta-isar/recipes-installer/deploy-image/files/usr/bin/installer_ui.s= h +++ b/meta-isar/recipes-installer/deploy-image/files/usr/bin/installer_ui.s= h @@ -1,86 +1,191 @@ #!/usr/bin/env bash +# This software is a part of ISAR. +# Copyright (C) Siemens AG, 2026 # -# installer_ui.sh =E2=80=94 Attended installer frontend -# ------------------------------------------------ +# SPDX-License-Identifier: MIT =20 -SCRIPT_DIR=3D"$(CDPATH=3D cd -- "$(dirname -- "$0")" && pwd)" -INSTALL_DATA=3D${INSTALL_DATA:-./install} +#-------------------------------------------------------------------------= - +# installer_ui.sh - Frontend/UI helpers for isar installer. +# +# This file is intentionally UI-only: +# - dialog menus and message boxes +# - attended confirmations +# - user abort countdown handling +#-------------------------------------------------------------------------= - +UI_GAUGE_PID=3D"" + +#-------------------------------------------------------------------------= - +# ui_show_error +# +# Displays an error dialog in attended mode. +#-------------------------------------------------------------------------= - +ui_show_error() { + local message=3D"$1" + dialog --msgbox "$message" 6 60 +} =20 -# Backend APIs -. "$SCRIPT_DIR/sys_api.sh" +#-------------------------------------------------------------------------= - +# ui_show_info +# +# Displays an informational dialog in attended mode. +#-------------------------------------------------------------------------= - +ui_show_info() { + local message=3D"$1" + dialog --msgbox "$message" 6 60 +} + +#-------------------------------------------------------------------------= - +# ui_countdown_allow_attended_switch +# +# In unattended mode, this gives users a chance to switch to attended +# mode by pressing any key. Returns 0 when attended mode should be +# used, and 1 otherwise. +#-------------------------------------------------------------------------= - +ui_countdown_allow_attended_switch() { + local timeout=3D"$1" + local abort_file=3D"$2" + local i + + # Countdown loop prints a message once per second and accepts a key pr= ess. + # If any key is pressed, create the abort trigger file for the caller. + for ((i=3Dtimeout; i>0; i--)); do + echo -ne "\rUnattended installation will start in $i seconds. Pres= s any key to switch to attended mode..." + + if [ -f "$abort_file" ] || read -n 1 -t 1; then + touch "$abort_file" + echo + return 0 + fi + done =20 -# ------------------------------------------------ -# Helpers -# ------------------------------------------------ -die() { - dialog --msgbox "$1" 6 60 - exit 1 + echo + return 1 } =20 -# ------------------------------------------------ -# UI: Select image -# ------------------------------------------------ -ui_select_image() { - local images json list=3D() +#-------------------------------------------------------------------------= - +# ui_select_image_menu +# +# Uses sys_list_installable_entries backend API and returns selected +# relative image path on stdout. +#-------------------------------------------------------------------------= - +ui_select_image_menu() { + local install_data_dir=3D"$1" + local list=3D() + local entry + local selected =20 - # On failure, show error dialog and exit - json=3D$(sys_locate_disk_images search_path=3D"$INSTALL_DATA") || \ - die "No installable images found in $INSTALL_DATA" + while IFS=3D read -r entry; do + [ -n "$entry" ] || continue + list+=3D("$entry" "$entry") + done < <(sys_list_installable_entries "$install_data_dir") =20 - # Extract image paths from JSON - images=3D$(echo "$json" | sed -n 's/.*"images":\[\(.*\)\].*/\1/p' | tr= -d '"' | tr ',' '\n') + if [ "${#list[@]}" -eq 0 ]; then + return 1 + fi =20 - # Building dialog menu entries - for img in $images; do - base=3D$(basename "$img") - list+=3D("$img" "$base") - done + selected=3D$(dialog --no-tags \ + --menu "Select image to be installed" 12 70 6 \ + "${list[@]}" --output-fd 1) || return 2 =20 - # Display menu and capture selection - INSTALL_IMAGE=3D$(dialog --no-tags \ - --menu "Select image to install" 10 70 5 \ - "${list[@]}" \ - --output-fd 1) || exit 0 + echo "$selected" + return 0 } =20 -# ------------------------------------------------ -# UI: Select target device -# ------------------------------------------------ -ui_select_target_device() { +#-------------------------------------------------------------------------= - +# ui_select_target_device_menu +# +# Displays candidate target devices and returns selected /dev path. +#-------------------------------------------------------------------------= - +ui_select_target_device_menu() { local list=3D() + local target + local target_size + local state + local selected =20 - devices=3D$(sys_list_valid_target_devices) || \ - die "No valid target devices found" + for target in "$@"; do + [ -b "$target" ] || continue =20 - for dev in $devices; do - [ -b "$dev" ] || continue + target_size=3D$(sys_device_size "$target") + [ -n "$target_size" ] || target_size=3D"unknown" =20 - size=3D$(lsblk --nodeps --noheadings -o SIZE "$dev" 2>/dev/null | = tr -d " ") - [ -z "$size" ] && size=3D"unknown" - - if cmp /dev/zero "$dev" -n 1M >/dev/null 2>&1; then + # Indicate whether the selected device is already empty, to help u= sers + # avoid accidental overwrite of data. + if sys_device_is_empty "$target"; then state=3D"empty" else state=3D"contains data" fi =20 - list+=3D("$dev" "$dev ($size, $state)") + list+=3D("$target" "$target ($target_size, $state)") done =20 - if [ "${#list[@]}" -lt 2 ]; then - die "no installable target devices available" + if [ "${#list[@]}" -eq 0 ]; then + return 1 fi =20 - TARGET_DEVICE=3D$(dialog --no-tags \ - --menu "Select target device" 10 70 6 \ - "${list[@]}" \ - --output-fd 1) || exit 0 + selected=3D$(dialog --no-tags \ + --menu "Select device to install image to" 12 70 6 \ + "${list[@]}" --output-fd 1) || return 2 + + echo "$selected" + return 0 } =20 -run_interactive_installer() { - clear - ui_select_image - ui_select_target_device +#-------------------------------------------------------------------------= - +# ui_confirm_install +# +# Returns: +# 0 when user confirms, 1 when canceled. +#-------------------------------------------------------------------------= - +ui_confirm_install() { + local image_path=3D"$1" + local target_device=3D"$2" + local target_size=3D"$3" + + dialog --yes-label Ok --no-label Cancel \ + --yesno "Start installing\n'$image_path'\nto $target_device (capac= ity: $target_size)" 8 70 +} + +#-------------------------------------------------------------------------= - +# ui_confirm_overwrite +# +# Returns: +# 0 when user accepts overwrite, 1 when canceled. +#-------------------------------------------------------------------------= - +ui_confirm_overwrite() { + dialog --defaultno --yesno "WARNING: Target device is not empty! Conti= nue anyway?" 8 70 +} + +#-------------------------------------------------------------------------= - +# ui_start_progress_gauge +# +# Opens a dialog gauge and updates it from bmaptool psplash pipe. +#-------------------------------------------------------------------------= - +ui_start_progress_gauge() { + local pipe_path=3D"$1" + + ( + while true; do + if read -r line < "$pipe_path"; then + percentage=3D$(echo "$line" | awk '{ print $2 }') + echo "$percentage" + fi + done + ) | dialog --gauge "Flashing image, please wait..." 10 70 0 & + + UI_GAUGE_PID=3D$! +} + +#-------------------------------------------------------------------------= - +# ui_stop_progress_gauge +# +# Best-effort termination of the active progress gauge process. +#-------------------------------------------------------------------------= - +ui_stop_progress_gauge() { + if [ -n "$UI_GAUGE_PID" ]; then + kill "$UI_GAUGE_PID" 2>/dev/null || true + UI_GAUGE_PID=3D"" + fi } =20 -run_interactive_installer --=20 2.47.3 --=20 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 e= mail to isar-users+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/isar-users/= 20260608051737.946413-3-kasturi.shekar%40siemens.com.