From a043a227bb270d34d8b2a970765ba5faaa2ad28e Mon Sep 17 00:00:00 2001 From: RENAUD Maxence DGAC/CRNA-N Date: Thu, 17 Oct 2019 18:12:02 +0200 Subject: [PATCH] =?UTF-8?q?Sauvegarde=20pour=20bosser=20dans=20le=20rer=20?= =?UTF-8?q?-=20pas=20op=C3=A9=20du=20tout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- _DUMP/nmb2b.py | 181 -------------------------- crt.pem | 0 data/sqlite.db | Bin 4050944 -> 4050944 bytes demo.py | 18 +-- demo2.py | 36 ++++++ freeze.sh | 2 + key.pem | 0 manager.py | 325 ++++++++++++++++++++++++++--------------------- requirements.txt | 7 + set_cert_key.sh | 24 ++++ shared_vars.py | 18 +-- utils.py | 137 +------------------- 13 files changed, 265 insertions(+), 486 deletions(-) delete mode 100755 _DUMP/nmb2b.py create mode 100644 crt.pem create mode 100644 demo2.py create mode 100644 freeze.sh create mode 100644 key.pem create mode 100644 set_cert_key.sh diff --git a/.gitignore b/.gitignore index c4c998c..de2c492 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ venv __pycache__ *.pyc data -algo.py \ No newline at end of file +algo.py +cert/* \ No newline at end of file diff --git a/_DUMP/nmb2b.py b/_DUMP/nmb2b.py deleted file mode 100755 index c3021e4..0000000 --- a/_DUMP/nmb2b.py +++ /dev/null @@ -1,181 +0,0 @@ -#-*- coding: utf-8 -*- - -import datetime -import logging -import os -import sys -import xml.etree.ElementTree as ET - -#from elasticsearch import Elasticsearch -import requests -from requests.auth import HTTPBasicAuth - -from conf.shared_vars import (B2B_PROXY, CERTS_PATH, DATA_PATH, - DEFAULT_B2B_VERSION, DEFAULT_DATASET, - DEFAULT_ORG, GENERIC_WRAPPER, get_dataset, - get_entry_point, get_local_proxy) -#from decolog import * -#from nmb2butils import * -#from utils import * -from utils import autosendtime, save_metrics_to_es, write_content_to_file - - -''' -B2BPROXY = proxy réalisé par Benjamin sur AWS. -TODO : trouver une bonne façon de loguer ce qui est nécessaire (paramétrage) -''' - -class NmB2bGetterBase(): - """ - Classe générique d'accès au webservice b2b de NM. - Des paramètres nommés et/ou non nommés peuvent être passés au constructeur. - """ - - def __init__( - self, org=DEFAULT_ORG, version=DEFAULT_B2B_VERSION, save_metrics_to_es=True, save_data_to_xml=True, wanted_dataset=DEFAULT_DATASET, - getter_name="undefined", nm_service_function="undefined", request_core="undefined", **kwargs): - ''' - Attributs initialisés : - - local_proxy : proxy local DSNA - - entry_point : point d'accès NM B2B selon version - - save_metrics_to_es : utilisation ou non d'Elastic Search pour enregistrer les metriques - - wanted_dataset : dataset NM souhaité - - - - - - - ''' - self.local_proxy = get_local_proxy(org) - self.entry_point = get_entry_point(version) - self.save_metrics_to_es = save_metrics_to_es - self.save_data_to_xml = save_data_to_xml - self.dataset = get_dataset(wanted_dataset) - self.getter_name = getter_name - self.nm_service_function = nm_service_function - self.request_core = request_core - self.nm_request = None - self.nm_response = None - - - def show_conf(self): - ''' - Affiche les éléments de configuration pertinents : - -utilisation d'un proxy local ou non - -accès direct au B2B NM ou via proxy AWS - -utilisation d'elastic search pour les métriques - # TODO : surcharger la méthode __str__ tout simplement. - ''' - if self.local_proxy: - print("Proxy local (DSNA) : ", self.local_proxy) - print("Entry point : ", self.entry_point) - print("Utilisation d'Elastic Search pour les métriques : ", self.save_metrics_to_es) - - def is_conf_valid(self): - if "undefined" in [self.getter_name, self.nm_service_function, self.request_core]: - print("L'un des attributs getter_name, nm_service_function ou request_core n'a pas été défini.") - return False - return True - - def wrap_request(self, request_to_wrap): - ''' - Permet d'encapsuler une requête : - - request_to_wrap = requête en paramètre que l'on va encapsuler - ''' - return GENERIC_WRAPPER.format(request_to_wrap=request_to_wrap) - - def is_connexion_ok(self): - ''' - Return True si la connection au B2B NM est ouverte, False sinon. - TODO : A consolider/valider. - ''' - response = None - - if not B2B_PROXY: - response = requests.get( - self.entry_point, proxies=self.local_proxy, - cert=CERTS_PATH) - else: - response = requests.get( - self.entry_point, proxies=self.local_proxy, - auth=HTTPBasicAuth(B2B_PROXY['key'], B2B_PROXY['secret'])) - - if response.status_code != 200: - print(response.text) - return False - return True - - def _save_data_to_xml(self): - ''' - Permet d'enregistrer la requête envoyée à NM et la réponse brute de NM au format XML. - ''' - if self.nm_request: - print("Enregistrement de la requête au format XML...") - request_filename = os.path.join( - DATA_PATH, self.getter_name, "requests", - f"request-{self.getter_name}-{datetime.datetime.utcnow().strftime('%s')}.xml") - write_content_to_file(filename=request_filename, content=self.nm_request.text) - print("Enregistrement de la requête au format XML terminé.") - if self.nm_response: - print("Enregistrement de la réponse NM au format XML...") - response_filename = os.path.join( - DATA_PATH, self.getter_name, "responses", - f"response-{self.getter_name}-{datetime.datetime.utcnow().strftime('%s')}.xml") - write_content_to_file(filename=response_filename, content=self.nm_response.text) - print("Enregistrement de la réponse NM au format XML terminé.") - - def set_metrics_wanted(self, response): - # TODO : vérifier que response est bien une response - self.metrics_wanted = { - "ts-start": datetime.datetime.utcnow().strftime("%s"), - "date0": datetime.datetime.strftime(datetime.datetime.utcnow(), "%Y-%m-%dT%H:%M:%SZ"), - "ts-end": datetime.datetime.utcnow().strftime("%s"), - "data": response.text, - "datasize": len(response.text), - "getter_name": self.getter_name, - "nm_service_function": self.nm_service_function - } - - def generate_and_save_response_from_nm(self): - ''' - Permet de récupérer la réponse NM à partir d'une requête customisée. - Enregistre le résultat dans un répertoire requests au format XML. - ''' - - if not self.is_conf_valid(): - print("Configuration du getter non valide, impossible d'exécuter toute requête.") - raise Exception - - # if not self.is_connexion_ok(): - # print("Impossible d'établir une connexion avec NM.") - # raise Exception - - ast = autosendtime() - initial_request = f"<{self.nm_service_function}>{ast}{self.request_core}" - nm_full_request = self.wrap_request(request_to_wrap=initial_request) - - print("initial_request : ", initial_request) - print("nm_full_request : ", nm_full_request) - - if not B2B_PROXY: - self.nm_response = requests.post( - self.entry_point, data=nm_full_request, proxies=self.local_proxy, - cert=CERTS_PATH) - else: - self.nm_response = requests.post( - self.entry_point, data=nm_full_request, proxies=self.local_proxy, - auth=HTTPBasicAuth(B2B_PROXY['key'], B2B_PROXY['secret'])) - - if self.save_metrics_to_es and self.nm_response: - self.set_metrics_wanted(response=self.nm_response) - save_metrics_to_es(self.metrics_wanted) - - if self.save_data_to_xml: - self._save_data_to_xml() - - def get_nm_response_as_xml(self): - ''' - Retourne la response du NM au format XML. - ''' - if not self.nm_response: - print("Aucune réponse NM n'a été générée et/ou enregistrée en mémoire.") - return None - return ET.fromstring(self.nm_response.text) diff --git a/crt.pem b/crt.pem new file mode 100644 index 0000000..e69de29 diff --git a/data/sqlite.db b/data/sqlite.db index 9a1fb84fed8c968b737049722d6c6d4848d5e816..efe0bed314ef29224c57c3ed1048acb927449382 100644 GIT binary patch delta 8438 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 Kxo0r9%Jx4J!wNnC delta 8372 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 BqfP(- diff --git a/demo.py b/demo.py index b6ab5ae..a4500c0 100644 --- a/demo.py +++ b/demo.py @@ -6,14 +6,15 @@ import utils import datetime -test_manager = Manager() +test_manager = Manager() # avec proxy +test_manager = Manager(how_to_auth='cert') requestedFlightFields = ['flightState', 'cfmuFlightType'] # démo queryFlightsByAirspace flight_list = test_manager.queryFlightsByAirspace( airspace="LFFFTH", - startTime="2019-07-26 11:00", - endTime="2019-07-26 13:30", + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", requestedFlightFields=requestedFlightFields) print(flight_list.data) @@ -21,15 +22,16 @@ flight_list = test_manager.queryFlightsByAerodrome( aerodrome="LFPG", aerodromeRole="DEPARTURE", - startTime="2019-07-26 11:00", - endTime="2019-07-26 13:30", + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", requestedFlightFields=requestedFlightFields) print(flight_list.data) # démo queryFlightsByTrafficVolume flight_list = test_manager.queryFlightsByTrafficVolume( trafficVolume='LFFTN', - startTime="2019-07-26 11:00", - endTime="2019-07-26 13:30", + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", requestedFlightFields=requestedFlightFields) -print(flight_list.data) \ No newline at end of file +print(flight_list.data) + diff --git a/demo2.py b/demo2.py new file mode 100644 index 0000000..677785b --- /dev/null +++ b/demo2.py @@ -0,0 +1,36 @@ +#-*- coding: utf-8 -*- +# NOTE : à exécuter dans un shell Python plutôt que comme un script ! + +from manager import Manager +import json +import utils +import datetime + +test_manager = Manager(how_to_auth='cert') +requestedFlightFields = ['flightState', 'cfmuFlightType'] + +# démo queryFlightsByAirspace +flight_list = test_manager.queryFlightsByAirspace( + airspace="LFFFTH", + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", + requestedFlightFields=requestedFlightFields) +print(flight_list.data) + +# démo queryFlightsByAerodrome +flight_list = test_manager.queryFlightsByAerodrome( + aerodrome="LFPG", + aerodromeRole="DEPARTURE", + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", + requestedFlightFields=requestedFlightFields) +print(flight_list.data) + +# démo queryFlightsByTrafficVolume +flight_list = test_manager.queryFlightsByTrafficVolume( + trafficVolume='LFFTN', + startTime="2019-10-16 17:00", + endTime="2019-10-16 18:30", + requestedFlightFields=requestedFlightFields) +print(flight_list.data) + diff --git a/freeze.sh b/freeze.sh new file mode 100644 index 0000000..3bc74a3 --- /dev/null +++ b/freeze.sh @@ -0,0 +1,2 @@ +#!/bin/bash +pip freeze | grep -v "pkg-resources" > requirements.txt diff --git a/key.pem b/key.pem new file mode 100644 index 0000000..e69de29 diff --git a/manager.py b/manager.py index 790dd4e..2967e8b 100644 --- a/manager.py +++ b/manager.py @@ -1,169 +1,198 @@ +import glob +import json import operator +import os from requests import Session from requests.auth import HTTPBasicAuth from zeep import Client, Settings from zeep.cache import SqliteCache -from zeep.transports import Transport from zeep.helpers import serialize_object -import json +from zeep.transports import Transport -from shared_vars import (B2B_PROXY, DEFAULT_B2B_VERSION, DEFAULT_DATASET, - WSDL_PROXY, get_dataset) import utils +from shared_vars import (DEFAULT_B2B_VERSION, DEFAULT_DATASET, WSDL_PROXY, + WSLD_PREOPS_MAIN, get_dataset) +# NOTE : plutôt envoyer un **kwargs en param des méthodes. Puis, itérer sur les kwargs. +# si présence de clé dans _default_params_for_queries et pas de val... class Manager(): - def __init__( - self, - version=DEFAULT_B2B_VERSION, - wanted_services="FlightServices", - dataset=DEFAULT_DATASET, - *args, **kwargs - ): - - self.wanted_services = wanted_services - self.available_services = [] - self.available_operations = {} - - self._default_params_for_queries = { - 'dataset': get_dataset(dataset), - 'trafficType': 'LOAD', - 'includeProposalFlights': True, - 'includeForecastFlights': True, - 'sendTime': utils.sendTime(), - } - - self.session = Session() - self.session.auth = HTTPBasicAuth(B2B_PROXY['key'], B2B_PROXY['secret']) - self.wsdl = WSDL_PROXY + wanted_services + "_PREOPS_" + version + ".wsdl" - self.cache = SqliteCache(path='./data/sqlite.db') - self.transport = Transport(session=self.session, cache=self.cache) - self.conf = { - 'wsdl': self.wsdl, - 'transport': self.transport - } - - self.tmp_data = None - - # ----------------------------------------------------------------------------------------- - def set_available_services(self): - self.available_services = [] - client = Client(**self.conf) - for service in client.wsdl.services.values(): - self.available_services.append(service.__str__().split()[1]) + def __init__( + self, + version=DEFAULT_B2B_VERSION, + service_group="FlightServices", + dataset=DEFAULT_DATASET, + how_to_auth='proxy', + *args, **kwargs + ): + + self.base_url = '' + self.service_group = service_group + self.available_services = [] + self.available_operations = {} + self._default_params_for_queries = { + 'dataset': get_dataset(dataset), + 'trafficType': 'LOAD', + 'includeProposalFlights': True, + 'includeForecastFlights': True, + 'sendTime': utils.sendTime(), + } + self.session = Session() + + # ------------- certificat ou proxy ? ------------- # + if how_to_auth == 'cert': + # Si authentification par certificat + self.session.cert = (glob.glob("cert/crt.pem")[0], glob.glob("cert/key.pem")[0]) + self.base_url = WSLD_PREOPS_MAIN + elif how_to_auth == 'proxy': + # Si authentification via proxy (défaut) + NM_B2B_API_KEY_ID = os.environ.get('NM_B2B_API_KEY_ID') # default is None + NM_B2B_API_SECRET = os.environ.get('NM_B2B_API_SECRET') # default is None + if not NM_B2B_API_KEY_ID or not NM_B2B_API_SECRET: + print(f"Impossible de définir un couple clé/pass pour le proxy b2b.\ + Vérifiez que NM_B2B_API_KEY_ID et NM_B2B_API_SECRET sont bien définis dans votre environnement.") + exit(1) + self.base_url = WSDL_PROXY + self.session.auth = HTTPBasicAuth(NM_B2B_API_KEY_ID, NM_B2B_API_SECRET) + else: + print("Le mode d'authentification que vous avez spécifié n'existe pas (pour l'instant : 'cert' ou 'proxy').") + exit(1) + + self.wsdl = self.base_url + service_group + "_PREOPS_" + version + ".wsdl" + self.cache = SqliteCache(path='./data/sqlite.db') + self.transport = Transport(session=self.session, cache=self.cache) + self.conf = { + 'wsdl': self.wsdl, + 'transport': self.transport + } + self.tmp_data = None + + + # ----------------------------------------------------------------------------------------- + def get_wsdl_file(self): + + + # ----------------------------------------------------------------------------------------- + def set_available_services(self): + self.available_services = [] + client = Client(**self.conf) + for service in client.wsdl.services.values(): + self.available_services.append(service.__str__().split()[1]) - def show_available_services(self): - if not self.available_services: - self.set_available_services() - print("Les services disponibles via {} sont : ".format(self.wanted_services)), - for service in self.available_services: - print(' * ', service) - - # ----------------------------------------------------------------------------------------- - def set_operations_of_service(self, service_name): - if not self.available_services: - self.set_available_services() - if not service_name in self.available_services: - raise Exception(f"Le service {service_name} n'est pas disponible.") - client = Client(**self.conf, service_name=service_name) - operations = [op for op in client.service.__dir__() if not op.startswith('__')] - self.available_operations[service_name] = operations - - def show_operations_of_service(self, service_name): - if not service_name in self.available_operations: - self.set_operations_of_service(service_name=service_name) - print(f"Les opérations disponibles pour {service_name} sont : ") - for operation in self.available_operations[service_name]: - print(' * ', operation) - - # ----------------------------------------------------------------------------------------- - def convert_data_to_json(self, obj): - return serialize_object(self.tmp_data) + def show_available_services(self): + if not self.available_services: + self.set_available_services() + print("Les services disponibles via {} sont : ".format(self.service_group)), + for service in self.available_services: + print(' * ', service) + + # ----------------------------------------------------------------------------------------- + def set_operations_of_service(self, service_name): + if not self.available_services: + self.set_available_services() + if not service_name in self.available_services: + raise Exception(f"Le service {service_name} n'est pas disponible.") + client = Client(**self.conf, service_name=service_name) + operations = [op for op in client.service.__dir__() if not op.startswith('__')] + self.available_operations[service_name] = operations + + def show_operations_of_service(self, service_name): + if not service_name in self.available_operations: + self.set_operations_of_service(service_name=service_name) + print(f"Les opérations disponibles pour {service_name} sont : ") + for operation in self.available_operations[service_name]: + print(' * ', operation) + + # ----------------------------------------------------------------------------------------- + def convert_data_to_json(self, obj): + return serialize_object(self.tmp_data) - # ----------------------------------------------------------------------------------------- - def queryFlightsByAirspace( - self, - airspace, - startTime, - endTime, - requestedFlightFields= [], - dataset= None, - trafficType= None, - includeProposalFlights= None, - includeForecastFlights= None, - sendTime= None, - ): + # ----------------------------------------------------------------------------------------- + def queryFlightsByAirspace( + self, + airspace, + startTime, + endTime, + requestedFlightFields= [], + dataset= None, + trafficType= None, + includeProposalFlights= None, + includeForecastFlights= None, + sendTime= None, + ): - dataset = self._default_params_for_queries['dataset'] if not dataset else dataset - trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType - includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights - includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights - sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime - trafficWindow = {'wef': startTime, 'unt': endTime} + dataset = self._default_params_for_queries['dataset'] if not dataset else dataset + trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType + includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights + includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights + sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime + trafficWindow = {'wef': startTime, 'unt': endTime} - client = Client(**self.conf, service_name='FlightManagementService') - self.tmp_data = client.service.queryFlightsByAirspace( - airspace=airspace, - dataset=dataset, trafficType=trafficType, - includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, - trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime) - return self.tmp_data - - def queryFlightsByAerodrome( - self, - aerodrome, - aerodromeRole, - startTime, - endTime, - requestedFlightFields= [], - dataset= None, - trafficType= None, - includeProposalFlights= None, - includeForecastFlights= None, - sendTime= None, - ): + client = Client(**self.conf, service_name='FlightManagementService') + self.tmp_data = client.service.queryFlightsByAirspace( + airspace=airspace, + dataset=dataset, trafficType=trafficType, + includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, + trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime) + return self.tmp_data + + def queryFlightsByAerodrome( + self, + aerodrome, + aerodromeRole, + startTime, + endTime, + requestedFlightFields= [], + dataset= None, + trafficType= None, + includeProposalFlights= None, + includeForecastFlights= None, + sendTime= None, + ): - dataset = self._default_params_for_queries['dataset'] if not dataset else dataset - trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType - includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights - includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights - sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime - trafficWindow = {'wef': startTime, 'unt': endTime} + dataset = self._default_params_for_queries['dataset'] if not dataset else dataset + trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType + includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights + includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights + sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime + trafficWindow = {'wef': startTime, 'unt': endTime} - client = Client(**self.conf, service_name='FlightManagementService') - self.tmp_data = client.service.queryFlightsByAerodrome( - aerodrome=aerodrome, aerodromeRole=aerodromeRole, - dataset=dataset, trafficType=trafficType, - includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, - trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime) - return self.tmp_data - - def queryFlightsByTrafficVolume( - self, - trafficVolume, - startTime, - endTime, - requestedFlightFields= [], - dataset= None, - trafficType= None, - includeProposalFlights= None, - includeForecastFlights= None, - sendTime= None, - ): + client = Client(**self.conf, service_name='FlightManagementService') + self.tmp_data = client.service.queryFlightsByAerodrome( + aerodrome=aerodrome, aerodromeRole=aerodromeRole, + dataset=dataset, trafficType=trafficType, + includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, + trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime) + return self.tmp_data + + def queryFlightsByTrafficVolume( + self, + trafficVolume, + startTime, + endTime, + requestedFlightFields= [], + dataset= None, + trafficType= None, + includeProposalFlights= None, + includeForecastFlights= None, + sendTime= None, + **kwargs + ): - dataset = self._default_params_for_queries['dataset'] if not dataset else dataset - trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType - includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights - includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights - sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime - trafficWindow = {'wef': startTime, 'unt': endTime} + dataset = self._default_params_for_queries['dataset'] if not dataset else dataset + trafficType = self._default_params_for_queries['trafficType'] if not trafficType else trafficType + includeProposalFlights = self._default_params_for_queries['includeProposalFlights'] if not includeProposalFlights else includeProposalFlights + includeForecastFlights = self._default_params_for_queries['includeForecastFlights'] if not includeForecastFlights else includeForecastFlights + sendTime = self._default_params_for_queries['sendTime'] if not sendTime else sendTime + trafficWindow = {'wef': startTime, 'unt': endTime} - client = Client(**self.conf, service_name='FlightManagementService') - self.tmp_data = client.service.queryFlightsByTrafficVolume( - trafficVolume=trafficVolume, - dataset=dataset, trafficType=trafficType, - includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, - trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime) - return self.tmp_data \ No newline at end of file + client = Client(**self.conf, service_name='FlightManagementService') + self.tmp_data = client.service.queryFlightsByTrafficVolume( + trafficVolume=trafficVolume, + dataset=dataset, trafficType=trafficType, + includeProposalFlights=includeProposalFlights, includeForecastFlights=includeForecastFlights, + trafficWindow=trafficWindow, requestedFlightFields=requestedFlightFields, sendTime=sendTime, + **kwargs) + return self.tmp_data diff --git a/requirements.txt b/requirements.txt index 8da5792..8d9646b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ appdirs==1.4.3 +astroid==2.2.5 attrs==19.1.0 cached-property==1.5.1 certifi==2019.6.16 @@ -6,10 +7,16 @@ chardet==3.0.4 defusedxml==0.6.0 idna==2.8 isodate==0.6.0 +isort==4.3.21 +lazy-object-proxy==1.4.1 lxml==4.3.4 +mccabe==0.6.1 +pylint==2.3.1 pytz==2019.1 requests==2.22.0 requests-toolbelt==0.9.1 six==1.12.0 +typed-ast==1.4.0 urllib3==1.25.3 +wrapt==1.11.2 zeep==3.4.0 diff --git a/set_cert_key.sh b/set_cert_key.sh new file mode 100644 index 0000000..5f68082 --- /dev/null +++ b/set_cert_key.sh @@ -0,0 +1,24 @@ +#!/bin/sh +NBR_RESULTS=$(find ./cert -name '*.p12' | wc -l) +# NBR_RESULTS=$(find ./venv -name collection.py | wc -l) +if [ $NBR_RESULTS = '0' ]; then + printf "Aucun fichier trouvé avec l'extension .p12 dans cert/" + exit 1 +elif [ $NBR_RESULTS -gt '1' ]; then + printf "Il existe plusieurs fichiers avec l'extension .p12 dans cert/\nMerci de n'en laisser qu'un seul" + exit 1 +else + FILE_NAME=$(find ./cert -name '*.p12') + #FILE_NAME="${FULL_FILE_NAME%.*}" + printf "Un fichier .p12 a bien été trouvé dans /cert.\nQuel est votre mot de passe ?\n" + read PASSWORD + printf "On créé maintenant les fichier crt.pem et key.pem.\n" + #echo "openssl pkcs12 -in ${FILE_NAME} -passin=pass:${PASSWORD} -out ./cert/crt.pem -clcerts -nokeys" + openssl pkcs12 -in ${FILE_NAME} -passin=pass:${PASSWORD} -out ./cert/crt.pem -clcerts -nokeys # pour le certificat + openssl pkcs12 -in ${FILE_NAME} -passin=pass:${PASSWORD} -out ./cert/key.pem -nocerts -nodes # pour la clé +fi + +# filename=$(basename -- "$fullfile") +# extension="${filename##*.}" +# filename="${filename%.*}" +# b2bcert4dpa2019 \ No newline at end of file diff --git a/shared_vars.py b/shared_vars.py index e8ccfed..65b6dc3 100644 --- a/shared_vars.py +++ b/shared_vars.py @@ -2,21 +2,15 @@ import os # ------------------------------------------------------------------- -B2B_PROXY = None -NM_B2B_API_KEY_ID = os.environ.get('NM_B2B_API_KEY_ID') # default is None -NM_B2B_API_SECRET = os.environ.get('NM_B2B_API_SECRET') # default is None -if NM_B2B_API_KEY_ID and NM_B2B_API_SECRET: - B2B_PROXY = { - 'key': NM_B2B_API_KEY_ID, - 'secret': NM_B2B_API_SECRET - } - - DEFAULT_B2B_VERSION = '23.0.0' +def get_available_b2b_version_for_soapy(): + return ['23.0.0'] +# ------------------------------------------------------------------- WSDL_PROXY = "https://wsdl.b2b-proxy.4me.im/23.0.0/" - - +#WSLD_PREOPS_MAIN = "https://www.b2b.preops.nm.eurocontrol.int/" +WSDL_PREOPS_MAIN="https://www.b2b.preops.nm.eurocontrol.int/FILE_PREOPS/gateway/spec/b2b_publications/23.0.0/B2B_WSDL_XSD.23.0.0.5.81.tar.gz" +#WSLD_PREOPS_MAIN = "https://www.b2b.nm.eurocontrol.int/" # ------------------------------------------------------------------- ALLOWED_DATASET = ["OPERATIONAL"] diff --git a/utils.py b/utils.py index d4f6749..fd4fe59 100644 --- a/utils.py +++ b/utils.py @@ -39,139 +39,4 @@ def get_datetime(nbr_days=0): def sendTime(): sendTime = f"{datetime.datetime.utcnow().replace(microsecond=0)}" - return sendTime[:19] - -# ------------------------------------------------------------------- -# ------------------------------------------------------------------- - -# def do_day( when="today"): -# ''' c'est du generique => le sortir de la classe NMB2B''' -# aujourdhui = datetime.datetime.utcnow() -# hier = aujourdhui-datetime.timedelta(days=1) -# demain = aujourdhui+datetime.timedelta(days=1) -# ademain = aujourdhui+datetime.timedelta(days=2) -# day = None -# if when=='yesterday' : day = hier -# elif when=='tomorrow' : day = demain -# elif when=='+1' : day = demain -# elif when=='+2' : day = ademain -# else : day = aujourdhui -# return day.strftime("%Y-%m-%d" ) - -# def do_creneau( blocname, when="today"): -# ''' c'est du generique => le sortir de la classe NMB2B''' -# start,endi = None, None -# aujourdhui = datetime.datetime.utcnow() -# hier = aujourdhui-datetime.timedelta(days=1) -# demain = aujourdhui+datetime.timedelta(days=1) -# sdemain = aujourdhui+datetime.timedelta(days=2) -# day = None -# starttime = "00" -# endtime = "00" -# deltaj = datetime.timedelta(days=1) - -# if when.startswith("H") and len(when)==2 and int(when[1]) in range(10): -# starttime = "0"+when[1] -# endtime = "0%d"%(int(when[1])+1) -# deltaj = 0 -# if when.startswith("H") and len(when)==3 and int(when[1:]) in range(10,23): -# starttime = when[1:] -# endtime = "%d"%(int(when[1:])+1) -# deltaj = 0 - -# if when=='yesterday' : day = hier -# elif when=='tomorrow' : day = demain -# else : day = aujourdhui - -# mstart = "%Y-%m-%d" +" %s:00"%starttime -# start = datetime.datetime.strftime(day, mstart) -# end = datetime.datetime.strftime(day+deltaj, "%Y-%m-%d" +" %s:00"%endtime) -# return "<%s>%s%s"%(blocname, start, end, blocname) - -# def autocreneau( when='today'): -# ''' c'est du generique => le sortir de la classe NMB2B''' -# if when=="today": -# pass -# if when=="yesterday": -# pass -# if when=="tomorrow": -# pass - -# def autosendtime(): -# ladate = "%s"%datetime.datetime.utcnow() -# return "%s"%(ladate[:19]) - -# def to_file( filename, data): -# fic = open(filename , "w") -# fic . write(data) -# fic . close() - -# def save_metrics_to_es(metrics): -# # TODO : QUID de l'adresse IP ? -# es = Elasticsearch(host="100.1.1.10") -# res = es.index(index="nmrequest", doc_type="log", body=metrics) - -# def checkdate_YYYYMMDD(ladate): -# return re.match("\d{4}-\d{2}-\d{2}", ladate) is not None - -# def gere_main_args(): -# p = argparse.ArgumentParser() -# p.add_argument( '--proxy', dest='proxy', default=None) -# p.add_argument('--elastic-ip', dest='elip', default=None) -# p.add_argument('--elastic-port', dest='elport', default=None) -# p.add_argument('--use-metrics', dest='usemetrics', default="no") -# return p.parse_args() - -# def do_dsnaproxy(C): -# return { 'http':'http://proxy.%s.aviation:8080'%C, 'https': 'https://proxy.%s.aviation:8080'%C } - -# dsnaproxies = { -# "doec" : do_dsnaproxy("crna-n"), -# "crna-n" : do_dsnaproxy("crna-n"), -# "crna-e" : do_dsnaproxy("crna-e"), -# } - -# nmb2bnamespaces={ -# "fw" : "eurocontrol/cfmu/b2b/FlowServices" , -# "as" : "eurocontrol/cfmu/b2b/AirspaceServices" , -# "fl" : "eurocontrol/cfmu/b2b/FlightServices", -# "gi" : "eurocontrol/cfmu/b2b/GeneralinformationServices" , -# "cm" : "eurocontrol/cfmu/b2b/CommonServices", -# "ns0" : "http://www.fixm.aero/base/4.0" , -# "ns2" : "http://www.fixm.aero/flight/4.0", -# "xsi" : "http://www.w3.org/2001/XMLSchema-instance", -# "S" : "http://schemas.xmlsoap.org/soap/envelope/", -# "ps" : "eurocontrol/cfmu/b2b/PublishsubscribeServices" -# } - - -# def envelopper(self, req): -# ''' remplacer la partie namespaces en constante , ca allegera le code ''' -# return ''' %s'''%(req) - - -# def save_xml(self): -# if not self.request is None : -# requestfilename = "requetes/request-%s-%s.xml"%(self.name, self.request["ts-start"]) -# responsefilename = "requetes/response-%s-%s.xml"%(self.name, self.request["ts-start"]) -# self.to_file(requestfilename, self.request["request"]) -# self.to_file(responsefilename, self.request["data"]) - -# def logguer_metriques(self, requete): -# es = Elasticsearch(host="100.1.1.10") -# res = es.index(index="nmrequest", doc_type="log", body=requete) + return sendTime[:19] \ No newline at end of file