Ejemplo n.º 1
0
def load_config():
    if archinstall.arguments.get('harddrives', None) is not None:
        if type(archinstall.arguments['harddrives']) is str:
            archinstall.arguments['harddrives'] = archinstall.arguments[
                'harddrives'].split(',')
        archinstall.arguments['harddrives'] = [
            archinstall.BlockDevice(BlockDev)
            for BlockDev in archinstall.arguments['harddrives']
        ]
        # Temporarily disabling keep_partitions if config file is loaded
        # Temporary workaround to make Desktop Environments work
    if archinstall.arguments.get('profile', None) is not None:
        if type(archinstall.arguments.get('profile', None)) is dict:
            archinstall.arguments['profile'] = archinstall.Profile(
                None,
                archinstall.arguments.get('profile', None)['path'])
        else:
            archinstall.arguments['profile'] = archinstall.Profile(
                None, archinstall.arguments.get('profile', None))
    archinstall.storage['_desktop_profile'] = archinstall.arguments.get(
        'desktop-environment', None)
    if archinstall.arguments.get('mirror-region', None) is not None:
        if type(archinstall.arguments.get('mirror-region', None)) is dict:
            archinstall.arguments['mirror-region'] = archinstall.arguments.get(
                'mirror-region', None)
        else:
            selected_region = archinstall.arguments.get('mirror-region', None)
            archinstall.arguments['mirror-region'] = {
                selected_region: archinstall.list_mirrors()[selected_region]
            }
    if archinstall.arguments.get('sys-language', None) is not None:
        archinstall.arguments['sys-language'] = archinstall.arguments.get(
            'sys-language', 'en_US')
    if archinstall.arguments.get('sys-encoding', None) is not None:
        archinstall.arguments['sys-encoding'] = archinstall.arguments.get(
            'sys-encoding', 'utf-8')
    if archinstall.arguments.get('gfx_driver', None) is not None:
        archinstall.storage['gfx_driver_packages'] = AVAILABLE_GFX_DRIVERS.get(
            archinstall.arguments.get('gfx_driver', None), None)
    if archinstall.arguments.get('servers', None) is not None:
        archinstall.storage['_selected_servers'] = archinstall.arguments.get(
            'servers', None)
    if archinstall.arguments.get('disk_layouts', None) is not None:
        if (dl_path := pathlib.Path(archinstall.arguments['disk_layouts'])
            ).exists() and str(dl_path).endswith('.json'):
            try:
                with open(dl_path) as fh:
                    archinstall.storage['disk_layouts'] = json.load(fh)
            except Exception as e:
                raise ValueError(
                    f"--disk_layouts does not contain a valid JSON format: {e}"
                )
        else:
            try:
                archinstall.storage['disk_layouts'] = json.loads(
                    archinstall.arguments['disk_layouts'])
            except:
                raise ValueError(
                    "--disk_layouts=<json> needs either a JSON file or a JSON string given with a valid disk layout."
                )
Ejemplo n.º 2
0
def load_harddrives():
    if archinstall.arguments.get('harddrives', None) is not None:
        if type(archinstall.arguments['harddrives']) is str:
            archinstall.arguments['harddrives'] = archinstall.arguments[
                'harddrives'].split(',')
        archinstall.arguments['harddrives'] = [
            archinstall.BlockDevice(BlockDev)
            for BlockDev in archinstall.arguments['harddrives']
        ]
Ejemplo n.º 3
0
def load_config():
    if archinstall.arguments.get('harddrives', None) is not None:
        if type(archinstall.arguments['harddrives']) is str:
            archinstall.arguments['harddrives'] = archinstall.arguments[
                'harddrives'].split(',')
        archinstall.arguments['harddrives'] = [
            archinstall.BlockDevice(BlockDev)
            for BlockDev in archinstall.arguments['harddrives']
        ]
        # Temporarily disabling keep_partitions if config file is loaded
        # Temporary workaround to make Desktop Environments work
    if archinstall.arguments.get('profile', None) is not None:
        if type(archinstall.arguments.get('profile', None)) is dict:
            archinstall.arguments['profile'] = archinstall.Profile(
                None,
                archinstall.arguments.get('profile', None)['path'])
        else:
            archinstall.arguments['profile'] = archinstall.Profile(
                None, archinstall.arguments.get('profile', None))
    archinstall.storage['_desktop_profile'] = archinstall.arguments.get(
        'desktop-environment', None)
    if archinstall.arguments.get('mirror-region', None) is not None:
        if type(archinstall.arguments.get('mirror-region', None)) is dict:
            archinstall.arguments['mirror-region'] = archinstall.arguments.get(
                'mirror-region', None)
        else:
            selected_region = archinstall.arguments.get('mirror-region', None)
            archinstall.arguments['mirror-region'] = {
                selected_region: archinstall.list_mirrors()[selected_region]
            }
    if archinstall.arguments.get('sys-language', None) is not None:
        archinstall.arguments['sys-language'] = archinstall.arguments.get(
            'sys-language', 'en_US')
    if archinstall.arguments.get('sys-encoding', None) is not None:
        archinstall.arguments['sys-encoding'] = archinstall.arguments.get(
            'sys-encoding', 'utf-8')
    if archinstall.arguments.get('gfx_driver', None) is not None:
        archinstall.storage[
            'gfx_driver_packages'] = archinstall.AVAILABLE_GFX_DRIVERS.get(
                archinstall.arguments.get('gfx_driver', None), None)
    if archinstall.arguments.get('servers', None) is not None:
        archinstall.storage['_selected_servers'] = archinstall.arguments.get(
            'servers', None)
