UI: fix installer workflow asking for sudo pw in background

This commit is contained in:
Johannes Kirschbauer
2024-12-29 13:00:40 +01:00
parent b75ddec89a
commit a1c640db3d
4 changed files with 83 additions and 47 deletions

View File

@@ -7,13 +7,14 @@ from pathlib import Path
from clan_cli.cmd import Log, RunOpts, run
from clan_cli.errors import ClanError
from clan_cli.machines.machines import Machine
from clan_cli.nix import nix_shell
log = logging.getLogger(__name__)
@contextmanager
def pause_automounting(
devices: list[Path], machine: Machine
devices: list[Path], machine: Machine, sudo: str = "pkexec"
) -> Generator[None, None, None]:
"""
Pause automounting on the device for the duration of this context
@@ -32,7 +33,11 @@ def pause_automounting(
raise ClanError(msg)
str_devs = [str(dev) for dev in devices]
cmd = ["sudo", str(inhibit_path), "enable", *str_devs]
cmd = nix_shell(
["nixpkgs#pkexec"] if sudo == "pkexec" else [],
[sudo, str(inhibit_path), "enable", *str_devs],
)
result = run(
cmd,
RunOpts(
@@ -42,7 +47,7 @@ def pause_automounting(
if result.returncode != 0:
machine.error("Failed to inhibit automounting")
yield None
cmd = ["sudo", str(inhibit_path), "disable", *str_devs]
cmd = [sudo, str(inhibit_path), "disable", *str_devs]
result = run(cmd, RunOpts(log=Log.BOTH, check=False, prefix=machine.name))
if result.returncode != 0:
machine.error("Failed to re-enable automounting")

View File

@@ -47,9 +47,11 @@ def flash_machine(
write_efi_boot_entries: bool,
debug: bool,
extra_args: list[str] | None = None,
use_user_permission: bool = False,
) -> None:
devices = [Path(disk.device) for disk in disks]
with pause_automounting(devices, machine):
sudo = "pkexec" if use_user_permission else "sudo"
with pause_automounting(devices, machine, sudo):
if extra_args is None:
extra_args = []
system_config_nix: dict[str, Any] = {}
@@ -108,10 +110,12 @@ def flash_machine(
disko_install = []
if os.geteuid() != 0:
# Use pkexec to elevate permissions if not running as root
perm_prefix = "pkexec" if use_user_permission else "exec sudo"
if shutil.which("sudo") is None:
msg = "sudo is required to run disko-install as a non-root user"
raise ClanError(msg)
wrapper = 'set -x; disko_install=$(command -v disko-install); exec sudo "$disko_install" "$@"'
wrapper = f'set -x; disko_install=$(command -v disko-install); {perm_prefix} "$disko_install" "$@"'
disko_install.extend(["bash", "-c", wrapper])
disko_install.append("disko-install")
@@ -124,6 +128,8 @@ def flash_machine(
for disk in disks:
disko_install.extend(["--disk", disk.name, disk.device])
log.info("Will flash disk %s: %s", disk.name, disk.device)
disko_install.extend(["--extra-files", str(local_dir), upload_dir])
disko_install.extend(["--flake", str(machine.flake) + "#" + machine.name])
disko_install.extend(["--mode", str(mode)])