Commit Graph
382 Commits
Author SHA1 Message Date
Ryan Hughes c7b8d4b584 builder: prune stale offline package versions 2026-05-23 13:08:15 -04:00
Ryan Hughes 38f56103e1 builder: add debug install instrumentation 2026-05-23 12:45:12 -04:00
Ryan Hughes b16303f294 installer: always clean up finalizer log bind 2026-05-23 10:30:53 -04:00
Ryan Hughes 6232620806 installer: unify finalizer logging 2026-05-23 10:21:38 -04:00
Ryan Hughes 8d1d3c906d installer: harden dashboard finish transition 2026-05-23 10:02:36 -04:00
Ryan Hughes fd12ace8bc installer: tolerate missing duration on finish 2026-05-23 05:29:53 -04:00
Ryan Hughes 1d656af51d installer: make dashboard own install flow 2026-05-23 04:50:32 -04:00
Ryan Hughes af4679b153 installer: clear stale dashboard state 2026-05-23 03:43:24 -04:00
Ryan Hughes c43bad26b5 installer: stop dashboard before finish prompt 2026-05-23 03:35:55 -04:00
Ryan Hughes 7d7f6451a3 installer: track real dashboard pid 2026-05-23 02:55:44 -04:00
Ryan Hughes 0890472c9b installer: pass dashboard tty explicitly 2026-05-23 02:14:13 -04:00
Ryan Hughes 1162d111bd installer: force dashboard shutdown before finish 2026-05-22 23:10:44 -04:00
Ryan Hughes ca55321621 installer: animate dashboard and finish screens 2026-05-22 19:20:03 -04:00
Ryan Hughes 0734e982ca installer: harden dashboard handoff 2026-05-22 19:15:06 -04:00
Ryan Hughes 61f84a95cf installer: smooth dashboard progress 2026-05-22 18:09:00 -04:00
Ryan Hughes 63ba457034 builder: mark install dashboard executable 2026-05-22 17:46:55 -04:00
Ryan Hughes 337ba2e590 installer: show dashboard during ISO install 2026-05-22 17:34:01 -04:00
Ryan Hughes de0f013b5e orchestrator: converge free-space boot on finalizer 2026-05-22 16:33:11 -04:00
Ryan Hughes 948a53cc0a orchestrator: recover missing ESP mount in free-space installs 2026-05-22 15:00:19 -04:00
Ryan Hughes cab315bb8a configurator: count EFI inside free-space size 2026-05-22 14:47:57 -04:00
Ryan Hughes 2178c26a92 configurator: let free-space installs choose size 2026-05-22 14:05:28 -04:00
Ryan Hughes f3973abb4c configurator: use valid bootloader value for free-space installs 2026-05-22 13:51:40 -04:00
Ryan Hughes 3e0cd31c2b configurator: clarify free-space install semantics 2026-05-22 13:51:02 -04:00
Ryan Hughes 7e79355c71 configurator: add partition tool and recoverable partition flow 2026-05-22 13:29:10 -04:00
Ryan Hughes d7e4233042 orchestrator: defer full-disk mkinitcpio to final UKI build 2026-05-22 13:26:06 -04:00
Ryan Hughes 5ad90afbae orchestrator: use epoch for finalizer timing 2026-05-22 13:04:34 -04:00
Ryan Hughes c2396fb447 orchestrator: preserve offline finalizer timing 2026-05-22 12:26:51 -04:00
Ryan Hughes 9ad189ef82 orchestrator: configure snapper before offline finalizer 2026-05-22 12:13:00 -04:00
Ryan Hughes 1e26d18031 orchestrator: point finalizer at installed runtime assets 2026-05-22 11:23:46 -04:00
Ryan Hughes 6decb2f683 orchestrator: install omarchy-nvim before user creation 2026-05-22 10:58:26 -04:00
Ryan Hughes 3420bc9aa8 builder: include omarchy-nvim in local package builds 2026-05-22 10:46:56 -04:00
Ryan Hughes a21ab8bcb1 orchestrator: prepare writable offline finalizer log 2026-05-22 02:10:18 -04:00
Ryan Hughes c5baf2c791 orchestrator: keep finalizer payload out of tmp 2026-05-22 01:39:49 -04:00
Ryan Hughes ec218bade6 orchestrator: chown finalizer tooling inside target 2026-05-22 01:17:45 -04:00
Ryan Hughes c179d78814 configurator: emit explicit bootloader_config with removable=false
archinstall 4.3 maps the deprecated top-level 'bootloader': 'Limine'
to BootloaderConfiguration(bootloader=Limine, removable=True) (per
lib/args.py:185-190 and lib/models/bootloader.py:56-69). Our new
_install_limine_omarchy mirrors archinstall's removable handling: it
would copy BOOTX64.EFI to EFI/BOOT (fallback path) and SKIP
efibootmgr, neither of which is what we want.

