# # Copyright (C) 2020-2024 Soleta Networks # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Affero General Public License as published by the # Free Software Foundation; either version 3 of the License, or # (at your option) any later version. import fdisk from src.log import OgError GPT_PARTTYPES = { 'LINUX-SWAP': '0657FD6D-A4AB-43C4-84E5-0933C84B4F4F', 'LINUX': '0FC63DAF-8483-4772-8E79-3D69D8477DE4', 'NTFS': 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7', 'EFI': 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B', 'HFS': '48465300-0000-11AA-AA11-00306543ECAC', 'FAT32': 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7', 'WIN-RECOV': 'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC', } DOS_PARTTYPES = { 'LINUX-SWAP': 0x82, 'EXTENDED': 0x0f, 'EMPTY': 0x00, 'LINUX': 0x83, 'CACHE': 0x83, 'NTFS': 0x07, 'HFS': 0xaf, 'FAT32': 0x0b, 'EFI': 0xef, } def get_dos_parttype(cxt, ptype_str): l = cxt.label code = DOS_PARTTYPES.get(ptype_str, 0x0) parttype = l.get_parttype_from_code(code) return parttype def get_gpt_parttype(cxt, ptype_str): l = cxt.label uuid = GPT_PARTTYPES.get(ptype_str, GPT_PARTTYPES['LINUX']) parttype = l.get_parttype_from_string(uuid) return parttype def get_parttype(cxt, ptype_str): if not cxt: raise OgError('No libfdisk context') if not cxt.label or cxt.label.name not in ['dos', 'gpt']: raise OgError('Unknown libfdisk label') if type(ptype_str) != str: raise OgError('Invalid partition type') if cxt.label.name == 'dos': return get_dos_parttype(cxt, ptype_str) elif cxt.label.name == 'gpt': return get_gpt_parttype(cxt, ptype_str) else: raise OgError(f'Invalid partition label \'{cxt.label.name}\'')