Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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())
Пример #4
0
    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}'
Пример #5
0
    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}'
Пример #6
0
 async def get_dev_size(self, dev):
     try:
         return blkid.BlockDevice(os.path.join('/dev', dev)).size
     except blkid.BlkidException:
         return None