14 lines
1.2 KiB
Python
14 lines
1.2 KiB
Python
from __future__ import annotations
|
|
import argparse, hashlib, io, json, subprocess, tarfile
|
|
from pathlib import Path
|
|
|
|
parser=argparse.ArgumentParser(); parser.add_argument("artifact",type=Path); args=parser.parse_args()
|
|
assert args.artifact.is_file() and args.artifact.stat().st_size > 0
|
|
raw=subprocess.check_output(["zstd", "-dc", str(args.artifact)])
|
|
with tarfile.open(fileobj=io.BytesIO(raw), mode="r:") as archive:
|
|
names={m.name for m in archive.getmembers()}
|
|
required={"payload/VERSION","payload/active-runtime/app/deployment_state.py","payload/active-runtime/app/v2r1c7_health_service.py","payload/deploy/aios-v2/systemd/aios-v2r1c7-production.service","payload/deploy/aios-v2/v2r1c7-runtime-config.json","payload/deploy/aios-v2/v2r1c7-rollback.json","payload/scripts/probe_v2r1c7_health.py","payload/scripts/rollback_v2r1c7_release.sh","payload/BUILD-METADATA.json","payload/ARTIFACT-MANIFEST.json","payload/ROLLBACK-METADATA.json"}
|
|
missing=sorted(required - names)
|
|
if missing: raise SystemExit("artifact_members_missing:"+",".join(missing))
|
|
print(json.dumps({"status":"PASS","artifact_sha256":hashlib.sha256(args.artifact.read_bytes()).hexdigest(),"deployable":True,"required_members":len(required)},sort_keys=True))
|