from common import *
import datetime
import shutil
assert not (R/'plan.json').exists()
R.chmod(0o700)
head=g.sh(['git','-C',str(REPO),'rev-parse','HEAD']).strip();assert head.startswith('7e6a416')
assert not g.sh(['git','-C',str(REPO),'status','--porcelain']).strip()
clients=query('admin','CLIENT','LIST')
rows=[dict(field.split('=',1) for field in line.split() if '=' in field) for line in clients.splitlines()]
streams=api('/api/v1/streams')['streams']
rc=json.loads(g.sh(['docker','inspect','contextra-redis-1']))[0]
plan=dict(started=datetime.datetime.now(datetime.timezone.utc).isoformat(),head=head,redis=rc,
          analytics=g.inspect(),other_containers=g.others(),streams=streams,clients=rows,
          config=query('admin','CONFIG','GET','maxmemory','maxmemory-policy','save','appendonly'),
          reader=query('admin','ACL','GETUSER','contextra_reader'),keyspace=query('admin','INFO','keyspace'),
          server_info=query('admin','INFO','server'))
for name,path in [('acl',C/'users.acl'),('redis_config',C/'redis.conf'),('active',C/'compose.yaml'),
                  ('env',g.ENV),('access',C/'access.json'),('firewall',C/'firewall.py')]:
    plan[name+'_hash']=g.sha(path);shutil.copyfile(path,R/(name+'.before'))
save('plan.json',plan)
save('ledger.json',dict(started=plan['started'],acl_apply=0,redis_recreate=0,ai_start=0,capacity_failures=0))
print(json.dumps(dict(streams=[s['state'] for s in streams],clients=[{k:x.get(k) for k in ('user','name','cmd','idle','flags')} for x in rows],
    config=plan['config'],keyspace=plan['keyspace'],reader={k:v for k,v in plan['reader'].items() if k in ('keys','commands')})))
