Reworking select_encrypted_partitions() to use the new Menu system, (#1201)

* Reworking select_encrypted_partitions() to use the new Menu system, and allow granularity.

* Listing partitions and enabling a index selection. Also when selecting 'delete all partitions' wipe=True will get set on the blockdevice now. Otherwise the new partitions won't be able to be created without deleting them first.

* flake8 fix

* Removed old select_encrypted_partitions()
This commit is contained in:
Anton Hvornum 2022-05-17 10:06:37 +02:00 committed by GitHub
parent 4e39bfb563
commit 3d102854a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 15 deletions

View File

@ -193,8 +193,15 @@ class GlobalMenu(GeneralMenu):
# If no partitions was marked as encrypted, but a password was supplied and we have some disks to format..
# Then we need to identify which partitions to encrypt. This will default to / (root).
if len(list(encrypted_partitions(storage['arguments'].get('disk_layouts', [])))) == 0:
storage['arguments']['disk_layouts'] = select_encrypted_partitions(
storage['arguments']['disk_layouts'], storage['arguments']['!encryption-password'])
for blockdevice in storage['arguments']['disk_layouts']:
for partition_index in select_encrypted_partitions(
title="Select which partitions to encrypt:",
partitions=storage['arguments']['disk_layouts'][blockdevice]['partitions']
):
partition = storage['arguments']['disk_layouts'][blockdevice]['partitions'][partition_index]
partition['encrypted'] = True
partition['!password'] = storage['arguments']['!encryption-password']
def _install_text(self):
missing = len(self._missing_configs())

View File

@ -8,7 +8,6 @@ from ..menu.menu import MenuSelectionType
from ..output import log
from ..disk.validators import fs_types
from ..disk.helpers import has_mountpoint
if TYPE_CHECKING:
from ..disk import BlockDevice
@ -271,6 +270,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str,
block_device_struct["partitions"][partition]["filesystem"]["mount_options"].append("compress=zstd")
elif task == delete_all_partitions:
block_device_struct["partitions"] = []
block_device_struct["wipe"] = True
elif task == assign_mount_point:
title = _('{}\n\nSelect by index which partition to mount where').format(current_layout)
partition = select_partition(title, block_device_struct["partitions"])
@ -360,19 +360,30 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str,
return block_device_struct
def select_encrypted_partitions(
title :str,
partitions :List[Partition],
multiple :bool = True,
filter_ :Callable = None
) -> Optional[int, List[int]]:
partition_indexes = _get_partitions(partitions, filter_)
def select_encrypted_partitions(block_devices: dict, password: str) -> dict:
for device in block_devices:
for partition in block_devices[device]['partitions']:
if partition.get('mountpoint', None) != '/boot':
partition['encrypted'] = True
partition['!password'] = password
if len(partition_indexes) == 0:
return None
if not has_mountpoint(partition,'/'):
# Tell the upcoming steps to generate a key-file for non root mounts.
partition['generate-encryption-key-file'] = True
title = _('Select which partitions to mark for formatting:')
return block_devices
# show current partition layout:
if len(partitions):
title += _current_partition_layout(partitions) + '\n'
# TODO: Next version perhaps we can support mixed multiple encrypted partitions
# Users might want to single out a partition for non-encryption to share between dualboot etc.
choice = Menu(title, partition_indexes, multi=multiple).run()
if choice.type_ == MenuSelectionType.Esc:
return None
if isinstance(choice.value, list):
for partition_index in choice.value:
yield int(partition_index)
else:
yield (partition_index)