Ejemplo n.º 4
0
def ask_user_questions():
    """
	  First, we'll ask the user for a bunch of user input.
	  Not until we're satisfied with what we want to install
	  will we continue with the actual installation steps.
	"""
    if not archinstall.arguments.get('keyboard-language', None):
        archinstall.arguments[
            'keyboard-language'] = archinstall.select_language(
                archinstall.list_keyboard_languages()).strip()

    # Before continuing, set the preferred keyboard layout/language in the current terminal.
    # This will just help the user with the next following questions.
    if len(archinstall.arguments['keyboard-language']):
        archinstall.set_keyboard_language(
            archinstall.arguments['keyboard-language'])

    # Set which region to download packages from during the installation
    if not archinstall.arguments.get('mirror-region', None):
        archinstall.arguments[
            'mirror-region'] = archinstall.select_mirror_regions(
                archinstall.list_mirrors())
    else:
        selected_region = archinstall.arguments['mirror-region']
        archinstall.arguments['mirror-region'] = {
            selected_region: archinstall.list_mirrors()[selected_region]
        }

    # Ask which harddrive/block-device we will install to
    if archinstall.arguments.get('harddrive', None):
        archinstall.arguments['harddrive'] = archinstall.BlockDevice(
            archinstall.arguments['harddrive'])
    else:
        archinstall.arguments['harddrive'] = archinstall.select_disk(
            archinstall.all_disks())

    # Perform a quick sanity check on the selected harddrive.
    # 1. Check if it has partitions
    # 3. Check that we support the current partitions
    # 2. If so, ask if we should keep them or wipe everything
    if archinstall.arguments['harddrive'].has_partitions():
        archinstall.log(
            f"{archinstall.arguments['harddrive']} contains the following partitions:",
            fg='yellow')

        # We curate a list pf supported paritions
        # and print those that we don't support.
        partition_mountpoints = {}
        for partition in archinstall.arguments['harddrive']:
            try:
                if partition.filesystem_supported():
                    archinstall.log(f" {partition}")
                    partition_mountpoints[partition] = None
            except archinstall.UnknownFilesystemFormat as err:
                archinstall.log(f" {partition} (Filesystem not supported)",
                                fg='red')

        # We then ask what to do with the paritions.
        if (option := archinstall.ask_for_disk_layout()) == 'abort':
            archinstall.log(
                f"Safely aborting the installation. No changes to the disk or system has been made."
            )
            exit(1)
        elif option == 'keep-existing':
            archinstall.arguments['harddrive'].keep_partitions = True

            archinstall.log(
                f" ** You will now select which partitions to use by selecting mount points (inside the installation). **"
            )
            archinstall.log(
                f" ** The root would be a simple / and the boot partition /boot (as all paths are relative inside the installation). **"
            )
            while True:
                # Select a partition
                partition = archinstall.generic_select(
                    partition_mountpoints.keys(),
                    "Select a partition by number that you want to set a mount-point for (leave blank when done): "
                )
                if not partition:
                    break

                # Select a mount-point
                mountpoint = input(
                    f"Enter a mount-point for {partition}: ").strip(' ')
                if len(mountpoint):

                    # Get a valid & supported filesystem for the parition:
                    while 1:
                        new_filesystem = input(
                            f"Enter a valid filesystem for {partition} (leave blank for {partition.filesystem}): "
                        ).strip(' ')
                        if len(new_filesystem) <= 0:
                            if partition.encrypted and partition.filesystem == 'crypto_LUKS':
                                old_password = archinstall.arguments.get(
                                    '!encryption-password', None)
                                if not old_password:
                                    old_password = input(
                                        f'Enter the old encryption password for {partition}: '
                                    )

                                if (autodetected_filesystem :=
                                        partition.detect_inner_filesystem(
                                            old_password)):
                                    new_filesystem = autodetected_filesystem
                                else:
                                    archinstall.log(
                                        f"Could not auto-detect the filesystem inside the encrypted volume.",
                                        fg='red')
                                    archinstall.log(
                                        f"A filesystem must be defined for the unlocked encrypted partition."
                                    )
                                    continue
                            break

                        # Since the potentially new filesystem is new
                        # we have to check if we support it. We can do this by formatting /dev/null with the partitions filesystem.
                        # There's a nice wrapper for this on the partition object itself that supports a path-override during .format()
                        try:
                            partition.format(new_filesystem,
                                             path='/dev/null',
                                             log_formating=False,
                                             allow_formatting=True)
                        except archinstall.UnknownFilesystemFormat:
                            archinstall.log(
                                f"Selected filesystem is not supported yet. If you want archinstall to support '{new_filesystem}', please create a issue-ticket suggesting it on github at https://github.com/Torxed/archinstall/issues."
                            )
                            archinstall.log(
                                f"Until then, please enter another supported filesystem."
                            )
                            continue
                        except archinstall.SysCallError:
                            pass  # Expected exception since mkfs.<format> can not format /dev/null.
                            # But that means our .format() function supported it.
                        break

                    # When we've selected all three criterias,
                    # We can safely mark the partition for formatting and where to mount it.
                    # TODO: allow_formatting might be redundant since target_mountpoint should only be
                    #       set if we actually want to format it anyway.
                    partition.allow_formatting = True
                    partition.target_mountpoint = mountpoint
                    # Only overwrite the filesystem definition if we selected one:
                    if len(new_filesystem):
                        partition.filesystem = new_filesystem

            archinstall.log('Using existing partition table reported above.')
Ejemplo n.º 5
0

if not check_mirror_reachable():
    log_file = os.path.join(archinstall.storage.get('LOG_PATH', None),
                            archinstall.storage.get('LOG_FILE', None))
    archinstall.log(
        f"Arch Linux mirrors are not reachable. Please check your internet connection and the log file '{log_file}'.",
        level=logging.INFO,
        fg="red")
    exit(1)

if archinstall.arguments.get('silent', None) is None:
    ask_user_questions()
else:
    # Workarounds if config is loaded from a file
    # The harddrive section should be moved to perform_installation_steps, where it's actually being performed
    # Blockdevice object should be created in perform_installation_steps
    # This needs to be done until then
    archinstall.arguments['harddrive'] = archinstall.BlockDevice(
        path=archinstall.arguments['harddrive']['path'])
    # Temporarily disabling keep_partitions if config file is loaded
    archinstall.arguments['harddrive'].keep_partitions = False
    # Temporary workaround to make Desktop Environments work
    if archinstall.arguments.get('profile', None) is not None:
        archinstall.arguments['profile'] = archinstall.Profile(
            None, archinstall.arguments.get('profile', None))
    else:
        archinstall.arguments['profile'] = None

perform_installation_steps()