Compare commits

..
3 Commits
Author SHA1 Message Date
yuri 2b58c4f788 Merge pull request 'libvirt group: gate on daemon/virt-manager, not the metapkg' (#5) from fix/libvirt-group-gate into main 2026-10-27 15:58:59 +01:00
Pathfinder f069026a7c libvirt group: check at summary time (final state) + OR-semantics gate
Fresh-VM timeline explained: on run 1 virt-manager installs AFTER the
niri module's prereq check ran (menu dispatch order), so the group add
was evaluated against a package state that did not include it yet. A
second run 'fixed' it — matching the observed behavior.

- New ensure_libvirt_group runs in the Summary section, seeing the FINAL
  package state; menu/module-time check kept as an early pass.
- pkg_installed is AND-semantics (all must be installed); the gate needs
  OR. New pkg_installed_any helper; both gates switched to it.
- Also fixed a set -e trap: '$done_any && ok' returned 1 (killing the
  script) when no optional tools were picked — replaced with an if.
All four gate cases harness-proven: virt-only, menu-pick, no-virt,
already-in-group.
2026-10-27 15:50:30 +01:00
Pathfinder df56379556 libvirt group gate: virt-manager alone justifies membership
Fresh-VM repro: user in yuri+wheel with virt-manager installed. Gate was
'pkg_installed libvirt', but virt-manager does NOT require the 'libvirt'
metapkg (verified vs F44 package page: requires libvirt-glib etc., client
side only) — so the usermod never fired.

Gate now: libvirt OR libvirt-daemon OR libvirt-daemon-driver-qemu OR
virt-manager packages, or an existing /usr/sbin/libvirtd binary.
2026-10-27 15:32:41 +01:00
3 changed files with 41 additions and 2 deletions
+11
View File
@@ -92,6 +92,17 @@ pkg_installed() {
return 0
}
# True if ANY of the listed packages is installed (pkg_installed is AND).
pkg_installed_any() {
local p
for p in "$@"; do
if rpm -q "$p" &>/dev/null; then
return 0
fi
done
return 1
}
remove_packages() {
local packages_to_remove=()
for pkg in "$@"; do
+7 -1
View File
@@ -129,7 +129,13 @@ UNIT
# libvirt group: members manage qemu:///system without a polkit prompt.
# Without this, virt-manager dies on "access denied by policy" even with
# a working agent (VM-proven). Idempotent; applies after re-login.
if pkg_installed libvirt; then
#
# Gate on the DAEMON, not the 'libvirt' metapkg name: virt-manager only
# requires libvirt-glib client-side, so on a fresh VM libvirt can be
# functionally present via libvirt-daemon* without rpm -q libvirt passing
# (VM-proven: user stuck in yuri+wheel with virt-manager installed).
if pkg_installed_any libvirt libvirt-daemon libvirt-daemon-driver-qemu virt-manager \
|| [[ -x /usr/sbin/libvirtd ]]; then
local real_user="${SUDO_USER:-$USER}"
if ! id -nG "$real_user" 2>/dev/null | grep -qw libvirt; then
info "Adding $real_user to the libvirt group (re-login to apply)..."
+23 -1
View File
@@ -525,7 +525,10 @@ run_advanced_menu() {
unset to_install; local -a to_install=() # fresh slate for next pick
fi
done
$done_any && ok "Optional tools installed."
# not `&& ok` — a false done_any would return 1 and kill the script under set -e
if [[ "$done_any" == "true" ]]; then
ok "Optional tools installed."
fi
}
# Per-category pre-repo wiring. Add third-party repos here when you add an
@@ -584,6 +587,25 @@ pause_if_debug
step "8 Summary"
rule
# Post-install wiring that must see the FINAL package state. The libvirt
# group add earlier (menu/module time) can miss packages installed later in
# the same run — this is the authoritative pass (VM-proven: a fresh run left
# the user out of the group when virt-manager landed after the check).
ensure_libvirt_group() {
# shellcheck source=lib/common.sh
source "$SCRIPT_DIR/lib/common.sh" 2>/dev/null || true
if pkg_installed_any libvirt libvirt-daemon libvirt-daemon-driver-qemu virt-manager \
|| [[ -x /usr/sbin/libvirtd ]]; then
local real_user="${SUDO_USER:-$USER}"
if ! id -nG "$real_user" 2>/dev/null | grep -qw libvirt; then
info "Adding $real_user to the libvirt group (re-login to apply)..."
sudo usermod -aG libvirt "$real_user" || true
warn "Group membership applies after re-login — do it before using virt-manager."
fi
fi
}
ensure_libvirt_group
ok "DE: $DE"
ok "TWM: $TWM"
ok "SELinux: $([[ "$SELINUX_DISABLED" == "true" ]] && echo disabled || echo keeping)"