Files

30 lines
1.5 KiB
Python

#!/usr/bin/env python3
"""Run one bounded original-only diagnostic control; preserve failures and unsupported exit 2."""
import argparse
import json
import os
from pathlib import Path
import secrets
import subprocess
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--adapter',type=Path,required=True)
parser.add_argument('--output',type=Path,required=True)
parser.add_argument('--mode',choices=['normal','active-restart'],required=True)
args=parser.parse_args()
output=args.output.resolve()
if output.exists():raise RuntimeError('Use a fresh private output directory')
log=output.with_suffix('.log')
environment=os.environ.copy()
environment['OTOPCUA_BASELINE_CANONICAL_KEY']='otua_k-server-events_'+secrets.token_hex(3)
command=['dotnet',str(args.adapter.resolve(strict=True)),str(output),'1']
if args.mode=='active-restart':command+=['--active-restart-control']
with os.fdopen(os.open(log,os.O_WRONLY|os.O_CREAT|os.O_EXCL,0o600),'w') as stream:
try:result=subprocess.run(command,env=environment,stdout=stream,stderr=subprocess.STDOUT,timeout=120);exit_code=result.returncode
except subprocess.TimeoutExpired:exit_code=124
if output.exists():
(output/'runner-receipt.json').write_text(json.dumps({'mode':args.mode,'exitCode':exit_code,'acceptance':False,
'productRebuilt':False,'timeoutSeconds':120,'credentialBytes':len(environment['OTOPCUA_BASELINE_CANONICAL_KEY'].encode())},indent=2)+'\n')
print(json.dumps({'mode':args.mode,'exitCode':exit_code,'acceptance':False}))
raise SystemExit(exit_code)