Files

25 lines
1.7 KiB
Python

#!/usr/bin/env python3
"""Read-only Vontas GetStop adapter. Never logs authenticated request URLs."""
import argparse,datetime,json,os,pathlib,re,time,urllib.parse,urllib.request
p=argparse.ArgumentParser();p.add_argument('--players',type=pathlib.Path,required=True);p.add_argument('--output',type=pathlib.Path,required=True);a=p.parse_args()
base=os.environ.get('RTC_NATIVE_API_BASE','').rstrip('/');key=os.environ.get('RTC_NATIVE_API_KEY','')
if not base or not key:raise SystemExit('Set RTC_NATIVE_API_BASE (ASMX service URL) and RTC_NATIVE_API_KEY securely.')
url=urllib.parse.urlsplit(base)
if url.scheme!='https' or url.query or url.fragment:raise SystemExit('API base must be HTTPS with no credential query or fragment.')
raw=json.loads(a.players.read_text());players=raw['rows'] if isinstance(raw,dict) else raw;ids=set()
for player in players:
m=re.search(r'-\s*S(\d+(?:\s*,\s*\d+)*)\s*$',player.get('player',''),re.I)
if m:ids.update(re.findall(r'\d+',m[1]))
results={};errors={}
for sid in sorted(ids,key=int):
try:
request=base+'/GetStop?'+urllib.parse.urlencode({'apikey':key,'stopid':sid})
with urllib.request.urlopen(request,timeout=25) as response:stop=json.load(response)
if not isinstance(stop,dict) or str(stop.get('StopID'))!=sid or stop.get('SrcStopID') is None:errors[sid]='Invalid stop response'
else:results[sid]=stop
except Exception as exc:errors[sid]=type(exc).__name__
time.sleep(.1)
report={'endpoint':base+'/GetStop','retrieved_at_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'stops':results,'errors':errors}
a.output.parent.mkdir(parents=True,exist_ok=True);a.output.write_text(json.dumps(report,indent=2));print('Read',len(results),'stops;',len(errors),'errors. Credentials excluded.')
if errors:raise SystemExit(2)