diff --git a/archinstall/lib/bootloader/bootloader_menu.py b/archinstall/lib/bootloader/bootloader_menu.py index 720a0c8926..4e6d2e320c 100644 --- a/archinstall/lib/bootloader/bootloader_menu.py +++ b/archinstall/lib/bootloader/bootloader_menu.py @@ -6,7 +6,6 @@ from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup from archinstall.tui.ui.result import ResultType -from ..hardware import SysInfo from ..menu.abstract_menu import AbstractSubMenu from ..models.bootloader import Bootloader, BootloaderConfiguration @@ -15,10 +14,12 @@ class BootloaderMenu(AbstractSubMenu[BootloaderConfiguration]): def __init__( self, bootloader_conf: BootloaderConfiguration, + uefi: bool, skip_boot: bool = False, ): self._bootloader_conf = bootloader_conf self._skip_boot = skip_boot + self._uefi = uefi menu_options = self._define_menu_options() self._item_group = MenuItemGroup(menu_options, sort_items=False, checkmarks=True) @@ -30,15 +31,14 @@ def __init__( def _define_menu_options(self) -> list[MenuItem]: bootloader = self._bootloader_conf.bootloader - has_uefi = SysInfo.has_uefi() # UKI availability - uki_enabled = has_uefi and bootloader.has_uki_support() + uki_enabled = self._uefi and bootloader.has_uki_support() if not uki_enabled: self._bootloader_conf.uki = False # Removable availability - removable_enabled = has_uefi and bootloader.has_removable_support() + removable_enabled = self._uefi and bootloader.has_removable_support() if not removable_enabled: self._bootloader_conf.removable = False @@ -92,12 +92,12 @@ def run(self) -> BootloaderConfiguration: return self._bootloader_conf def _select_bootloader(self, preset: Bootloader | None) -> Bootloader | None: - bootloader = select_bootloader(preset, self._skip_boot) + bootloader = select_bootloader(preset, self._uefi, self._skip_boot) if bootloader: # Update UKI option based on bootloader uki_item = self._menu_item_group.find_by_key('uki') - if not SysInfo.has_uefi() or not bootloader.has_uki_support(): + if not self._uefi or not bootloader.has_uki_support(): uki_item.enabled = False uki_item.value = False self._bootloader_conf.uki = False @@ -106,7 +106,7 @@ def _select_bootloader(self, preset: Bootloader | None) -> Bootloader | None: # Update removable option based on bootloader removable_item = self._menu_item_group.find_by_key('removable') - if not SysInfo.has_uefi() or not bootloader.has_removable_support(): + if not self._uefi or not bootloader.has_removable_support(): removable_item.enabled = False removable_item.value = False self._bootloader_conf.removable = False @@ -180,27 +180,23 @@ def _select_removable(self, preset: bool) -> bool: def select_bootloader( preset: Bootloader | None, + uefi: bool, skip_boot: bool = False, ) -> Bootloader | None: options = [] hidden_options = [] - default = None header = tr('Select bootloader to install') - if skip_boot: - default = Bootloader.NO_BOOTLOADER - else: + default = Bootloader.get_default(uefi, skip_boot) + + if not skip_boot: hidden_options += [Bootloader.NO_BOOTLOADER] - if not SysInfo.has_uefi(): + if not uefi: options += [Bootloader.Grub, Bootloader.Limine] - if not default: - default = Bootloader.Grub header += '\n' + tr('UEFI is not detected and some options are disabled') else: options += [b for b in Bootloader if b not in hidden_options] - if not default: - default = Bootloader.Systemd items = [MenuItem(o.value, value=o) for o in options] group = MenuItemGroup(items) diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index bac3b22a81..dde90a359b 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -47,6 +47,7 @@ def __init__( self._arch_config = arch_config self._mirror_list_handler = mirror_list_handler self._skip_boot = skip_boot + self._uefi = SysInfo.has_uefi() menu_options = self._get_menu_options() self._item_group = MenuItemGroup( @@ -94,7 +95,7 @@ def _get_menu_options(self) -> list[MenuItem]: ), MenuItem( text=tr('Bootloader'), - value=BootloaderConfiguration.get_default(self._skip_boot), + value=BootloaderConfiguration.get_default(self._uefi, self._skip_boot), action=self._select_bootloader_config, preview_action=self._prev_bootloader_config, key='bootloader_config', @@ -422,7 +423,7 @@ def _prev_kernel(self, item: MenuItem) -> str | None: def _prev_bootloader_config(self, item: MenuItem) -> str | None: bootloader_config: BootloaderConfiguration | None = item.value if bootloader_config: - return bootloader_config.preview() + return bootloader_config.preview(self._uefi) return None def _validate_bootloader(self) -> str | None: @@ -455,7 +456,7 @@ def _validate_bootloader(self) -> str | None: for layout in disk_config.device_modifications: if boot_partition := layout.get_boot_partition(): break - if SysInfo.has_uefi(): + if self._uefi: for layout in disk_config.device_modifications: if efi_partition := layout.get_efi_partition(): break @@ -468,7 +469,7 @@ def _validate_bootloader(self) -> str | None: if boot_partition is None: return 'Boot partition not found' - if SysInfo.has_uefi(): + if self._uefi: if efi_partition is None: return 'EFI system partition (ESP) not found' @@ -480,7 +481,7 @@ def _validate_bootloader(self) -> str | None: return 'Limine does not support booting with a non-FAT boot partition' elif bootloader == Bootloader.Refind: - if not SysInfo.has_uefi(): + if not self._uefi: return 'rEFInd can only be used on UEFI systems' return None @@ -530,9 +531,9 @@ def _select_bootloader_config( preset: BootloaderConfiguration | None = None, ) -> BootloaderConfiguration | None: if preset is None: - preset = BootloaderConfiguration.get_default(self._skip_boot) + preset = BootloaderConfiguration.get_default(self._uefi, self._skip_boot) - bootloader_config = BootloaderMenu(preset, self._skip_boot).run() + bootloader_config = BootloaderMenu(preset, self._uefi, self._skip_boot).run() return bootloader_config diff --git a/archinstall/lib/models/bootloader.py b/archinstall/lib/models/bootloader.py index 0e5d7692b3..e9856ccd79 100644 --- a/archinstall/lib/models/bootloader.py +++ b/archinstall/lib/models/bootloader.py @@ -5,7 +5,6 @@ from archinstall.lib.translationhandler import tr -from ..hardware import SysInfo from ..output import warn @@ -31,10 +30,10 @@ def json(self) -> str: return self.value @classmethod - def get_default(cls, skip_boot: bool = False) -> Self: + def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self: if skip_boot: return cls.NO_BOOTLOADER - elif SysInfo.has_uefi(): + elif uefi: return cls.Systemd else: return cls.Grub @@ -71,23 +70,23 @@ def parse_arg(cls, config: dict[str, Any], skip_boot: bool) -> Self: return cls(bootloader=bootloader, uki=uki, removable=removable) @classmethod - def get_default(cls, skip_boot: bool = False) -> Self: - bootloader = Bootloader.get_default(skip_boot) - removable = SysInfo.has_uefi() and bootloader.has_removable_support() - uki = SysInfo.has_uefi() and bootloader.has_uki_support() + def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self: + bootloader = Bootloader.get_default(uefi, skip_boot) + removable = uefi and bootloader.has_removable_support() + uki = uefi and bootloader.has_uki_support() return cls(bootloader=bootloader, uki=uki, removable=removable) - def preview(self) -> str: + def preview(self, uefi: bool) -> str: text = f'{tr("Bootloader")}: {self.bootloader.value}' text += '\n' - if SysInfo.has_uefi() and self.bootloader.has_uki_support(): + if uefi and self.bootloader.has_uki_support(): if self.uki: uki_string = tr('Enabled') else: uki_string = tr('Disabled') text += f'UKI: {uki_string}' text += '\n' - if SysInfo.has_uefi() and self.bootloader.has_removable_support(): + if uefi and self.bootloader.has_removable_support(): if self.removable: removable_string = tr('Enabled') else: