17 lines
1.3 KiB
Python
17 lines
1.3 KiB
Python
"""Coordinator invokes after wrapper review. No remote file, shell interpolation or credential reads."""
|
|
import datetime,hashlib,json,subprocess
|
|
from pathlib import Path
|
|
P=Path(__file__).parent
|
|
source=(P/'preflight.py').read_text();payload=(P/'payload.json').read_text()
|
|
program='PAYLOAD='+repr(json.loads(payload))+'\n'+source
|
|
try:
|
|
r=subprocess.run(['ssh','-o','BatchMode=yes','-o','ConnectTimeout=12','railiance01','python3','-'],input=program,capture_output=True,text=True,timeout=480)
|
|
try:result=json.loads(r.stdout) if r.returncode==0 else {'refused':'sanitized-ssh-failure'}
|
|
except ValueError:result={'refused':'sanitized-remote-output-shape'}
|
|
result['transport']={'exit_code':r.returncode,'stderr_present':bool(r.stderr)}
|
|
except (OSError,subprocess.TimeoutExpired):result={'refused':'sanitized-transport-unconfirmed'}
|
|
result['collector_sha256']=hashlib.sha256(source.encode()).hexdigest()
|
|
result['payload_sha256']=hashlib.sha256(payload.encode()).hexdigest()
|
|
result['local_completed_at']=datetime.datetime.now(datetime.timezone.utc).isoformat()
|
|
(P/'live-preflight.json').write_text(json.dumps(result,indent=2,sort_keys=True)+'\n')
|
|
print(json.dumps({'receipt':str(P/'live-preflight.json'),'refused':result.get('refused'),'dry_runs':result.get('dry_runs',[]),'held_fence':result.get('held_fence',False)}))
|