import importlib.util,json,os,base64
from pathlib import Path
ROOT=Path(__file__).resolve().parent;os.umask(0o077)
sp=importlib.util.spec_from_file_location('remote',ROOT.parent/'2026-11-01_icerti-fight-r5_r01/remote.py');r=importlib.util.module_from_spec(sp);sp.loader.exec_module(r)
NAMES=['app/fall_runtime.py','app/scenario_parameters.py','app/secure_control.py','app/stream_settings.py','app/det_result_path.py','app/multi_provider_results.py']
code='''import json,sys,subprocess,shutil
from pathlib import Path
d=json.loads(Path('/etc/contextra-maintenance/server.json').read_text());assert d['server']=='icerti-ai2';assert shutil.disk_usage('/').free>=15*1024**3
sys.path.insert(0,d['paths']['tools']);import compose_backend as cb
rows={x['Config']['Labels']['com.docker.compose.service']:x for x in cb.containers()}
script="""import os,json,base64,hashlib,urllib.request,yaml
from pathlib import Path
t=Path(os.environ['CONTEXTRA_CONTROL_TOKEN_FILE']).read_text().strip()
q=urllib.request.Request('http://127.0.0.1:5000/internal/secure-control/runtime-status',headers={'Authorization':'Bearer '+t})
with urllib.request.urlopen(q,timeout=5) as r:runtime=json.load(r)
files={n:base64.b64encode((Path('/opt/contextra')/n).read_bytes()).decode() for n in NAMES}
configs={}
for k in ('CONTEXTRA_CONTROL_TEMPLATE_FILE','STREAMS_CONFIG_PATH','STREAMS_RUNTIME_PATH'):
 p=Path(os.environ[k]);v=json.loads(p.read_text()) if p.suffix=='.json' else yaml.safe_load(p.read_text());items=[v] if k=='CONTEXTRA_CONTROL_TEMPLATE_FILE' else v.get('added',v.get('streams',[]))
 configs[k]=dict(sha256=hashlib.sha256(p.read_bytes()).hexdigest(),channels=[dict(camera=x.get('camera_id',x.get('source_id')),fall=x.get('fall'),fight=x.get('fight'),cooldown=x.get('event_cooldowns')) for x in items])
print(json.dumps(dict(files=files,configs=configs,runtime_counts=runtime.get('streamCounts'),streams=[{k:s.get(k) for k in ('streamId','cameraId','state','runId','runGeneration')} for s in runtime.get('streams',[])])))
""".replace('NAMES',repr(NAMES))
p=subprocess.run(['docker','exec','-i',rows['analytics']['Id'],'python3','-B','-'],input=script.encode(),capture_output=True,timeout=30);assert p.returncode==0,p.stderr.decode()[-500:]
v=json.loads(p.stdout);v['images']={k:x['Image'] for k,x in rows.items()};v['free_root']=shutil.disk_usage('/').free;v['active']=cb.active();print(json.dumps(v))
'''.replace('repr(NAMES)',repr(repr(NAMES)))
if __name__=='__main__':
 assert not (ROOT/'preflight.json').exists()
 data=json.loads(r.python(code,sudo=True,timeout=45));(ROOT/'preflight.json').write_text(json.dumps(data,indent=2))
 for name,encoded in data['files'].items():
  p=ROOT/'site_source'/name;p.parent.mkdir(parents=True,exist_ok=True);p.write_bytes(base64.b64decode(encoded))
 print(json.dumps({k:v for k,v in data.items() if k in ('images','runtime_counts','configs','free_root')},ensure_ascii=False))
