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, 22 Sep 2025 19:16:34 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-qk1-f187.google.com (mail-qk1-f187.google.com [209.85.222.187]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 58MHGXP1021224 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 22 Sep 2025 19:16:34 +0200 Received: by mail-qk1-f187.google.com with SMTP id af79cd13be357-82e5940eeefsf1074077485a.1 for ; Mon, 22 Sep 2025 10:16:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1758561388; cv=pass; d=google.com; s=arc-20240605; b=IyCT7QqKv97ELrG66vwSZp95WD51vjA9UYAtf8MEmKciYkIN+T1qUbLbctNiWYkpL/ jDJulq4c4SYlqegmsOIKgYNFZ6IsUL/JJnTHOgBQQ7CkcFnTpRhHr6hUgVX3SPbiFBPq mL26JX3Mr+1hiWCoxk+PDkTtGSJVyd6cJzYMeJip3Jklh6/xtWtCMoiWYnTP8tsFOlIW IqxzvRXwJKg8BoVXX9h9N+2Hd61LnKBCeEyANUpI36MFCX70Hf6U7q6mxeUxtW+2trQ9 +WxH1gDGTeDD41U2D4iCpNA8B1tIA38pSTYQH0GkB1ED5JVDOAXN5fVUiz8PpdKsyd/s /PAA== 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=RJMIu3Y7b4rz5naG9B3OE6w/2FSL2XcSYImE2ICadOE=; b=RamBrEZmQy7D4IAhmoukHHZin4PcVUkoxqrxeU0oZFN3PJXn3VSA/AQ2D47RFU8aHX 9O56yJMiaY3KrRuYY8vuUEK2pYcjOVJtncxJdEo4xBXmjuegXpRZ6AdG1ceHKpDbL9kr 6rd2NCIYFOABnopNv1Df13MARpXQTh6HZupHHpe+sAwAfP4ZDuBsJLqRRMrnxc2h50LW wgPhX/MJBpvdNUdm/Atbq88C01M2Td2TlH6HjnN/6j9DM/x27PtBeHghvZ0L68RPoArG xyc0zG9ytXKerW0KfmgQHjtCknzgNPNjrU0ezzFyNuJoPSpKXbtg2xXvS9t7h2s+iXTb 3a+A==; darn=ilbers.de 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=1758561388; x=1759166188; 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 :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=UoY3/VeYtJh2xbaSlwhXfzfwzArrcl83Ru0/1qhIQ6xcm09LmRbHeW5uK9SUYkBUCu DBzhnBpP0FmGrpf0U0rxR3m5CVN+iWv5lo5L6U/gInOpaBtN8PuyOwB6jCX444Ycomw3 Uyb+v9AgrqGCMt3PoT4qYeKsYVNB/soSYamjcxTZTr3nYIu8V2vgwod8AHO7y9PUJ/cO L7UH81uMs5p1ZV0Z9WFHEf86y/D0rk2eLwjFOLkE4qsynI9gjHKGd/c+rUqZ4VQntOAd Dhb0EgTPoHUjG4aEY64DoX53f2Phj49rHCZWytN874cV/Kxm2cGhRFLXz2a58++NunfV 8+LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758561388; x=1759166188; 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=afVgCdCjuYBXBig9DolZwNtddvoLid4UiHIf5Y+csD9PRcIDeH9pIFByqOqMl2nCNR pupGuEKaFXy7RjuzNqZ5E81ec2DHISgha9EBaup4dWGv0P+FKCvDXGuvUR9RtcchVDeB 7B4oM/xTVwTNlhgJ3f+ka+vVHF34W/wAa+F3fZupV0clceQHJcYt06+y3haH8ft5RvLL S+f5gcZdeBrniDH1AaXOKKzHS5vWpKRB9EO4nWAQTUGRtGTzTZmWPu/VfIM3YxcjHYZI e3/nUhjqF0vox+H1HBSu5r+mbKXOo0sx+taxPWzjL4BBljmV0qdb3c49HYxBDJcMcBXH QmCQ== X-Forwarded-Encrypted: i=2; AJvYcCV8Vo7Fox7U+3lejofgoNiHHkdJhnqMNtnAnk45bqYqfwC4+4BHLuL3fDDaJs5JuE0OBtlN@ilbers.de X-Gm-Message-State: AOJu0Yx9nCKbHPzqi7TP9/pk+BWfwOxRRvEasI2mLxNGzFbJOa0V4Sjy 1V4dPhxje6B+5bjSwwota0u/UinW92qFCqoS28vqXp0M4IlRDfHLOpn2 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 From: "alexander.heinisch via isar-users" 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 Content-Type: text/plain; charset="UTF-8" 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-TUID: a6uZgPWv4xC3 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/ +} -- 2.39.5 -- 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 visit https://groups.google.com/d/msgid/isar-users/20250922170445.1393839-3-alexander.heinisch%40siemens.com.