archinstall/archinstall/lib/user_interaction/system_conf.py

144 lines
4.4 KiB
Python

from __future__ import annotations
from typing import List, Any, Dict, TYPE_CHECKING
from ..disk import all_blockdevices
from ..exceptions import RequirementError
from ..hardware import AVAILABLE_GFX_DRIVERS, has_uefi, has_amd_graphics, has_intel_graphics, has_nvidia_graphics
from ..menu import Menu
from ..storage import storage
from ..translation import DeferredTranslation
if TYPE_CHECKING:
_: Any
def select_kernel(preset: List[str] = None) -> List[str]:
"""
Asks the user to select a kernel for system.
:return: The string as a selected kernel
:rtype: string
"""
kernels = ["linux", "linux-lts", "linux-zen", "linux-hardened"]
default_kernel = "linux"
selected_kernels = Menu(_('Choose which kernels to use or leave blank for default "{}"').format(default_kernel),
kernels,
sort=True,
multi=True,
preset_values=preset,
default_option=default_kernel).run()
return selected_kernels
def select_harddrives(preset: List[str] = []) -> List[str]:
"""
Asks the user to select one or multiple hard drives
:return: List of selected hard drives
:rtype: list
"""
hard_drives = all_blockdevices(partitions=False).values()
options = {f'{option}': option for option in hard_drives}
if preset:
preset_disks = {f'{option}': option for option in preset}
else:
preset_disks = {}
selected_harddrive = Menu(_('Select one or more hard drives to use and configure'),
list(options.keys()),
preset_values=list(preset_disks.keys()),
multi=True).run()
if selected_harddrive and len(selected_harddrive) > 0:
return [options[i] for i in selected_harddrive]
return []
def select_driver(options: Dict[str, Any] = AVAILABLE_GFX_DRIVERS) -> str:
"""
Some what convoluted function, whose job is simple.
Select a graphics driver from a pre-defined set of popular options.
(The template xorg is for beginner users, not advanced, and should
there for appeal to the general public first and edge cases later)
"""
drivers = sorted(list(options))
if drivers:
arguments = storage.get('arguments', {})
title = DeferredTranslation('')
if has_amd_graphics():
title += _(
'For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options.'
) + '\n'
if has_intel_graphics():
title += _(
'For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n'
)
if has_nvidia_graphics():
title += _(
'For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n'
)
title += _('\n\nSelect a graphics driver or leave blank to install all open-source drivers')
arguments['gfx_driver'] = Menu(title, drivers).run()
if arguments.get('gfx_driver', None) is None:
arguments['gfx_driver'] = _("All open-source (default)")
return options.get(arguments.get('gfx_driver'))
raise RequirementError("Selecting drivers require a least one profile to be given as an option.")
def ask_for_bootloader(advanced_options: bool = False, preset: str = None) -> str:
if preset == 'systemd-bootctl':
preset_val = 'systemd-boot' if advanced_options else Menu.no()
elif preset == 'grub-install':
preset_val = 'grub' if advanced_options else Menu.yes()
else:
preset_val = preset
bootloader = "systemd-bootctl" if has_uefi() else "grub-install"
if has_uefi():
if not advanced_options:
bootloader_choice = Menu(_('Would you like to use GRUB as a bootloader instead of systemd-boot?'),
Menu.yes_no(),
preset_values=preset_val,
default_option=Menu.no()).run()
if bootloader_choice == Menu.yes():
bootloader = "grub-install"
else:
# We use the common names for the bootloader as the selection, and map it back to the expected values.
choices = ['systemd-boot', 'grub', 'efistub']
selection = Menu(_('Choose a bootloader'), choices, preset_values=preset_val).run()
if selection != "":
if selection == 'systemd-boot':
bootloader = 'systemd-bootctl'
elif selection == 'grub':
bootloader = 'grub-install'
else:
bootloader = selection
return bootloader
def ask_for_swap(preset: bool = True) -> bool:
if preset:
preset_val = Menu.yes()
else:
preset_val = Menu.no()
prompt = _('Would you like to use swap on zram?')
choice = Menu(prompt, Menu.yes_no(), default_option=Menu.yes(), preset_values=preset_val).run()
return False if choice == Menu.no() else True