Files
2026-11-10 22:08:53 +01:00

23 lines
1.0 KiB
Python

#!/usr/bin/env python3
"""Validate the complete Alpine mirror against the tracked manifest."""
import hashlib,json,sys
from pathlib import Path
def main():
root=Path(__file__).resolve().parents[1]
manifest=json.loads((root/'state/manifest.json').read_text())
files=manifest.get('files',{})
if not files: raise ValueError('No manifest entries')
for rel,entry in files.items():
p=(root/'data/secdb'/rel).resolve()
if not p.is_relative_to((root/'data/secdb').resolve()): raise ValueError('Unsafe path')
b=p.read_bytes()
if hashlib.sha256(b).hexdigest()!=entry['sha256']: raise ValueError('Hash mismatch: '+rel)
obj=json.loads(b)
if not isinstance(obj,dict) or not isinstance(obj.get('packages'),list): raise ValueError('Invalid secdb data: '+rel)
if len(obj['packages'])!=entry['packages']: raise ValueError('Package count mismatch: '+rel)
print(f'Validated {len(files)} Alpine security database files')
if __name__=='__main__':
try: main()
except Exception as e: print(f'Validation failed: {e}',file=sys.stderr);sys.exit(1)