From a14604a1b642e41e53b09df7b9b0eabd684045a0 Mon Sep 17 00:00:00 2001 From: Werner Llácer Date: Mon, 25 Apr 2022 08:57:49 +0200 Subject: Created a routine to check if a partition includes a certain mountpoint (#1069) For a btrfs volume with a subvolume to be mounted on /, we will not generate a keyfile anymore --- archinstall/lib/disk/helpers.py | 32 ++++++++++++++++++++++ .../lib/user_interaction/partitioning_conf.py | 5 ++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/disk/helpers.py b/archinstall/lib/disk/helpers.py index 30c47666..2f73b2bd 100644 --- a/archinstall/lib/disk/helpers.py +++ b/archinstall/lib/disk/helpers.py @@ -440,3 +440,35 @@ def convert_device_to_uuid(path :str) -> str: time.sleep(storage['DISK_TIMEOUTS']) raise DiskError(f"Could not retrieve the UUID of {path} within a timely manner.") + +def has_mountpoint(partition: Union[dict,Partition,MapperDev], target: str, strict: bool = True) -> bool: + """ Determine if a certain partition is mounted (or has a mountpoint) as specific target (path) + Coded for clarity rather than performance + + Input parms: + :parm partition the partition we check + :type Either a Partition object or a dict with the contents of a partition definiton in the disk_layouts schema + + :parm target (a string representing a mount path we want to check for. + :type str + + :parm strict if the check will be strict, target is exactly the mountpoint, or no, where the target is a leaf (f.i. to check if it is in /mnt/archinstall/). Not available for root check ('/') for obvious reasons + + """ + # we create the mountpoint list + if isinstance(partition,dict): + subvols = partition.get('btrfs',{}).get('subvolumes',{}) + mountpoints = [partition.get('mountpoint'),] + [subvols[subvol] if isinstance(subvols[subvol],str) or not subvols[subvol] else subvols[subvol].get('mountpoint') for subvol in subvols] + else: + mountpoints = [partition.mountpoint,] + [subvol.target for subvol in partition.subvolumes] + # we check + if strict or target == '/': + if target in mountpoints: + return True + else: + return False + else: + for mp in mountpoints: + if mp and mp.endswith(target): + return True + return False diff --git a/archinstall/lib/user_interaction/partitioning_conf.py b/archinstall/lib/user_interaction/partitioning_conf.py index a1abd732..734bbe87 100644 --- a/archinstall/lib/user_interaction/partitioning_conf.py +++ b/archinstall/lib/user_interaction/partitioning_conf.py @@ -6,6 +6,7 @@ from ..menu import Menu from ..output import log from ..disk.validators import fs_types +from ..disk.helpers import has_mountpoint if TYPE_CHECKING: from ..disk import BlockDevice @@ -298,7 +299,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str, elif task == set_btrfs_subvolumes: from .subvolume_config import SubvolumeList - + # TODO get preexisting partitions title = _('{}\n\nSelect which partition to set subvolumes on').format(current_layout) partition = select_partition(title, block_device_struct["partitions"],filter=lambda x:True if x.get('filesystem',{}).get('format') == 'btrfs' else False) @@ -325,7 +326,7 @@ def select_encrypted_partitions(block_devices: dict, password: str) -> dict: partition['encrypted'] = True partition['!password'] = password - if partition['mountpoint'] != '/': + if not has_mountpoint(partition,'/'): # Tell the upcoming steps to generate a key-file for non root mounts. partition['generate-encryption-key-file'] = True -- cgit v1.2.3-70-g09d2