46 lines
3.2 KiB
Python
46 lines
3.2 KiB
Python
# 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))
|