VulpesOS/tundra/tools/standalone_volume.py
OverSu 0041cd9660 Update shared Gaia workflows and Sargo development tooling
Fix camera switching and Contacts/SMS activity routing across shared hosts.
Integrate Marketplace installation and native standalone recovery tools,
Bluetooth runtime packages and trusted certificates.

Update English/French READMEs and the shared changelog with tested scope
and remaining radio/audio/Bluetooth limitations. Preview17 remains the
existing APK; no new native image is released.

Validation: shared JavaScript and native Python tests; Android packaging
and payload parity from an isolated publication checkout.
2026-10-08 14:27:17 +02:00

35 lines
1.6 KiB
Python

# SPDX-License-Identifier: MPL-2.0
"""Validate the fresh userdata filesystem used by standalone Sargo images."""
import json
from pathlib import Path
import re
import uuid
from tundra import digest
def checked_volume(path, verify_image=True):
path = Path(path)
value = json.loads(path.read_text())
if (value.get('schema') != 1 or value.get('device') != 'sargo'
or value.get('storage') != 'raw-userdata-ext4'
or value.get('image') != 'userdata.ext4'
or value.get('filesystemCheckPassed') is not True):
raise ValueError('Expected a checked standalone Sargo volume')
identifier = value.get('uuid')
if not isinstance(identifier, str) or str(uuid.UUID(identifier)) != identifier:
raise ValueError('Invalid volume UUID')
for key in ('imageSha256', 'systemImageSha256'):
if not re.fullmatch(r'[a-f0-9]{64}', value.get(key, '')):
raise ValueError('Invalid '+key)
if type(value.get('bytes')) is not int or not 5*1024**3 <= value['bytes'] <= 32*1024**3:
raise ValueError('Invalid standalone filesystem size')
hardware = value.get('hardwareImages', {})
if hardware:
lock = json.loads((Path(__file__).resolve().parents[1]/'manifests/sargo-hardware.json').read_text())
if hardware != lock['images']:
raise ValueError('Unqualified standalone hardware images')
if verify_image:
image = path.parent/value['image']
if image.is_symlink() or image.stat().st_size != value['bytes'] or digest(image) != value['imageSha256']:
raise ValueError('Standalone volume changed')
return value