Switch to the explicit bootloader_config form with removable=false
so we take the EFI/limine path + register the 'Limine' NVRAM entry
as intended.
2026-05-22 00:15:04 -04:00
Ryan Hughes 3a91cf780c orchestrator: install Limine ourselves; stop creating arch-limine entries to delete later
archinstall's add_bootloader creates EFI/arch-limine/{BOOTX64.EFI, BOOTIA32.EFI}, writes a limine.conf with an Arch Linux entry, and registers an efibootmgr label "Arch Linux Limine Bootloader" — only for limine-snapper.sh to delete it all and rebuild with Omarchy branding via limine-mkinitcpio-hook.

Replace the add_bootloader call with _install_limine_omarchy, which does the same work archinstall's _add_limine_bootloader does (UEFI EFI binary copy + efibootmgr register, or BIOS limine-bios.sys + limine bios-install) but with Omarchy-owned paths and labels from the start:

  - EFI subdir:    EFI/limine          (not EFI/arch-limine)

  - efibootmgr:    label "Limine"      (not "Arch Linux Limine Bootloader")

  - loader path:   \EFI\limine\BOOTX64.EFI

Compute the kernel cmdline directly from disk_config instead of harvesting it from a file archinstall wrote (whose path keeps drifting across versions). Then write /etc/default/limine and /etc/kernel/cmdline, and stage /boot/limine.conf from our styling template — limine-mkinitcpio-hook will add the actual boot entries when it deploys.

Adds limine + efibootmgr to EARLY_PACKAGES (archinstall used to pacstrap these as a side effect of add_bootloader).

Does not modify limine-snapper.sh — its cleanup code will simply no-op because there are no arch-limine paths or "Arch Linux Limine Bootloader" entries to find. That code can be pruned in a follow-up.
2026-05-21 21:57:50 -04:00
Ryan Hughes 39113a2d2b orchestrator: probe multiple paths for limine.conf after add_bootloader
archinstall 4.3 writes limine.conf to <target>/<esp_mount>/EFI/arch-limine/
limine.conf for UEFI non-removable installs (lib/installer.py:1487), not
to /mnt/boot/limine.conf as our code assumed. Older archinstall versions
used different paths.

Probe the 4.3 paths (arch-limine, BOOT, limine subdir) and the legacy
/boot/limine.conf in order; pick whichever exists. Error message now
lists everywhere it looked so future drift is easy to diagnose.
2026-05-21 20:56:58 -04:00
Ryan Hughes 16cc1058be automated_script: restore proven gum stream/env contract
Restore the env + redirect setup that the previously-working ISO
installer used (matching /home/ryan/Downloads/ISO scripts/.automated_script.sh):

  export COLUMNS=$(tput cols)
  export LINES=$(tput lines)
  exec > >(tee >(sed CSI-strip >> log) 2>/dev/null) 2>/dev/tty
  export CLICOLOR_FORCE=1
  export FORCE_COLOR=1

