def list_partitions(self, disk): parts = [] try: block_device = blkid.BlockDevice(os.path.join('/dev', disk)) except blkid.BlkidException: return parts if not block_device.partitions_exist: return parts for p in block_device.__getstate__()['partitions_data']['partitions']: part = { 'name': f'{disk}{p["partition_number"]}', 'size': p['partition_size'], 'partition_type': p['type'], 'disk': disk, 'id': f'{disk}{p["partition_number"]}', 'path': os.path.join('/dev', f'{disk}{p["partition_number"]}'), 'encrypted_provider': None, } encrypted_provider = glob.glob( f'/sys/block/dm-*/slaves/{part["name"]}') if encrypted_provider: part['encrypted_provider'] = os.path.join( '/dev', encrypted_provider[0].split('/')[3]) parts.append(part) return parts
def list_partitions(self, disk): parts = [] try: block_device = blkid.BlockDevice(os.path.join('/dev', disk)) except blkid.BlkidException: return parts if not block_device.partitions_exist: return parts for p in block_device.__getstate__()['partitions_data']['partitions']: if disk.startswith('nvme'): # This is a hack for nvme disks, however let's please come up with a better way # to link disks with their partitions part_name = f'{disk}p{p["partition_number"]}' else: part_name = f'{disk}{p["partition_number"]}' part = { 'name': part_name, 'size': p['partition_size'], 'partition_type': p['type'], 'partition_number': p['partition_number'], 'partition_uuid': p['part_uuid'], 'disk': disk, 'id': part_name, 'path': os.path.join('/dev', part_name), 'encrypted_provider': None, } encrypted_provider = glob.glob(f'/sys/block/dm-*/slaves/{part["name"]}') if encrypted_provider: part['encrypted_provider'] = os.path.join('/dev', encrypted_provider[0].split('/')[3]) parts.append(part) return parts
def get_disk(self, name): disk = self.disk_default.copy() try: block_device = blkid.BlockDevice(os.path.join('/dev', name)) except blkid.BlkidException: return None return self.get_disk_details(block_device, disk, self.retrieve_lshw_disks_data())
def gptid_from_part_type(self, disk, part_type): try: dev = blkid.BlockDevice(os.path.join('/dev', disk)).__getstate__() except blkid.BlkidException: raise CallError(f'{disk} not found') if not dev['partitions_exist']: raise CallError(f'{disk} has no partitions') part = next((p['part_uuid'] for p in dev['partitions_data']['partitions'] if p['type'] == part_type), None) if not part: raise CallError(f'Partition type {part_type} not found on {disk}') return f'disk/by-partuuid/{part}'
async def device_to_identifier(self, name, disks=None): disks = disks or await self.middleware.call('device.get_disks') if name not in disks: return '' else: block_device = disks[name] if block_device['serial_lunid']: return f'{{serial_lunid}}{block_device["serial_lunid"]}' elif block_device['serial']: return f'{{serial}}{block_device["serial"]}' dev = blkid.BlockDevice(f'/dev/{name}') if dev.partitions_exist: for partition in dev.partition_data()['partitions']: if partition['type'] not in await self.middleware.call( 'disk.get_valid_zfs_partition_type_uuids'): continue return f'{{uuid}}{partition["part_uuid"]}' return f'{{devicename}}{name}'
async def get_dev_size(self, dev): try: return blkid.BlockDevice(os.path.join('/dev', dev)).size except blkid.BlkidException: return None