API Reference¶
How to extend, run, or edit the installer. Default flow: guided.py.
Run a script standalone¶
python -m archinstoo --script <name> (or installed archinstoo --script
<name>).
Dispatch:
__init__.py
run_as_a_module() -> main() ->
_run_script,
which just imports archinstoo.scripts.<name>.
Each script
(scripts/)
runs on import (calls its entry fn at file bottom, e.g. guided()), so
importing == running.
--dry-run: build + save config, thenSystemExit(0).--config <file>: load saved selections, skip resume prompt.- Rootless (no root needed):
{'list', 'size', 'mirror', 'count'}in__init__.py. - New script = new file in
scripts/that defines + calls an entry fn. Reuseget_arch_config_handler()from args.py for config/args.
Add an application (audio/firewall/... category or cat/)¶
Four edits, model first:
- models/application.py:
add the
StrEnumof choices, aXConfigurationdataclass withjson()/parse_arg(), aXConfigSerializationTypedDict, then wire it intoApplicationConfiguration(new field),_config_parsers(the dispatch dict), andApplicationSerialization. The in-file comment nearparse_argdocuments this. - applications/cat/
new
x.py: class withinstall(self, install_session, x_config). Package/service lists as@property. Useinstall_sessionprimitives (below). Pattern: firewall.py. - application_handler.py:
install_applications()addif app_config.x_config: XApp().install(...). Ordering matters (apps run before bootloader, after users). - application_menu.py:
add a
MenuItem+select_x()+_prev_x()so the user can pick it.
Add a profile (server or desktop)¶
No registration. Drop a file in
default_profiles/servers/
or
desktops/;
profiles_handler.py
auto-discovers via importlib over the dir.
Subclass Profile
(profile/base.py),
set ProfileType (ServerType / DesktopEnv / WindowMgr). Contract
(all optional except a type):
packages/services(@property) -> installed + enabled by the parent collector (server.py).install(install_session): extra install-time steps (e.g. sshd.py opens the firewall).post_install(install_session): system-level finalize after packages land, no user context (e.g. mariadb runsmariadb-install-db).provision(install_session, users): per-user wiring that needs the user list (e.g. docker/seatd add each user to a group viausermod -aG).do_on_select(): menu-time hook run when the profile is picked.default_greeter_type/display_servers(): graphical metadata (greeter default, Xorg/Wayland advertised).
Add a new install step (outside cat/ and profiles)¶
The general case: work that is neither a category app nor a profile. Two decoupled parts.
- The worker. A plain class/module anywhere sensible under
lib/, exposinginstall(install_session, <config it needs>)and using the Installer primitives below. Canonical example, user shells: shell.pyShellApp.install(install_session, users)installs non-bash shells thenchshper user. Nocat/entry, no menu of its own. - The hook. Call it from
perform_installationin guided.py, gated on the config it needs, at the right point in the order (ShellAppruns right aftercreate_users, line ~116). Mirror into live.py if it applies to live mode. Either inlineWorker().install(...)(the ShellApp style) or build a handler once in the entry fn and thread it through the signature (theProfileHandler/ApplicationHandlerstyle).
Order of Operations: place the hook relative to the steps it depends on
(after users, before bootloader, ...). The Installer context isn't open
yet in the entry fn, so the hook must live inside perform_installation.
All steps that rely on a previous step must be thought of that way for exec flow...
Configure it: menu + config field¶
A menu entry only captures + persists a choice; it runs nothing at install time. To act on it you still need a step (above) that reads it.
global_menu.py:
add MenuItem(action=self._select_x, key='x') + the _select_x handler.
key must match a field on ArchConfig
(args.py)
so it round-trips through save/load. Toggle visibility with
set_enabled() / set_mandatory() (live mode disables several). Config
with no consuming step is a dead option; conversely a step can derive from
existing config and skip the menu entirely (shell is a field on each
User, set in the auth menu, never a top-level item).
The _select_x handler builds a SelectMenu
(curses_menu.py)
over a MenuItemGroup of MenuItems
(menu_item.py).
- single-select: returns
result.get_value(), e.g.select_kb_layout. - multi-select: pass
multi=True, collectresult.get_values()(often joined), e.g.select_xkb_options.
Edit an existing install step¶
Built-in steps are methods on Installer
(installer.py)
called in order from perform_installation. Edit the method, not the
caller, unless reordering. Primitives reused inside any step / app /
profile:
add_additional_packages(pkgs),enable_service(name|list).arch_chroot(cmd, run_as=None): run argv list in the target.self.target(Pathof the new root),self.handler.config(fullArchConfig, e.g. readapp_config.firewall_config).- bootloader/keymap/fs:
add_bootloader(),set_keyboard(),minimal_installation(),genfstab().