From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,MISSING_DATE,MISSING_MID, NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.1 From: "Leonid Krivoshein" To: make-initrd@lists.altlinux.org Subject: [make-initrd] [PATCH v6 21/22] bootchain-core: adds ability to bring the daemon to the foreground X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Date: Sun, 24 Oct 2021 17:23:22 -0000 X-List-Received-Date: Sun, 24 Oct 2021 17:23:22 -0000 Message-ID: <20211024172322.5RIcn8xCHL_0UjB7aNITA5FWO9k8B-0pN4PA-ZCs-tg@z> Archived-At: List-Archive: Also introduces configuration parameter BC_FGVT_ACTIVATE and new pseudo-step "fg". This is only works together with the "bootchain-interactive" feature included to initramfs. Jointly features "bootchain-core" and "bootchain- interactive" they lay the foundation for building simple text installers in the stage1. See README.md for more details. Signed-off-by: Leonid Krivoshein --- features/bootchain-core/README.md | 16 +++++++ .../data/bin/bootchain-sh-functions | 2 + features/bootchain-core/data/sbin/chaind | 45 ++++++++++++++++--- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/features/bootchain-core/README.md b/features/bootchain-core/README.md index ab89181..943b4b0 100644 --- a/features/bootchain-core/README.md +++ b/features/bootchain-core/README.md @@ -50,11 +50,18 @@ us to optimize fill in `initramfs` only which we are need. - Modularity: loading methods are initially separated from the common code and daemon. +- Provides the ability to bring the daemon to the foreground at any time. This + restarts the `chaind` process on a specific terminal, although initially the + daemon is started in the background. - Some steps (actions) are built directly into the code of the main loop of the `chaind` daemon, external scripts are not called to execute them. Such pseudo-steps allow you to control, basically, the internal state of the daemon and should not be taken into account in the boot chain, as if they are hidden. +- Optionally, the daemon can work in conjunction with the `bootchain-interactive` + feature, can move to the foreground and continue working on a specific terminal, + by default, tty2. Jointly features `bootchain-core` and `bootchain-interactive` + they lay the foundation for building simple text installers in stage1. - The `chaind` daemon allows you to overload the chain with a new set of steps, thanks to this, you can change the logic of work "on the fly", support loops and conditional jumps, in text dialogs it is an opportunity to go back. @@ -147,6 +154,11 @@ parameters: should be output in the background. By default, the value is 3, respectively, the log is output to tty3. An empty value allows you to disable log output to any terminal. +- `BC_FGVT_ACTIVATE` - delay in seconds before activating the interactive + terminal, by default tty2 is activated after 2 seconds in debug mode + or after 8 seconds in normal mode. An empty value instructs to activate + the interactive terminal immediately. This configuration option only works + together with the `bootchain-interactive` features included in initramfs. - `BC_LOGFILE` - the full path to the log file or the name of a special device, to which debugging messages will be output. In NATIVE mode, the default value is `/var/log/chaind.log`, in COMPATIBILITY mode with `pipeline` the default @@ -165,6 +177,10 @@ embedded in the code of the main loop of the `boot chain-loop` daemon, do not need additional parameters and should not be taken into account when addressing, as if they are hidden. +- `fg` - provides the transfer of the daemon to interactive mode when building + initramfs with `bootchain-interactive` features. The `bootchain-core` itself + is not interactivity required, but some other steps may need it, such as + `altboot`. - `noop` - does not perform any actions and is designed to pull off the results on the of the previous step from the of the next step, which can be useful, for example, when we don`t want the results of the `waitdev` step diff --git a/features/bootchain-core/data/bin/bootchain-sh-functions b/features/bootchain-core/data/bin/bootchain-sh-functions index 3a9ec6b..743a8f9 100644 --- a/features/bootchain-core/data/bin/bootchain-sh-functions +++ b/features/bootchain-core/data/bin/bootchain-sh-functions @@ -25,6 +25,8 @@ else pipeline_mode= fi +[ -n "$BC_DEBUG" ] && BC_FGVT_ACTIVATE=1 || + BC_FGVT_ACTIVATE="${BC_FGVT_ACTIVATE:-7}" BC_NEXTCHAIN=/.initrd/bootchain/bootchain.next BC_PASSED=/.initrd/bootchain/passed handlerdir=/lib/bootchain diff --git a/features/bootchain-core/data/sbin/chaind b/features/bootchain-core/data/sbin/chaind index e8ce94a..68a1aae 100755 --- a/features/bootchain-core/data/sbin/chaind +++ b/features/bootchain-core/data/sbin/chaind @@ -2,11 +2,12 @@ . bootchain-sh-functions -bcretry=1 +bcretry="${bcretry:-1}" pidfile="/var/run/$PROG.pid" -chainsteps="$BOOTCHAIN" -stepnum=0 -prevdir= +chainsteps="${chainsteps-}" +stepnum="${stepnum:-0}" +prevdir="${prevdir-}" +BC_IM_supported= exit_handler() @@ -25,6 +26,8 @@ debug() } +# Only when daemon started first time +if [ "x${1-}" != "x--foreground" ]; then [ ! -f "$pidfile" ] || fatal "already running" set_cleanup_handler exit_handler @@ -57,12 +60,44 @@ debug() mountpoint -q -- "$mntdir" || run mount -t tmpfs tmpfs "$mntdir" ||: + chainsteps="$BOOTCHAIN" +fi + +# Check that interactive mode supports +if has_feature bootchain-interactive; then + . interactive-sh-functions + + [ "x${1-}" != "x--foreground" ] || + IM_activate "$BC_FGVT_ACTIVATE" "$BC_LOGFILE" + BC_IM_supported=1 +fi + rc=0 while [ -n "$chainsteps" ]; do name="${chainsteps%%,*}" exe="$handlerdir/$name" - if [ "$name" = noop ]; then + if [ "$name" = fg ]; then + [ -n "$BC_IM_supported" ] || + fatal "bootchain-interactive feature required" + assign "callnum" "\${callnum_$name:-0}" + chainsteps="${chainsteps#$name}" + chainsteps="${chainsteps#,}" + + if IM_is_active; then + message "[$callnum] Step '$name' has ignored" + else + message "[$callnum] Switching to foreground" + + callnum=$((1 + $callnum)) + assign "callnum_$name" "\$callnum" + + export stepnum chainsteps callnum_fg prevdir bcretry + + IM_exec "$0" --foreground + fi + + elif [ "$name" = noop ]; then chainsteps="${chainsteps#$name}" chainsteps="${chainsteps#,}" prevdir= -- 2.24.1