Files
aman-sys/aman/com/WebUI.py
2021-11-14 10:02:21 +01:00

116 lines
3.8 KiB
Python

#!/usr/bin/env python
import json
import requests
import sys
from json import JSONEncoder
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.structures import CaseInsensitiveDict
from aman.config.AirportSequencing import AirportSequencing
from aman.config.RunwaySequencing import RunwaySequencing
from aman.config.Server import Server
class InboundEncoder(JSONEncoder):
def default(self, o):
pta = str(o.PlannedArrivalTime)
delimiter = pta.find('.')
if -1 == delimiter:
delimiter = pta.find('+')
return { 'callsign' : o.Callsign, 'runway' : o.PlannedRunway.Name, 'pta' : pta[0:delimiter] }
class WebUI:
def __init__(self):
self.Config = None
self.Aman = None
def __del__(self):
self.release()
def acquire(self, config : Server, aman):
self.Config = config
self.Aman = aman
def release(self):
return
def createSession():
# prepare the session
session = requests.Session()
retry = Retry(total=1, read=1, connect=1)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
def requestConfiguration(self, airport, navData):
if airport not in navData.Runways:
return None
# prepare the HTTP header and session
headers = CaseInsensitiveDict()
headers['Accept'] = 'application/json'
headers['Content-Type'] = 'application/json'
session = WebUI.createSession()
url = self.Config.WebUiUrl + self.Config.WebUiConfigurationReceiver
data = json.dumps({ 'airport': airport }, ensure_ascii=True)
try:
response = session.get(url, headers=headers, data=data, timeout=2)
if 200 != response.status_code:
return None
except requests.exceptions.ConnectTimeout:
return None
config = json.loads(response.json())
# WebUI sent the wrong airport
if config['airport'] != airport or 0 == len(config['activeRunways']):
return None
airportConfig = AirportSequencing(airport)
airportConfig.UseMustShallMay = config['useMustShallMay']
# build the sequencing information per runway
for activeRunway in config['activeRunways']:
gngRunway = None
for runway in navData.Runways[airport]:
if runway.Name == activeRunway['runway']:
gngRunway = runway
break
# could not find the runway
if None == gngRunway:
return None
runway = RunwaySequencing(gngRunway)
runway.Spacing = int(activeRunway['spacing'])
airportConfig.activateRunway(runway)
# resolve the dependencies
for dependency in config['dependentRunways']:
if 2 == len(dependency):
airportConfig.addDependency(dependency[0], dependency[1])
return airportConfig
def sendSequence(self, airport, inbounds):
# prepare the HTTP header and session
headers = CaseInsensitiveDict()
headers['Accept'] = 'application/json'
headers['Content-Type'] = 'application/json'
session = WebUI.createSession()
# prepare the relevant information
url = self.Config.WebUiUrl + self.Config.WebUiSequenceNotification
data = json.dumps({ 'airport': airport, 'sequence': inbounds }, ensure_ascii=True, cls=InboundEncoder)
# send to the server
try:
session.patch(url, headers=headers, data=data, timeout=2)
except requests.exceptions.ConnectTimeout:
return