#!/usr/bin/env python3 import nbdkit import json import os backup_dir = "/mnt2/backed-up-drive/backupstore/volumes/2c/df/pvc-5c1f48e3-346f-4c35-8e6a-8fc0c4c3a842" blocks_dir = f"{backup_dir}/blocks" backup_cfg = f"{backup_dir}/backups/backup_backup-eac0221d1cab4a9c.cfg" with open(backup_cfg) as f: data = json.load(f) size = int(data['Size']) block_map = {b['Offset']: b['BlockChecksum'] for b in data['Blocks']} block_size = 2097152 def thread_model(): return nbdkit.THREAD_MODEL_SERIALIZE_ALL_REQUESTS def get_size(): return size def pread(h, count, offset, flags): result = bytearray() remaining = count current_offset = offset while remaining > 0: block_start = (current_offset // block_size) * block_size block_offset = current_offset - block_start read_size = min(remaining, block_size - block_offset) if block_start in block_map: checksum = block_map[block_start] block_path = f"{blocks_dir}/{checksum[:2]}/{checksum[2:4]}/{checksum}.blk" if os.path.exists(block_path): with open(block_path, 'rb') as f: f.seek(block_offset) result.extend(f.read(read_size)) else: result.extend(b'\x00' * read_size) else: result.extend(b'\x00' * read_size) current_offset += read_size remaining -= read_size return bytes(result)