Chunks 2-6 of the C3 refactor. With the adapter in place, the phase
list collapses from 12 stubs to 5 real phases:
prepare_live parse user_*.json into archinstall handlers
arch_install partition + base + bootloader + limine config +
early omarchy + useradd + runtime omarchy (all
inside a single Installer context manager)
run_chroot_finalizer arch-chroot -u $user → finalize.sh
validate_boot halt if /boot/limine.conf, /etc/kernel/cmdline,
or UKI are missing/malformed
finish reboot prompt
Key reordering vs upstream guided.py: write_limine_config runs BETWEEN
add_bootloader and the first add_additional_packages call. By the time
omarchy-limine pulls limine-mkinitcpio-hook (in the runtime package
install), /etc/default/limine and /etc/kernel/cmdline are in place, so
the UKI is built correctly on the first try — no stale-UKI purge,
no follow-up limine-update.
add_additional_packages is split into two calls so /etc/skel is
populated (via omarchy-settings in EARLY_PACKAGES) BEFORE useradd:
EARLY_PACKAGES = base-devel git omarchy-keyring omarchy-settings omarchy-installer
→ installer.create_users(users)
→ runtime: omarchy + omarchy-base.packages
archinstall_adapter.py is the ONLY module that imports from archinstall.
If archinstall's API churns, the blast radius is contained here. Tested
against archinstall 4.3 / Python 3.14.
Limine template lookup tries the new install/assets/limine/ path first
and falls back to the legacy default/limine/ location during the
template-ownership migration (lands in a follow-up chunk).
82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
"""Omarchy install orchestrator.
|
|
|
|
Single tool that owns the full install phase ordering, with archinstall used as
|
|
a library subsystem (not as the top-level installer).
|
|
|
|
Usage (typically invoked by bin/omarchy-install on the live ISO):
|
|
|
|
omarchy-install \\
|
|
--config user_configuration.json \\
|
|
--creds user_credentials.json \\
|
|
--full-name-file user_full_name.txt \\
|
|
--email-file user_email_address.txt \\
|
|
--encrypt-file user_encrypt_installation.txt
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
from . import archinstall_adapter as arch
|
|
from .context import InstallContext
|
|
from .phases import PhaseError, run
|
|
from .ui import error, info
|
|
|
|
|
|
def build_phases():
|
|
"""Phase order. Each entry is (display name, callable taking InstallContext).
|
|
|
|
The ordering is the whole point of this orchestrator: package-install
|
|
hooks (limine-mkinitcpio-hook, in particular) and useradd happen at
|
|
points where their prerequisites are guaranteed to be in place.
|
|
"""
|
|
from .phases_impl import (
|
|
prepare_live,
|
|
arch_install,
|
|
run_chroot_finalizer,
|
|
validate_boot,
|
|
finish,
|
|
)
|
|
|
|
return [
|
|
("Preparing live environment", prepare_live),
|
|
("Installing Arch + Omarchy", arch_install),
|
|
("Finalizing in chroot", run_chroot_finalizer),
|
|
("Validating boot setup", validate_boot),
|
|
("Finishing", finish),
|
|
]
|
|
|
|
|
|
def parse_args(argv):
|
|
p = argparse.ArgumentParser(prog="omarchy-install")
|
|
p.add_argument("--config", required=True, help="archinstall user_configuration.json")
|
|
p.add_argument("--creds", required=True, help="archinstall user_credentials.json")
|
|
p.add_argument("--full-name-file", help="text file with the user's full name")
|
|
p.add_argument("--email-file", help="text file with the user's email address")
|
|
p.add_argument("--encrypt-file", help="text file holding 'true' if root encryption enabled")
|
|
return p.parse_args(argv)
|
|
|
|
|
|
def main(argv=None) -> int:
|
|
args = parse_args(argv or sys.argv[1:])
|
|
ctx = InstallContext.from_args(args)
|
|
|
|
info(f"Installing Omarchy for {ctx.username} → {ctx.target}")
|
|
|
|
try:
|
|
run(ctx, build_phases())
|
|
except PhaseError:
|
|
error("Installation halted.")
|
|
return 1
|
|
except KeyboardInterrupt:
|
|
error("Installation interrupted.")
|
|
return 130
|
|
|
|
info("Installation complete.")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|