50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
#!/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)
|