Added a soft-wrapper around parted logic. This logic will guide users through setting up partitions, if they chose to wipe a drive. We'll avoid doing to much auto-magic, and this is just a start.
This commit is contained in:
parent
d6f63375c6
commit
3e601ff9ab
|
|
@ -444,6 +444,7 @@ def generic_select(options, input_text="Select one of the above by index or abso
|
||||||
# Therefore, now we can only provide the dictionary itself
|
# Therefore, now we can only provide the dictionary itself
|
||||||
if type(options) == dict: options = list(options.values())
|
if type(options) == dict: options = list(options.values())
|
||||||
if sort: options = sorted(options) # As we pass only list and dict (converted to list), we can skip converting to list
|
if sort: options = sorted(options) # As we pass only list and dict (converted to list), we can skip converting to list
|
||||||
|
options = [x for x in options if x] # Clean it up from empty options
|
||||||
if len(options) == 0:
|
if len(options) == 0:
|
||||||
log(f" * Generic select didn't find any options to choose from * ", fg='red')
|
log(f" * Generic select didn't find any options to choose from * ", fg='red')
|
||||||
log(" * If problem persists, please create an issue on https://github.com/archlinux/archinstall/issues * ", fg='yellow')
|
log(" * If problem persists, please create an issue on https://github.com/archlinux/archinstall/issues * ", fg='yellow')
|
||||||
|
|
@ -515,6 +516,77 @@ def select_partition_layout(block_device):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def valid_fs_type(fstype :str) -> bool:
|
||||||
|
# https://www.gnu.org/software/parted/manual/html_node/mkpart.html
|
||||||
|
return fstype in [
|
||||||
|
"ext2",
|
||||||
|
"fat16", "fat32",
|
||||||
|
"hfs", "hfs+", "hfsx",
|
||||||
|
"linux-swap",
|
||||||
|
"NTFS",
|
||||||
|
"reiserfs",
|
||||||
|
"ufs",
|
||||||
|
"btrfs",
|
||||||
|
]
|
||||||
|
|
||||||
|
def valid_parted_position(pos :str):
|
||||||
|
return len(pos) and (start.isdigit() or (start[-1] == '%' and start[:-1].isdigit()))
|
||||||
|
|
||||||
|
def partition_overlap(partitions :list, start :str, end :str) -> bool:
|
||||||
|
# TODO: Implement sanity check
|
||||||
|
return False
|
||||||
|
|
||||||
|
def wipe_and_create_partitions(block_device):
|
||||||
|
if hasUEFI():
|
||||||
|
partition_type = 'gpt'
|
||||||
|
else:
|
||||||
|
partition_type = 'msdos'
|
||||||
|
|
||||||
|
partitions_result = []
|
||||||
|
|
||||||
|
while True:
|
||||||
|
modes = [
|
||||||
|
"Create new partition",
|
||||||
|
"Delete partition" if len(block_device) else "",
|
||||||
|
"Assign mount-point for partition" if len(block_device) else "",
|
||||||
|
"Mark a partition as encrypted" if len(block_device) else "",
|
||||||
|
"Mark a partition as bootable (automatic for /boot)" if len(block_device) else ""
|
||||||
|
]
|
||||||
|
|
||||||
|
task = generic_select(modes,
|
||||||
|
input_text=f"Select what to do with {block_device}: ")
|
||||||
|
|
||||||
|
if task == 'Create new partition':
|
||||||
|
if partition_type == 'gpt':
|
||||||
|
# https://www.gnu.org/software/parted/manual/html_node/mkpart.html
|
||||||
|
# https://www.gnu.org/software/parted/manual/html_node/mklabel.html
|
||||||
|
name = input("Enter a desired name for the partition: ").strip()
|
||||||
|
fstype = input("Enter a desired filesystem type for the partition: ").strip()
|
||||||
|
start = input("Enter the start sector of the partition (percentage or block number, ex: 0%): ").strip()
|
||||||
|
end = input("Enter the end sector of the partition (percentage or block number, ex: 100%): ").strip()
|
||||||
|
|
||||||
|
if valid_parted_position(start) and valid_parted_position(end) and valid_fs_type(fstype):
|
||||||
|
if partition_overlap(partitions_result, start, end):
|
||||||
|
log(f"This partition overlaps with other partitions on the drive! Ignoring this partition creation.", fg="red")
|
||||||
|
continue
|
||||||
|
|
||||||
|
partitions_result.append({
|
||||||
|
"type" : "primary", # Strictly only allowed under MSDOS, but GPT accepts it so it's "safe" to inject
|
||||||
|
"start" : start,
|
||||||
|
"size" : end,
|
||||||
|
"filesystem" : {
|
||||||
|
"format" : fstype
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
log(f"Invalid start, end or fstype for this partition. Ignoring this partition creation.", fg="red")
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif task == "Delete partition":
|
||||||
|
elif task == "Assign mount-point for partition":
|
||||||
|
elif task == "Mark a partition as encrypted":
|
||||||
|
elif task == "Mark a partition as bootable (automatic for /boot)":
|
||||||
|
|
||||||
def select_individual_blockdevice_usage(block_devices :list):
|
def select_individual_blockdevice_usage(block_devices :list):
|
||||||
result = {}
|
result = {}
|
||||||
|
|
||||||
|
|
@ -526,11 +598,13 @@ def select_individual_blockdevice_usage(block_devices :list):
|
||||||
]
|
]
|
||||||
|
|
||||||
device_mode = generic_select(modes)
|
device_mode = generic_select(modes)
|
||||||
|
|
||||||
if device_mode == "Re-use partitions":
|
if device_mode == "Re-use partitions":
|
||||||
layout = select_partition_layout(device)
|
layout = select_partition_layout(device)
|
||||||
result[device.path] = layout
|
|
||||||
else:
|
else:
|
||||||
...
|
layout = wipe_and_create_partitions(device)
|
||||||
|
|
||||||
|
result[device.path] = layout
|
||||||
|
|
||||||
|
|
||||||
def select_disk_layout(block_devices :list):
|
def select_disk_layout(block_devices :list):
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,12 @@ def ask_user_questions():
|
||||||
archinstall.arguments['mirror-region'] = {selected_region : archinstall.list_mirrors()[selected_region]}
|
archinstall.arguments['mirror-region'] = {selected_region : archinstall.list_mirrors()[selected_region]}
|
||||||
|
|
||||||
|
|
||||||
|
# Ask which boot-loader to use (will only ask if we're in BIOS (non-efi) mode)
|
||||||
|
# We do this before the disk selection process because there are some soft dependencies
|
||||||
|
# in retards to which boot loader/mode we're in.
|
||||||
|
archinstall.arguments["bootloader"] = archinstall.ask_for_bootloader()
|
||||||
|
|
||||||
|
|
||||||
# Ask which harddrives/block-devices we will install to
|
# Ask which harddrives/block-devices we will install to
|
||||||
# and convert them into archinstall.BlockDevice() objects.
|
# and convert them into archinstall.BlockDevice() objects.
|
||||||
if archinstall.arguments.get('harddrives', None):
|
if archinstall.arguments.get('harddrives', None):
|
||||||
|
|
@ -65,10 +71,6 @@ def ask_user_questions():
|
||||||
archinstall.arguments['!encryption-password'] = passwd
|
archinstall.arguments['!encryption-password'] = passwd
|
||||||
|
|
||||||
|
|
||||||
# Ask which boot-loader to use (will only ask if we're in BIOS (non-efi) mode)
|
|
||||||
archinstall.arguments["bootloader"] = archinstall.ask_for_bootloader()
|
|
||||||
|
|
||||||
|
|
||||||
# Get the hostname for the machine
|
# Get the hostname for the machine
|
||||||
if not archinstall.arguments.get('hostname', None):
|
if not archinstall.arguments.get('hostname', None):
|
||||||
archinstall.arguments['hostname'] = input('Desired hostname for the installation: ').strip(' ')
|
archinstall.arguments['hostname'] = input('Desired hostname for the installation: ').strip(' ')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue