* Make network configuration mandatory with explicit "No network" option
* Add network configuration recommendation hint and disable sorting
* Warn when network selection was skipped instead of making it mandatory
Replace the mandatory network_config menu requirement with a yellow
warning on the final confirmation screen, shown only when the user
skipped the network menu entirely. Explicitly picking "No network
configuration" is treated as a conscious choice and does not trigger
the warning.
- Drop mandatory=True from the network_config global menu item
- Rename NicType.NONE menu label from "No network" to
"No network configuration" (an installed system still has an NIC;
only the install-time configuration is absent)
- Add ConfigurationOutput.get_install_warnings() and render them in
confirm_config when show_install_warnings=True
- guided.py and minimal.py enable the warning on the confirm screen
- Reuse the existing "No network configuration" msgid in .pot; add the
warning string; update Ukrainian translations accordingly
* Drop NicType.NONE from this PR
The NONE option introduced earlier in this branch is being removed per
review feedback (#4408). Whether to add explicit "None" options across
multiple menus (greeter, gfx driver, network, bootloader) is now being
discussed in #4464 and should land as a separate change there.
This PR keeps only the warning-on-confirm behaviour: when the user
skipped the network menu entirely (network_config is None), a yellow
warning is shown on the final confirmation screen.
First Edit :
- "effort" is singular so use has not have
Second Edit :
- we use "an" before vowel sounds (an old )
Third Edit :
- use Sometimes because sometimes means occasionally and Some times means some period or era
Fourth Edit :
- Plural of ISO is ISOs not ISO's
* Show install summary when configuration is valid
Previously the Install menu preview was empty when everything was valid,
leaving the user with no "ready" signal. Now show "Ready to install"
plus a two-column summary of the current configuration.
- New _install_summary() composes an aligned key/value table with rows
for disks+FS+LUKS, bootloader, kernel, profile, greeter, package
count, network, locale and timezone. Column width adapts to the
longest translated label so translations keep the alignment.
- Rows whose underlying config is not set are skipped rather than
rendered as empty.
- base.pot / uk base.po: add new msgids for summary labels.
* Move install summary into ConfigurationOutput
The summary helper that renders the install preview's two-column
configuration overview lived in GlobalMenu. Move it to
ConfigurationOutput.as_summary() so it sits alongside the JSON
output methods that share the same role. The preview now syncs
menu state to ArchConfig and delegates rendering.
The workflow has been fully commented out since #2119 (2023-09-28) when
translation handling was reworked. Because the file has no `on:` triggers,
GitHub Actions creates a failed workflow run for every push, polluting
the Actions tab without affecting PR check-runs.
* Add console font selection to Locales menu
Add a 4th menu item "Console font" to the Locales configuration,
allowing users to select a console font for the target system.
The selected font is written to /etc/vconsole.conf.
If a terminus font (ter-*) is selected, the terminus-font package
is automatically installed on the target system.
* Switch list_console_fonts to pathlib and add @lru_cache
Address svartkanin's review on #4469. Replace os.listdir +
chained removesuffix with Path.glob('*.gz') + split('.')[0],
and cache the result via lru_cache - the kbd consolefonts
directory is static at runtime so re-scanning on every menu
reopen was wasted I/O.
* Fix argv injection in _create_user and gpasswd loop
Use argv list with run() instead of f-string interpolation into
SysCommand, add debug logging on failure.
* Extract _chroot_argv helper and harden user/file ops
Address svartkanin's review on #4473: factor the
['arch-chroot', '-S', str(self.target), ...] boilerplate into a
private Installer._chroot_argv() helper, and migrate the seven
existing argv-form call sites to it (useradd, gpasswd, chpasswd,
chsh, chown, snapper-create-config, grub-install).
Two related hardening tweaks while in the area:
- Raise gpasswd failure log from debug() to warn(). The group-add
loop has no return-False feedback channel for the caller, so a
silent debug() means a half-configured user looks like a
successful install.
- Add `--` end-of-options separator for useradd and chown so a
username or path starting with `-` cannot smuggle flags. The TUI
validates usernames, but parse_arguments() in models/users.py
does not, so config.json is the residual hole; this closes it
for these two sites at zero cost.
* Extend validate_bootloader_layout with UEFI-dependent checks
Add is_uefi parameter and three new validations: Systemd-boot, Efistub
and rEFInd require UEFI; Efistub additionally requires a FAT boot
partition. Move the rEFInd UEFI-only check out of GlobalMenu so
guided.py and Installer silent-install paths get the same coverage.
* Encapsulate UEFI-only flag in Bootloader enum
Replace module-level _UEFI_ONLY_BOOTLOADERS tuple with an
is_uefi_only() method on the Bootloader enum, mirroring the
existing has_uki_support() / has_removable_support() pattern.
* Drop is_uefi parameter from validate_bootloader_layout
The UEFI flag is a constant system fact for the run, so the
validator retrieves it via SysInfo.has_uefi() directly instead
of having every caller pass it in. Updates all three call sites
in global_menu.py, installer.py and guided.py, and removes the
now-unused SysInfo import from guided.py.
All three qemu-system-x86_64 examples in README pointed both -drive
if=pflash entries at the same file (/usr/share/ovmf/x64/OVMF.4m.fd).
OVMF needs CODE for the first pflash and VARS for the second; as
written, EFI NVRAM is not initialized correctly.
The path /usr/share/ovmf/x64/ is also stale - the ovmf package has
been replaced by edk2-ovmf, which installs under /usr/share/edk2/x64/.
Fix both in the three examples (testimage loop section, base Boot ISO
block, espeakup variant).
Only the truthiness of the time values was being evaluated. This
also reduces the usage of time.time(), which makes the codebase
more resilient against clock drift issues.
* Fix Limine install with ESP mounted outside /boot
Place limine.conf next to the EFI binary on the ESP so it is found
regardless of ESP mountpoint, and block unbootable layouts (non-UKI
Limine with ESP not at /boot and no separate /boot partition) in
GlobalMenu validation, guided.main() and _add_limine_bootloader().
Fixes#4333
* Extract bootloader layout validation into lib/bootloader/utils
* Consolidate Limine layout validation in bootloader utils
Move the boot-partition FAT check from GlobalMenu into
validate_bootloader_layout so all three call sites (GlobalMenu,
guided.py, Installer._add_limine_bootloader) share one function.
Return a BootloaderValidationFailure dataclass (kind + description)
instead of str | None, so callers can match on the failure kind and
the description is built where partition context is in scope.
* Encapsulate FAT filesystem detection in FilesystemType.is_fat()
The methods don't need access to the class, so they don't need to
be classmethods. This change reduces the number of 'bad return'
warnings seen when running Pyright, Pyrefly, and ty.
* Set console font automatically when selecting language
Add console_font field to languages.json and Language dataclass.
When a language is activated, setfont is called automatically,
falling back to default8x16 on error or for languages without
a custom font. Also activate translation when loading language
from config file.
* Support FONT environment variable for console font override
When FONT env var is set, use it as the console font instead of the language-specific font mapping from languages.json. The font is applied at startup and preserved across language switches.
On exit (success or failure), restore the console font to default8x16.
* CI checks fix
* Try to restore original console font with setfont -O
* Fix for pylint
* Restore console font before Textual exits application mode
Move font set/restore into Textual lifecycle to prevent color
artifacts from 256/512 glyph transitions. Apply FONT env var
and language font in on_mount, restore in _on_exit_app.
Skip font change when loading language from config (set_font=False)
to defer it until TUI starts.
* Fall back to language font mapping when FONT env var is invalid
Add _using_env_font flag to skip mapping only when FONT was
successfully applied. Show info message after TUI exits if FONT
could not be set.
* Use tempfile for console font backup files
* Fix linter errors: use mkstemp, close fds, add @override
* Fix ruff formatting
* Move font state from module singleton into TranslationHandler
* Refactor font handling per review feedback
* Make font methods members of TranslationHandler, skip on non-ISO
* ci: trigger tests
* Move running_from_iso import to module level
No circular dep, simpler than per-method local imports.
* Add explicit ISO guard to restore_console_font
Matches the existing guards in _set_font and save_console_font.
Behaviour was already safe implicitly via _font_backup=None, but
the explicit check makes intent obvious at the call site.
* Skip apply_console_font off-ISO
* Use list form for setfont SysCommand calls
* locale: ran generate_locale before making change
* locale: first 1000 confirmed everything is fine
* locale(hi): fixed rest of the fuzzy and empty strings
* locale(hi): ran locale generator
* Add Fonts application with multi-select for emoji and CJK packages
* Rename to Additional fonts and add package descriptions
* Add noto-fonts to font package selection
* Move font descriptions into FontPackage enum method
* ci: trigger tests
* Add ttf-liberation and ttf-dejavu to font selection