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.')
for (num, partition) in enumerate(disk.partition): print(f"({num}): {partition}") if (index_str := input(message + ': ')): index = int(index_str) if index < len(disk.partition) and index > -1: return disk.partition[index] else: raise archinstall.DiskError("Partition is out of list") # Select a harddrive and a disk password harddrive = archinstall.select_disk(archinstall.all_disks()) extra_partitions = {} if len(list(filter(lambda x: x.filesystem_supported, harddrive.partition))) > 0: 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': boot = get_partition(harddrive, "/boot", message="Choose boot partition") root = get_partition(harddrive, "/", message="Choose root partition") elif option == 'format-all': boot = None root = None print("formatting entire disk") else: boot = None