From 5eb3baddb4d584e206c1c6a9d6a0781b61ef9e8f Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Sun, 5 Apr 2026 19:21:10 +0300 Subject: [PATCH] Fix bee-boot-status blank screen caused by variable buffering Command substitution in sh strips trailing newlines, so accumulating output in a variable via $(...) lost all line breaks. Reverted to direct printf calls which work correctly. Co-Authored-By: Claude Sonnet 4.6 --- iso/overlay/usr/local/bin/bee-boot-status | 91 +++++++++-------------- 1 file changed, 36 insertions(+), 55 deletions(-) diff --git a/iso/overlay/usr/local/bin/bee-boot-status b/iso/overlay/usr/local/bin/bee-boot-status index 2ea5e26..fdb7932 100644 --- a/iso/overlay/usr/local/bin/bee-boot-status +++ b/iso/overlay/usr/local/bin/bee-boot-status @@ -2,55 +2,40 @@ # bee-boot-status — boot progress display on tty1. # Shows live service status until all bee services are done or failed, # then exits so getty can show the login prompt. -# GUI (lightdm) starts independently without waiting for this. -# Services to wait for before handing off to login prompt. CRITICAL="bee-preflight bee-nvidia bee-audit" - -# Services shown with details. ALL="bee-sshsetup ssh bee-network bee-nvidia bee-preflight bee-audit bee-web" -svc_state() { - systemctl is-active "$1.service" 2>/dev/null || echo "inactive" -} +svc_state() { systemctl is-active "$1.service" 2>/dev/null || echo "inactive"; } svc_icon() { case "$(svc_state "$1")" in - active) printf '\033[32m[ OK ]\033[0m' ;; - failed) printf '\033[31m[ FAIL ]\033[0m' ;; - activating) printf '\033[33m[ .. ]\033[0m' ;; + active) printf '\033[32m[ OK ]\033[0m' ;; + failed) printf '\033[31m[ FAIL ]\033[0m' ;; + activating) printf '\033[33m[ .. ]\033[0m' ;; deactivating) printf '\033[33m[ stop ]\033[0m' ;; - inactive) printf '\033[90m[ ]\033[0m' ;; - *) printf '\033[90m[ ? ]\033[0m' ;; + inactive) printf '\033[90m[ ]\033[0m' ;; + *) printf '\033[90m[ ? ]\033[0m' ;; esac } svc_detail() { - local svc="$1" - local state + local svc="$1" state state="$(svc_state "$svc")" - case "$state" in failed) - # Show why it failed - local msg - msg="$(systemctl show -p Result "$svc.service" 2>/dev/null | cut -d= -f2)" - [ -n "$msg" ] && [ "$msg" != "success" ] && printf ' \033[31m(%s)\033[0m' "$msg" + local res + res="$(systemctl show -p Result "$svc.service" 2>/dev/null | cut -d= -f2)" + [ -n "$res" ] && [ "$res" != "success" ] && printf ' \033[31m(%s)\033[0m' "$res" ;; activating) - # Show last journal line local line - line="$(journalctl -u "$svc.service" -n 1 --no-pager --output=cat 2>/dev/null | head -c 60)" - [ -n "$line" ] && printf ' \033[90m%s\033[0m' "$line" + line="$(journalctl -u "$svc.service" -n 1 --no-pager --output=cat 2>/dev/null | cut -c1-55)" + [ -n "$line" ] && printf ' \033[90m%s\033[0m' "$line" ;; esac } -get_ips() { - ip -4 addr show scope global 2>/dev/null \ - | awk '/inet /{printf " %s\t%s\n", $NF, $2}' -} - all_critical_done() { for svc in $CRITICAL; do case "$(svc_state "$svc")" in @@ -62,47 +47,43 @@ all_critical_done() { } while true; do - # Build frame in a variable to reduce flicker - out="" - out="${out}$(printf '\033[H\033[2J')" - out="${out}$(printf '\n')" - out="${out}$(printf ' \033[33m███████╗ █████╗ ███████╗██╗ ██╗ ██████╗ ███████╗███████╗\033[0m\n')" - out="${out}$(printf ' \033[33m██╔════╝██╔══██╗██╔════╝╚██╗ ██╔╝ ██╔══██╗██╔════╝██╔════╝\033[0m\n')" - out="${out}$(printf ' \033[33m█████╗ ███████║███████╗ ╚████╔╝ █████╗██████╔╝█████╗ █████╗\033[0m\n')" - out="${out}$(printf ' \033[33m██╔══╝ ██╔══██║╚════██║ ╚██╔╝ ╚════╝██╔══██╗██╔══╝ ██╔══╝\033[0m\n')" - out="${out}$(printf ' \033[33m███████╗██║ ██║███████║ ██║ ██████╔╝███████╗███████╗\033[0m\n')" - out="${out}$(printf ' \033[33m╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝\033[0m\n')" - out="${out}$(printf ' Hardware Audit LiveCD\n')" - out="${out}$(printf '\n')" + # move to top-left and clear screen + printf '\033[H\033[2J' + + printf '\n' + printf ' \033[33m███████╗ █████╗ ███████╗██╗ ██╗ ██████╗ ███████╗███████╗\033[0m\n' + printf ' \033[33m██╔════╝██╔══██╗██╔════╝╚██╗ ██╔╝ ██╔══██╗██╔════╝██╔════╝\033[0m\n' + printf ' \033[33m█████╗ ███████║███████╗ ╚████╔╝ █████╗██████╔╝█████╗ █████╗\033[0m\n' + printf ' \033[33m██╔══╝ ██╔══██║╚════██║ ╚██╔╝ ╚════╝██╔══██╗██╔══╝ ██╔══╝\033[0m\n' + printf ' \033[33m███████╗██║ ██║███████║ ██║ ██████╔╝███████╗███████╗\033[0m\n' + printf ' \033[33m╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝\033[0m\n' + printf ' Hardware Audit LiveCD\n' + printf '\n' - # Services for svc in $ALL; do - out="${out}$(printf ' %s %-20s%s\n' "$(svc_icon "$svc")" "$svc" "$(svc_detail "$svc")")" + printf ' %s %-20s%s\n' "$(svc_icon "$svc")" "$svc" "$(svc_detail "$svc")" done - out="${out}$(printf '\n')" + printf '\n' # Network - ips="$(get_ips)" + ips="$(ip -4 addr show scope global 2>/dev/null | awk '/inet /{printf " %-16s %s\n", $NF, $2}')" if [ -n "$ips" ]; then - out="${out}$(printf ' \033[1mNetwork:\033[0m\n')" - out="${out}$(printf '%s\n' "$ips")" - out="${out}$(printf '\n')" + printf ' \033[1mNetwork:\033[0m\n' + printf '%s\n' "$ips" + printf '\n' fi - # Status line if all_critical_done; then - out="${out}$(printf ' \033[1mSystem ready.\033[0m Audit is running in the background.\n')" - if [ -n "$ips" ]; then - first_ip="$(echo "$ips" | awk '{print $2}' | cut -d/ -f1 | head -1)" - out="${out}$(printf ' Web UI: \033[1mhttp://%s/\033[0m\n' "$first_ip")" + printf ' \033[1;32mSystem ready.\033[0m Audit is running in the background.\n' + first_ip="$(ip -4 addr show scope global 2>/dev/null | awk '/inet /{print $2}' | cut -d/ -f1 | head -1)" + if [ -n "$first_ip" ]; then + printf ' Web UI: \033[1mhttp://%s/\033[0m\n' "$first_ip" fi - printf '%s\n' "$out" + printf '\n' sleep 3 break - else - out="${out}$(printf ' \033[90mStarting up...\033[0m\n')" fi - printf '%s' "$out" + printf ' \033[90mStarting up...\033[0m\n' sleep 3 done