mirror of
https://github.com/stornic56/debianito-post-install.git
synced 2026-10-31 13:08:06 +00:00
KDE: add bookworm Wayland gate and release-aware SDDM session probe
Bookworm's plasma-workspace ships only the X11 session; the Wayland session (plasmawayland.desktop) lives in the separate plasma-workspace-wayland package (a Recommends of plasma-desktop, now listed explicitly for the same determinism as the explicit sddm). The package does not exist on trixie, where plasma-workspace integrates Wayland natively, so naming it off-bookworm would fail the apt transaction: resolve it once per installer with _kde_wayland_pkg() and build the package list in a conditional array so neither the pre-apply summary nor the apt command ever shows an empty argument. Also correct the header comment: bookworm still defaults SDDM to the X11 session, while trixie makes Wayland primary (plasma.desktop in wayland-sessions) with plasmax11.desktop as the X11 fallback. Replace the hard-coded SDDM autologin session cascade with an existence-based ordered probe (_sddm_session_candidates) that prefers Wayland across releases, keeps the LXQt sessions last for when the module starts offering LXQt, and reads its session roots from SESSION_DIR_WAYLAND / SESSION_DIR_X11 for hermetic testing. Extend tests/desktops.bats with 13 offline tests: gate helper output on bookworm/trixie, captured apt commands for both installers, summary content (no empty package line), and the ordered session probe against fixture trees.
This commit is contained in:
@@ -299,6 +299,29 @@ configure_gdm3() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Ordered session candidates for SDDM autologin:
|
||||||
|
# Wayland first, then X11, per release. Existence
|
||||||
|
# decides (no codename gates). The LXQt sessions
|
||||||
|
# stay last for when the module starts offering LXQt.
|
||||||
|
_sddm_session_candidates() {
|
||||||
|
local wayland_dir="${SESSION_DIR_WAYLAND:-/usr/share/wayland-sessions}"
|
||||||
|
local x11_dir="${SESSION_DIR_X11:-/usr/share/xsessions}"
|
||||||
|
local candidate
|
||||||
|
for candidate in \
|
||||||
|
"$wayland_dir/plasmawayland.desktop" \
|
||||||
|
"$wayland_dir/plasma.desktop" \
|
||||||
|
"$x11_dir/plasma.desktop" \
|
||||||
|
"$x11_dir/plasmax11.desktop" \
|
||||||
|
"$wayland_dir/lxqt-wayland.desktop" \
|
||||||
|
"$x11_dir/lxqt.desktop"; do
|
||||||
|
if [ -f "$candidate" ]; then
|
||||||
|
basename "$candidate" .desktop
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
configure_sddm() {
|
configure_sddm() {
|
||||||
while true; do
|
while true; do
|
||||||
local choice
|
local choice
|
||||||
@@ -317,19 +340,11 @@ configure_sddm() {
|
|||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
local sddm_session=""
|
local sddm_session=""
|
||||||
|
sddm_session=$(_sddm_session_candidates)
|
||||||
local sddm_user="${SUDO_USER:-}"
|
local sddm_user="${SUDO_USER:-}"
|
||||||
if [ -z "$sddm_user" ] || [ "$sddm_user" = "root" ]; then
|
if [ -z "$sddm_user" ] || [ "$sddm_user" = "root" ]; then
|
||||||
sddm_user=$(awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd | head -1)
|
sddm_user=$(awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd | head -1)
|
||||||
fi
|
fi
|
||||||
if [ -f /usr/share/wayland-sessions/plasmawayland.desktop ]; then
|
|
||||||
sddm_session="plasmawayland"
|
|
||||||
elif [ -f /usr/share/wayland-sessions/lxqt-wayland.desktop ]; then
|
|
||||||
sddm_session="lxqt-wayland"
|
|
||||||
elif [ -f /usr/share/xsessions/plasma.desktop ]; then
|
|
||||||
sddm_session="plasma"
|
|
||||||
elif [ -f /usr/share/xsessions/lxqt.desktop ]; then
|
|
||||||
sddm_session="lxqt"
|
|
||||||
fi
|
|
||||||
sudo mkdir -p /etc/sddm.conf.d
|
sudo mkdir -p /etc/sddm.conf.d
|
||||||
cat <<EOF | sudo tee /etc/sddm.conf.d/autologin.conf >/dev/null
|
cat <<EOF | sudo tee /etc/sddm.conf.d/autologin.conf >/dev/null
|
||||||
[Autologin]
|
[Autologin]
|
||||||
|
|||||||
@@ -1,10 +1,32 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# desktop_kde.sh — KDE Plasma desktop installer (SP2)
|
# desktop_kde.sh — KDE Plasma desktop installer (SP2)
|
||||||
# Full: kde-standard + sddm | Minimal: kde-plasma-desktop + sddm
|
# Full: kde-standard + sddm | Minimal: kde-plasma-desktop + sddm
|
||||||
# Bookworm ships Plasma 5.27.5; Wayland is the default
|
# bookworm: Plasma 5.27.5 / KF5 / Qt5; SDDM defaults to
|
||||||
# session since Debian 12.
|
# X11 (plasma.desktop in xsessions); Wayland is optional
|
||||||
|
# via plasma-workspace-wayland (plasmawayland.desktop).
|
||||||
|
# trixie: Plasma 6.3.6 / KF6 / Qt6; Wayland is the
|
||||||
|
# primary session (plasma.desktop in wayland-sessions),
|
||||||
|
# X11 the alternative (plasmax11.desktop). sddm is only
|
||||||
|
# Recommends in the meta-kde chain, so the explicit sddm
|
||||||
|
# in both routes is what guarantees the DM (and
|
||||||
|
# xserver-xorg/xauth, hard deps of sddm in both releases).
|
||||||
# License GPL v3
|
# License GPL v3
|
||||||
|
|
||||||
|
# plasma-workspace-wayland exists only on bookworm:
|
||||||
|
# bookworm's plasma-workspace ships the X11 session only,
|
||||||
|
# and the Wayland session (plasmawayland.desktop) lives
|
||||||
|
# in this separate package (a Recommends of plasma-desktop,
|
||||||
|
# listed explicitly for the same determinism as the
|
||||||
|
# explicit sddm). trixie integrates Wayland into
|
||||||
|
# plasma-workspace itself and the package does not exist
|
||||||
|
# there (packages.debian.org/trixie/plasma-workspace-wayland),
|
||||||
|
# so naming it off-bookworm would fail the apt transaction.
|
||||||
|
_kde_wayland_pkg() {
|
||||||
|
case "${DEBIAN_CODENAME:-}" in
|
||||||
|
bookworm) printf '%s\n' "plasma-workspace-wayland" ;;
|
||||||
|
*) printf '%s\n' "" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
kde_menu() {
|
kde_menu() {
|
||||||
while true; do
|
while true; do
|
||||||
local -a kd_items=()
|
local -a kd_items=()
|
||||||
@@ -27,8 +49,15 @@ kde_menu() {
|
|||||||
|
|
||||||
_install_kde_full() {
|
_install_kde_full() {
|
||||||
# Pre-apply summary: confirm the selection before any
|
# Pre-apply summary: confirm the selection before any
|
||||||
# debconf or apt transaction starts.
|
# debconf or apt transaction starts. The Wayland
|
||||||
_confirm_install_list "KDE Plasma Full" kde-standard sddm || return
|
# session package is resolved once (bookworm only;
|
||||||
|
# the package does not exist on trixie) so the
|
||||||
|
# summary lists exactly what apt will install.
|
||||||
|
local wayland_pkg
|
||||||
|
wayland_pkg=$(_kde_wayland_pkg)
|
||||||
|
local -a pkgs=(kde-standard sddm)
|
||||||
|
[ -n "$wayland_pkg" ] && pkgs+=("$wayland_pkg")
|
||||||
|
_confirm_install_list "KDE Plasma Full" "${pkgs[@]}" || return
|
||||||
|
|
||||||
echo -e "${GREEN}Installing KDE Plasma (Full)...${NC}"
|
echo -e "${GREEN}Installing KDE Plasma (Full)...${NC}"
|
||||||
|
|
||||||
@@ -42,7 +71,7 @@ _install_kde_full() {
|
|||||||
fi
|
fi
|
||||||
echo "${target_dm} shared/default-x-display-manager select ${target_dm}" | sudo debconf-set-selections
|
echo "${target_dm} shared/default-x-display-manager select ${target_dm}" | sudo debconf-set-selections
|
||||||
_ensure_apt_updated
|
_ensure_apt_updated
|
||||||
_run_cmd "KDE Full" "sudo apt install -y kde-standard sddm" \
|
_run_cmd "KDE Full" "sudo apt install -y ${pkgs[*]}" \
|
||||||
"Installing KDE Plasma (Full Meta Package) + SDDM..."
|
"Installing KDE Plasma (Full Meta Package) + SDDM..."
|
||||||
if [ "$target_dm" = "sddm" ]; then
|
if [ "$target_dm" = "sddm" ]; then
|
||||||
sudo systemctl enable sddm
|
sudo systemctl enable sddm
|
||||||
@@ -56,8 +85,15 @@ _install_kde_full() {
|
|||||||
|
|
||||||
_install_kde_minimal() {
|
_install_kde_minimal() {
|
||||||
# Pre-apply summary: confirm the selection before any
|
# Pre-apply summary: confirm the selection before any
|
||||||
# debconf or apt transaction starts.
|
# debconf or apt transaction starts. The Wayland
|
||||||
_confirm_install_list "KDE Plasma Minimal" kde-plasma-desktop sddm || return
|
# session package is resolved once (bookworm only;
|
||||||
|
# the package does not exist on trixie) so the
|
||||||
|
# summary lists exactly what apt will install.
|
||||||
|
local wayland_pkg
|
||||||
|
wayland_pkg=$(_kde_wayland_pkg)
|
||||||
|
local -a pkgs=(kde-plasma-desktop sddm)
|
||||||
|
[ -n "$wayland_pkg" ] && pkgs+=("$wayland_pkg")
|
||||||
|
_confirm_install_list "KDE Plasma Minimal" "${pkgs[@]}" || return
|
||||||
|
|
||||||
echo -e "${GREEN}Installing KDE Plasma Desktop (Minimal)...${NC}"
|
echo -e "${GREEN}Installing KDE Plasma Desktop (Minimal)...${NC}"
|
||||||
|
|
||||||
@@ -71,7 +107,7 @@ _install_kde_minimal() {
|
|||||||
fi
|
fi
|
||||||
echo "${target_dm} shared/default-x-display-manager select ${target_dm}" | sudo debconf-set-selections
|
echo "${target_dm} shared/default-x-display-manager select ${target_dm}" | sudo debconf-set-selections
|
||||||
_ensure_apt_updated
|
_ensure_apt_updated
|
||||||
_run_cmd "KDE Minimal" "sudo apt install -y kde-plasma-desktop sddm" \
|
_run_cmd "KDE Minimal" "sudo apt install -y ${pkgs[*]}" \
|
||||||
"Installing KDE Plasma Desktop (Minimal) + SDDM..."
|
"Installing KDE Plasma Desktop (Minimal) + SDDM..."
|
||||||
if [ "$target_dm" = "sddm" ]; then
|
if [ "$target_dm" = "sddm" ]; then
|
||||||
sudo systemctl enable sddm
|
sudo systemctl enable sddm
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ teardown() {
|
|||||||
if [ -n "${MOCK_APT_ROOT:-}" ]; then
|
if [ -n "${MOCK_APT_ROOT:-}" ]; then
|
||||||
rm -rf "$MOCK_APT_ROOT"
|
rm -rf "$MOCK_APT_ROOT"
|
||||||
fi
|
fi
|
||||||
|
if [ -n "${SESSION_FIXTURE:-}" ]; then
|
||||||
|
rm -rf "$SESSION_FIXTURE"
|
||||||
|
fi
|
||||||
|
unset SESSION_DIR_WAYLAND SESSION_DIR_X11
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── _existing_display_manager ────────────────────────
|
# ── _existing_display_manager ────────────────────────
|
||||||
@@ -254,3 +258,172 @@ _gnome_capture_apt_cmd() {
|
|||||||
[[ "$output" == *"apt install -y gnome gdm3 gnome-terminal"* ]]
|
[[ "$output" == *"apt install -y gnome gdm3 gnome-terminal"* ]]
|
||||||
[[ "$output" != *ptyxis* ]]
|
[[ "$output" != *ptyxis* ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ── KDE Plasma: bookworm Wayland gate ─────────────
|
||||||
|
# plasma-workspace-wayland exists only on bookworm:
|
||||||
|
# bookworm's plasma-workspace ships the X11 session
|
||||||
|
# only, so the explicit listing keeps the Wayland
|
||||||
|
# session in the transaction deterministically; off
|
||||||
|
# bookworm the package does not exist and nothing is
|
||||||
|
# named in the apt command.
|
||||||
|
|
||||||
|
# _kde_capture_apt_cmd runs one KDE installer with
|
||||||
|
# every external effect stubbed (same shape as the
|
||||||
|
# GNOME capture helper): the apt command is captured
|
||||||
|
# instead of executed, and the PATH sudo mock stays
|
||||||
|
# in dry-run mode so debconf and systemctl invocations
|
||||||
|
# are logged, not executed.
|
||||||
|
_kde_capture_apt_cmd() {
|
||||||
|
local installer="$1"
|
||||||
|
_load_module_with_deps_marked kde
|
||||||
|
KDE_APT_CMD=""
|
||||||
|
_confirm_install_list() { return 0; }
|
||||||
|
_ensure_apt_updated() { :; }
|
||||||
|
_run_cmd() { KDE_APT_CMD="$2"; }
|
||||||
|
"$installer"
|
||||||
|
printf '%s\n' "$KDE_APT_CMD"
|
||||||
|
}
|
||||||
|
|
||||||
|
# _kde_capture_confirm runs one KDE installer with the
|
||||||
|
# pre-apply summary captured instead of shown: _confirm
|
||||||
|
# records the list _confirm_install_list builds, so the
|
||||||
|
# summary content (never an empty package line) can be
|
||||||
|
# asserted directly. The pipewire follow-up offer is
|
||||||
|
# stubbed so the recorded list is the package summary.
|
||||||
|
_kde_capture_confirm() {
|
||||||
|
local installer="$1"
|
||||||
|
_load_module_with_deps_marked kde
|
||||||
|
KDE_CONFIRM_LIST=""
|
||||||
|
_confirm() { KDE_CONFIRM_LIST="$2"; return 0; }
|
||||||
|
_ensure_apt_updated() { :; }
|
||||||
|
_run_cmd() { :; }
|
||||||
|
_offer_pipewire_after_desktop() { :; }
|
||||||
|
"$installer"
|
||||||
|
printf '%s\n' "$KDE_CONFIRM_LIST"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "_kde_wayland_pkg prints plasma-workspace-wayland on bookworm" {
|
||||||
|
export DEBIAN_CODENAME="bookworm"
|
||||||
|
_load_module_with_deps_marked kde
|
||||||
|
run _kde_wayland_pkg
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ "$output" = "plasma-workspace-wayland" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "_kde_wayland_pkg prints nothing off bookworm" {
|
||||||
|
export DEBIAN_CODENAME="trixie"
|
||||||
|
_load_module_with_deps_marked kde
|
||||||
|
run _kde_wayland_pkg
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ -z "$output" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Full installs the Wayland session package on bookworm" {
|
||||||
|
export DEBIAN_CODENAME="bookworm"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_apt_cmd _install_kde_full
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"apt install -y kde-standard sddm plasma-workspace-wayland"* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Full omits the Wayland session package off bookworm" {
|
||||||
|
export DEBIAN_CODENAME="trixie"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_apt_cmd _install_kde_full
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"apt install -y kde-standard sddm"* ]]
|
||||||
|
[[ "$output" != *"plasma-workspace-wayland"* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Minimal installs the Wayland session package on bookworm" {
|
||||||
|
export DEBIAN_CODENAME="bookworm"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_apt_cmd _install_kde_minimal
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"apt install -y kde-plasma-desktop sddm plasma-workspace-wayland"* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Minimal omits the Wayland session package off bookworm" {
|
||||||
|
export DEBIAN_CODENAME="trixie"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_apt_cmd _install_kde_minimal
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"apt install -y kde-plasma-desktop sddm"* ]]
|
||||||
|
[[ "$output" != *"plasma-workspace-wayland"* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Minimal summary lists the Wayland session package on bookworm" {
|
||||||
|
export DEBIAN_CODENAME="bookworm"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_confirm _install_kde_minimal
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"plasma-workspace-wayland"* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "KDE Minimal summary shows no empty package line off bookworm" {
|
||||||
|
export DEBIAN_CODENAME="trixie"
|
||||||
|
export MOCK_SUDO_DRY_RUN=1
|
||||||
|
run _kde_capture_confirm _install_kde_minimal
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[[ "$output" == *"kde-plasma-desktop"* ]]
|
||||||
|
[[ "$output" == *"sddm"* ]]
|
||||||
|
[[ "$output" != *"plasma-workspace-wayland"* ]]
|
||||||
|
[[ "$output" != *"- "$'\n'* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── _sddm_session_candidates: ordered session probe ──
|
||||||
|
# Existence decides (no codename gates) and Wayland is
|
||||||
|
# preferred. The roots are redirected to a per-test
|
||||||
|
# fixture tree through SESSION_DIR_WAYLAND /
|
||||||
|
# SESSION_DIR_X11 (same spirit as the DM_FILE fixture),
|
||||||
|
# so the probe never touches the real /usr/share tree.
|
||||||
|
|
||||||
|
_sddm_session_fixture() {
|
||||||
|
SESSION_FIXTURE="$(mktemp -d)"
|
||||||
|
mkdir -p "$SESSION_FIXTURE/wayland" "$SESSION_FIXTURE/x11"
|
||||||
|
SESSION_DIR_WAYLAND="$SESSION_FIXTURE/wayland"
|
||||||
|
SESSION_DIR_X11="$SESSION_FIXTURE/x11"
|
||||||
|
export SESSION_DIR_WAYLAND SESSION_DIR_X11
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "SDDM session probe prefers bookworm Wayland (plasmawayland)" {
|
||||||
|
_sddm_session_fixture
|
||||||
|
: >"$SESSION_DIR_WAYLAND/plasmawayland.desktop"
|
||||||
|
: >"$SESSION_DIR_X11/plasma.desktop"
|
||||||
|
run _sddm_session_candidates
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ "$output" = "plasmawayland" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "SDDM session probe picks trixie Wayland (plasma.desktop)" {
|
||||||
|
_sddm_session_fixture
|
||||||
|
: >"$SESSION_DIR_WAYLAND/plasma.desktop"
|
||||||
|
: >"$SESSION_DIR_X11/plasmax11.desktop"
|
||||||
|
run _sddm_session_candidates
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ "$output" = "plasma" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "SDDM session probe falls back to trixie X11 (plasmax11)" {
|
||||||
|
_sddm_session_fixture
|
||||||
|
: >"$SESSION_DIR_X11/plasmax11.desktop"
|
||||||
|
run _sddm_session_candidates
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ "$output" = "plasmax11" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "SDDM session probe keeps LXQt last when no KDE session exists" {
|
||||||
|
_sddm_session_fixture
|
||||||
|
: >"$SESSION_DIR_WAYLAND/lxqt-wayland.desktop"
|
||||||
|
: >"$SESSION_DIR_X11/lxqt.desktop"
|
||||||
|
run _sddm_session_candidates
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ "$output" = "lxqt-wayland" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "SDDM session probe returns empty when no session file exists" {
|
||||||
|
_sddm_session_fixture
|
||||||
|
run _sddm_session_candidates
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
[ -z "$output" ]
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user