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 9a1fb84..efe0bed 100644 Binary files a/data/sqlite.db and b/data/sqlite.db differ 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