144 lines
4.4 KiB
Python
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
|