diff --git a/.gitignore b/.gitignore index 8cb99b4b..c4455e44 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ dev.py htmlcov/ poetry.lock .pytest_cache +macos_dev/ diff --git a/recoverpy/__main__.py b/recoverpy/__main__.py index 1b9faf54..e061eb24 100755 --- a/recoverpy/__main__.py +++ b/recoverpy/__main__.py @@ -1,3 +1,3 @@ import recoverpy -recoverpy.main() \ No newline at end of file +recoverpy.main() diff --git a/recoverpy/helper.py b/recoverpy/helper.py index 43e0ba39..a336b1e9 100644 --- a/recoverpy/helper.py +++ b/recoverpy/helper.py @@ -1,11 +1,22 @@ import py_cui from subprocess import check_output, call +from platform import system from os import geteuid from recoverpy import logger as LOGGER +def which_os() -> str: + user_os = system().lower() + + if user_os not in ["linux", "darwin"]: + print(f"Your OS ({user_os}) is not supported.") + exit() + + return user_os + + def is_user_root(window: py_cui.PyCUI) -> bool: """Checks if user has root privileges. The method is simply verifying if EUID == 0. @@ -29,7 +40,7 @@ def is_user_root(window: py_cui.PyCUI) -> bool: return False -def lsblk() -> list: +def linux_lsblk() -> list: """Uses 'lsblk' utility to generate a list of detected system partions." @@ -41,14 +52,62 @@ def lsblk() -> list: partitions_list_raw = [ line.strip() for line in lsblk_output.splitlines() if " loop " not in line and "swap" not in line ] - partitions_list_formatted = [line.split(" ") for line in partitions_list_raw] + partitions_list_filtered = [line.split(" ") for line in partitions_list_raw] LOGGER.write( "debug", - str(partitions_list_formatted), + str(partitions_list_filtered), ) - return partitions_list_formatted + return partitions_list_filtered + + +def macos_diskutil() -> list: + + import plistlib + + from pathlib import Path + + # diskutil list -plist + diskutil_output = (Path(__file__).parent.parent.absolute() / "macos_dev/plist").read_text().encode("utf8") + + plist = plistlib.loads(diskutil_output)["AllDisksAndPartitions"] + + return plist_to_list(plist) + + +def plist_to_list(plist: list): + possible_partitions = [] + + for disk_info in plist: + for segment in disk_info: + if segment.lower() in ("partitions",): + possible_partitions += disk_info[segment] + elif segment.lower() in ("apfsvolumes",): + possible_partitions += plist_add_type(partition_list=disk_info[segment], partition_type="Apple_APFS") + + final_list = [] + + for partition in possible_partitions: + device = partition.get("DeviceIdentifier") + content = partition.get("Content") + mount_point = partition.get("MountPoint") + + if device is None or content is None: + continue + elif mount_point is None: + final_list.append([device, "part", content]) + else: + final_list.append([device, "part", content, mount_point]) + + return final_list + + +def plist_add_type(partition_list: list, partition_type: str): + for i in range(0, len(partition_list)): + partition_list[i]["Content"] = partition_type + + return partition_list def format_partitions_list(window: py_cui.PyCUI, raw_lsblk: list) -> dict: @@ -85,7 +144,7 @@ def format_partitions_list(window: py_cui.PyCUI, raw_lsblk: list) -> dict: # Warn the user if no partition found with lsblk if len(partitions_dict) == 0: - LOGGER.write("Error", "No partition found !") + LOGGER.write("Error", "No partition found.") window.show_error_popup("Error", "No partition found.") return None diff --git a/recoverpy/view_parameters.py b/recoverpy/view_parameters.py index 0d07fd06..5988b138 100755 --- a/recoverpy/view_parameters.py +++ b/recoverpy/view_parameters.py @@ -66,7 +66,7 @@ def create_ui_content(self): def get_system_partitions(self): """Calls lsblk and lsblk output formatting.""" - partitions_list = HELPER.lsblk() + partitions_list = HELPER.linux_lsblk() self.partitions_dict = HELPER.format_partitions_list(window=self.master, raw_lsblk=partitions_list) def add_partitions_to_list(self):