The cutover commit (064b5e2) silently dropped these. Subsequent
attempts to fix the TTY/gum rendering by reshaping the redirect were
all symptom-chasing — the proven shape was correct. The key insight:

  - gum draws its TUI on stderr, not stdout. 2>/dev/tty keeps that
    rendering on the real terminal.
  - stdout-as-pipe (via tee) is *desired*: it lets gum detect a
    non-TTY stdout and skip cursor-position probes (CSI 6n). Without
    that detection, the DSR replies leak as visible ^[[13;1R bytes.
  - CLICOLOR_FORCE/FORCE_COLOR force gum to still emit colour despite
    stdout being a pipe.

Also drops the configurator's _drain_tty workaround — unnecessary
once gum stops sending DSR queries in the first place.
2026-05-21 20:54:05 -04:00
Ryan Hughes 8734136908 configurator/shim: drain tty without hanging (use -t 0.05, not -t 0)
bash's `read -t 0` only TESTS whether input is available; it does not
consume the bytes. So the drain loop `while read -t 0 ...; do :; done`
spun forever the moment any bytes were pending (e.g., the DSR reply
sitting in the tty input buffer after gum style sent CSI 6n).

That hung the configurator at the first step() title screen — blank
prompt, blinking cursor, no keyboard form.

Use `read -t 0.05 -N 9999` once, which consumes up to 9999 bytes with
a 50ms timeout. Always returns after 50ms whether there's data or not.
Single call replaces the while loop.
2026-05-21 20:46:50 -04:00
Ryan Hughes a18d4651a3 orchestrator: pacstrap limine+efibootmgr in protected base install
configure_protected_boot used to arch-chroot pacman -S limine
efibootmgr, but at that phase the live ISO's offline mirror is not
bind-mounted into the target yet (run_chroot_finalizer does that
later) and the target's pacman.conf points at network mirrors that
aren't reachable during an offline install.

Pacstrap these packages alongside the runtime package list in
arch_install_base, where archinstall is still pacstrapping against
the live ISO's offline mirror. Drop the now-redundant arch-chroot
pacman call from configure_protected_boot.
2026-05-21 20:38:03 -04:00
Ryan Hughes a5a7110bea configurator: drain tty input after each step() title
gum's TUI startup queries the terminal (e.g., cursor position via
CSI 6n) and doesn't always read the reply. The reply bytes
("^[[13;1R") then surface visibly next to the next step title.
A one-time drain at script start (in .automated_script.sh) catches
the boot-time replies but not the gum-per-call ones, since the
artifact came back at every new step().

Add a small _drain_tty helper and call it from step() after the
title gum-style invocation so any pending DSR replies are consumed
before the next prompt runs.
2026-05-21 20:34:21 -04:00
Ryan Hughes 34c0a14766 archinstall_adapter: pass Path (not str) to Installer
archinstall 4.3's Installer.__init__ types target as Path and uses it
directly (self.target / 'boot', etc.). Passing str(mountpoint) makes
self.target a str, so every internal path operation raises
'unsupported operand type(s) for /: str and str' — most visibly during
set_mirrors, which constructs target / MIRRORLIST.relative_to_root().

Drop the str() cast; pass the Path through as-is.
2026-05-21 20:34:21 -04:00
Ryan Hughes be721e17f4 installer: route kernel/initramfs to ESP for encrypted protected installs (Limine can't read LUKS) 2026-05-21 20:09:50 -04:00
Ryan Hughes 21dbbcb917 ui: attach gum confirm to /dev/tty so it doesn't render through the install log tee 2026-05-21 20:08:38 -04:00
Ryan Hughes 260edc13c5 orchestrator: tear down protected-mode mounts and LUKS mapper on failure 2026-05-21 20:08:29 -04:00
Ryan Hughes e049f28bfa orchestrator: record bind mounts immediately to prevent leaks on partial failure 2026-05-21 20:08:06 -04:00
Ryan Hughes ed7c62febe omarchy-iso: drop obsolete archinstall patch helper (4.3 has the fixes upstream) 2026-05-21 20:07:55 -04:00
Ryan Hughes b568b0b796 archinstall_adapter: pass --config/--creds via synthetic sys.argv (env vars don't work)
ArchConfigHandler reads --config and --creds from sys.argv via argparse at
construction time; it ignores ARCHINSTALL_CONFIG/ARCHINSTALL_CREDS env
vars (confirmed in archinstall 4.3 lib/args.py:_parse_args). Setting those
env vars was a no-op, so handler.config.disk_config was always None when
the wrapper stripped our args off the real argv.

Fix: build a synthetic argv [prog, --config <path>, --creds <path>] and
swap it into sys.argv just for the ArchConfigHandler() call, then
restore. Drops the unused 'import os' now that the env var lines are
gone.
2026-05-21 19:53:27 -04:00
Ryan Hughes c1828b13ad automated_script: drain stale tty input + drop redundant stdin redirect
Fix the ^[[13;1R cursor-position-report artifacts visible next to the
first configurator step. archiso's boot init leaves DSR responses in the
kernel tty input buffer; the first gum invocation reads them as stray
input and echoes them as visible escape sequences.

- Drain stdin (with a short timeout) from /dev/tty before configurator
  runs so any pending replies are consumed.
- Drop the explicit </dev/tty stdin redirect — the parent script's
  stdin is already tty1 (inherited from archiso autostart), and the
  explicit redirect opened a new fd with subtly different termios.
2026-05-21 19:51:35 -04:00
Ryan Hughes 22f94e6da6 orchestrator: switch wrapper interface from CLI args to env vars to avoid archinstall argparse collision 2026-05-21 19:40:31 -04:00