from ops import *
import yaml
PRIVATE.chmod(0o700);HERE.chmod(0o700)
containers={}
for n in cmd(['docker','ps','-a','--format','{{.Names}}']).splitlines():
    c=inspect(n);containers[n]=dict(id=c['Id'],image=c['Image'],started=c['State']['StartedAt'],running=c['State']['Running'])
rows=api('/api/v1/streams')['streams']
save('baseline.json',dict(containers=containers,ledger=ledger(),states=[{k:r.get(k) for k in ('stream_id','state','child_pid','cleanup_pending')} for r in rows]))
save('compose-before.json',json.loads(cmd(compose()+['config','--format','json'])),private=True)
shutil.copyfile('/workspace/contextra-runtime-config/web-start-candidate-20260918/candidate.env',PRIVATE/'candidate.env.before')
original=Path('/data/contextra/runtime-state/streams_runtime.yaml')
shutil.copyfile(original,PRIVATE/'runtime-original.yaml')
value=yaml.safe_load(original.read_text());cameras=[10,11,12,13,14,15,16,17,19,20]
specs=[next(s for s in value['added'] if str(s.get('camera_id'))==str(i)) for i in cameras]
assert all(s['analysis_fps_target']==10 and not s.get('autostart') and s['inference_profile']['det_model']=='RFDETRMedium' for s in specs)
assert all(s.get('tracking',{}).get('enabled') for s in specs)
assert all(not any(s.get(k,{}).get('enabled') for k in ('intrusion','pose','fire','loitering','fall','fight','crowd')) for s in specs)
(PRIVATE/'base.yaml').write_text(yaml.safe_dump({'streams':[]}))
(PRIVATE/'runtime.yaml').write_text(yaml.safe_dump({'added':specs,'removed':[]}))
save('targets.json',[dict(camera=s['camera_id'],stream_id=s['stream_id'],uri_hash=hashlib.sha256(s['uri'].encode()).hexdigest()) for s in specs])
save('config-fingerprints.json',dict(original=hashlib.sha256(original.read_bytes()).hexdigest(),test=hashlib.sha256((PRIVATE/'runtime.yaml').read_bytes()).hexdigest()))
summary=dict(cameras=cameras,fps=10,tracking=True,scenarios=False,uri_groups=len(set(s['uri'] for s in specs)),baseline_image=containers['contextra-analytics-1']['image'])
save('preflight.json',summary);print(json.dumps(summary))
