Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 12 additions & 16 deletions archinstall/lib/bootloader/bootloader_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down
15 changes: 8 additions & 7 deletions archinstall/lib/global_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand All @@ -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'

Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down
19 changes: 9 additions & 10 deletions archinstall/lib/models/bootloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

from archinstall.lib.translationhandler import tr

from ..hardware import SysInfo
from ..output import warn


Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down