31 lines
2.0 KiB
Python
31 lines
2.0 KiB
Python
"""Copy closed evidence only; does not launch an application or acceptance test."""
|
|
from pathlib import Path
|
|
import hashlib, json, shutil
|
|
|
|
DEST=Path(__file__).resolve().parent
|
|
SOURCE=DEST.parents[2]/'.local/packaged-server-865483b-20260911'
|
|
PAYLOAD=DEST/'payload'
|
|
def sha(path):return hashlib.sha256(path.read_bytes()).hexdigest().upper()
|
|
original_manifest=SOURCE/'evidence-sha256.json'
|
|
assert sha(original_manifest)=='147DF4A33A7CC00557CE6020DC21051D16A592DD41C9F8DC98D6BB363B0ED710'
|
|
entries=json.loads(original_manifest.read_text(encoding='utf-8'))
|
|
assert len(entries)==181
|
|
actual={str(p.relative_to(SOURCE)):p for p in SOURCE.rglob('*') if p.is_file()}
|
|
assert set(actual)==set(entries)|{'evidence-sha256.json'},set(actual)^set(entries)
|
|
for relative,digest in entries.items():assert sha(actual[relative])==digest,relative
|
|
assert not PAYLOAD.exists()
|
|
records=[]
|
|
for relative,original in sorted(actual.items()):
|
|
assert original.suffix.lower() not in {'.exe','.dll','.pdb','.rlib','.rmeta','.obj','.o','.a','.zip','.7z','.png','.jpg','.jpeg','.gif','.pdf'},relative
|
|
original.read_bytes().decode('utf-8-sig') # Text evidence only, including empty lock/log files.
|
|
copied=PAYLOAD/relative
|
|
copied.parent.mkdir(parents=True,exist_ok=True)
|
|
shutil.copyfile(original,copied)
|
|
before={'bytes':original.stat().st_size,'sha256':sha(original)}
|
|
after={'bytes':copied.stat().st_size,'sha256':sha(copied)}
|
|
assert before==after,relative
|
|
records.append({'source':str(original),'archive':str(copied.relative_to(DEST)),'original':before,'copy':after})
|
|
report={'result':'passed','source_root':str(SOURCE),'original_manifest_sha256':sha(original_manifest),'original_manifest_entries':181,'copied_files':len(records),'copied_bytes':sum(r['original']['bytes'] for r in records),'excluded_binary_files':[],'records':records}
|
|
(DEST/'original-copy-manifest.json').write_text(json.dumps(report,indent=2),encoding='utf-8')
|
|
print(json.dumps({k:v for k,v in report.items() if k!='records'},indent=2))
|