from ops import *
PRIVATE.mkdir(mode=0o700)
baseline={}
for n in cmd(['docker','ps','-a','--format','{{.Names}}']).splitlines():
    c=inspect(n);baseline[n]={k:c['State'].get(k) for k in ('Running','StartedAt')}
    baseline[n].update(id=c['Id'],image=c['Image'])
rows=api('/api/v1/streams')['streams']
save('baseline.json',dict(containers=baseline,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)
for src,name in [('/workspace/contextra-runtime-config/web-start-candidate-20260918/candidate.env','candidate.env.before'),('/data/contextra/runtime-state/streams_runtime.yaml','streams.before')]:shutil.copyfile(src,PRIVATE/name)
cmd(['docker','stop','--signal=SIGTERM','--timeout=-1','contextra-ai-gateway-1'],timeout=90)
for row in rows:
    if row['state']!='stopped' or row.get('child_pid') or row.get('cleanup_pending'):
        request('/api/v1/streams/'+row['stream_id']+'/stop',{},timeout=90)
after=api('/api/v1/streams')['streams']
assert all(r['state']=='stopped' and not r.get('child_pid') and not r.get('cleanup_pending') for r in after)
save('maintenance.json',dict(stopped=len(after),gateway='stopped'))
print(json.dumps(dict(stopped=len(after),gateway='stopped')))
