# coding: utf-8 import subprocess,json,urllib.request,urllib.error,datetime pid=subprocess.check_output(['systemctl','show','-p','MainPID','lingniu-vehicle-platform'],universal_newlines=True).strip().split('=',1)[1] env=dict(x.decode().split('=',1) for x in open('/proc/'+pid+'/environ','rb').read().split(b'\0') if b'=' in x) admin_token=next(x['token'] for x in json.loads(env['AUTH_TOKENS_JSON']) if x.get('role')=='admin') def call(base,path,token,data=None,method=None): req=urllib.request.Request(base+path,data=None if data is None else json.dumps(data).encode(),headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method=method) with urllib.request.urlopen(req,timeout=25) as r:return json.load(r) def admin(path,data=None,method=None): return call('http://127.0.0.1:20300','/api/v2/open-platform/apps'+path,admin_token,data,method)['data'] expiry=(datetime.datetime.now(datetime.timezone.utc)+datetime.timedelta(minutes=15)).isoformat() app_input=dict(name='release-smoke-mileage-baseline-reset-20260918',status='enabled',validFrom='2026-09-08T00:00:00+08:00',validTo=expiry) app=admin('',app_input,'POST');aid=str(app['id']);key=app['appKey'];out={'temporaryAppId':app['id']} try: admin('/'+aid+'/vehicles',{'vehicles':[dict(vin=v,validFrom=app_input['validFrom'],validTo=expiry) for v in ['LB9A32A26R0LS1055','LB9A32A29R0LS1065']]},'PUT') out['single']=[];out['platform']=[] for plate,vin,day,want in [('粤AGH6240','LB9A32A26R0LS1055','2026-09-08',0.2),('粤AGH6240','LB9A32A26R0LS1055','2026-09-15',0),('粤AGG5043','LB9A32A29R0LS1065','2026-09-17',70.7)]: body={'date':day,'plateNumbers':[plate],'protocolPriority':['GB32960']} single=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/query',key,body) item=single['data'][0] assert item['dailyMileageKm']==want and item['status']=='NORMAL' and not item.get('dataQuality'),single out['single'].append(single) path='/api/mileage/daily?vin='+vin+'&dateFrom='+day+'&dateTo='+day+'&protocol=GB32960&limit=10' platform=call('http://127.0.0.1:20300',path,admin_token) out['platform'].append(platform) query={'startDate':'2026-09-08','endDate':'2026-09-17','plateNumbers':['粤AGH6240'],'protocolPriority':['GB32960'],'pageSize':3} pages=[] for i in range(5): page=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/range/query',key,query);pages.append(page) if not page.get('nextCursor'):break query['cursor']=page['nextCursor'] else:raise AssertionError('pagination did not complete') rows=[x for page in pages for x in page['data']] assert len(rows)==10,rows target=next(x for x in rows if x['date']=='2026-09-15') assert target['dailyMileageKm']==0 and target['status']=='NORMAL',target assert next(x for x in rows if x['date']=='2026-09-08')['dailyMileageKm']==0.2 out['rangePages']=pages out['platformDefault']=call('http://127.0.0.1:20300','/api/mileage/daily?vin=LB9A32A26R0LS1055&dateFrom=2026-09-15&dateTo=2026-09-15&deduplicate=1&limit=10',admin_token) finally: app_input['status']='disabled';disabled=admin('/'+aid,app_input,'PUT');assert disabled['status']=='disabled' admin('/'+aid+'/vehicles',{'vehicles':[]},'PUT') out['temporaryAppDisabled']=True;out['temporaryGrantsRemoved']=True print(json.dumps(out))