commit cfae8630438d6541b0bb0fc4303df747c1988ad5 Author: Félix Baylac-Jacqué Date: Sun Oct 17 18:16:29 2021 +0200 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..101a863 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Axione FTTH - Test d'Éligibilité + +## Configuration + +Ce programme se configure à l'aide du fichier ini se trouvant à `/etc/axione-elig-test.ini`. Vous pouvez utiliser `./elig-test.ini.sample` de ce dépôt git comme point de départ. + +## Jouer les Tests + +TODO + +## Debugger l'Application Localement + +Travailler depuis la VM whitelistée par Axione est peu pratique. C'est pourquoi nous avons ajouté un mode debug permettant de simuler les réponses d'Axione. + +Pour l'activer, il vous faudra mettre la variable d'environnement `DEBUG` a `true`. Vous pouvez également utiliser un fichier de configuration ne se trouvant pas a `/etc/axione-elig-test.ini` à l'aide de la variable d'environnement `CONFIG`. + +Par example: +```bash +$ DEBUG=true CONFIG=./elig-test.ini python elig-test.py +``` diff --git a/axione_api/__init__.py b/axione_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/axione_api/api.py b/axione_api/api.py new file mode 100644 index 0000000..33b31ac --- /dev/null +++ b/axione_api/api.py @@ -0,0 +1,67 @@ +import base64 +import http.client +import sys +from datetime import (datetime, timezone) + + +def ptoRequest(ptoRef): + ts = datetime.now(timezone.utc).isoformat() + return f''' + + + + + + + + + + + + + ''' + +def query_axione_pto(cfg, ptoRef): + body = ptoRequest(ptoRef) + # Note: the password should be the base64 of username:password. + # Don't ask why. + passwd = base64.b64encode(f"{cfg.username}:{cfg.password}".encode("utf8")).decode("utf8") + headers = { + 'User-Agent': 'aquilenet-elig-test/0.1', + 'Accept': '*/*', + 'Accept-Encoding': 'identity', + 'Connection': 'Keep-Alive', + 'Authorization': passwd + } + resp = None + if not cfg.debug: + try: + conn = http.client.HTTPSConnection("ws-eligftth-val.axione.fr", 443, source_address=(cfg.source_addr,0), timeout=120) + conn.request("POST", "/v3/fai", body, headers=headers) + response = conn.getresponse() + respData = response.read() + except Exception as e: + print("Error while querying Axione: ", file=sys.stderr) + print(str(e), file=sys.stderr) + print("Query Body: ") + print(body) + print("Query Headers: ") + print(str(headers)) + sys.exit(1) + finally: + conn.close() + else: + print("===================") + print("Injecting dummy response for request: ") + print("HEADERS: ") + print(headers) + print("BODY: ") + print(body) + print("===================") + with open("./fixtures/dummy-data-1.xml","r") as f: + dummyData = f.read() + return dummyData + return resp + +def parse_response(resp_str): + return diff --git a/axione_api/config.py b/axione_api/config.py new file mode 100644 index 0000000..2e51899 --- /dev/null +++ b/axione_api/config.py @@ -0,0 +1,17 @@ +import configparser + +class Config: + def __init__(self, username, password, source_addr): + self.username = username + self.password = password + self.source_addr = source_addr + self.debug = False + +def parse_config(cfgPath): + cfg = configparser.ConfigParser() + with open(cfgPath,"r") as f: + cfg.read_file(f) + username = cfg.get("API","username") + passwd = cfg.get("API","password") + source_addr = cfg.get("API","source_addr") + return Config(username, passwd, source_addr) diff --git a/elig-test.ini.sample b/elig-test.ini.sample new file mode 100644 index 0000000..b4ae260 --- /dev/null +++ b/elig-test.ini.sample @@ -0,0 +1,6 @@ +[API] + username = ws.aquilenet + password = xxx + # Whitelisted IP address from axione + # to send the requests from. + source_addr = xxx.xxx.xxx.xxx \ No newline at end of file diff --git a/elig-test.py b/elig-test.py new file mode 100644 index 0000000..3ddda2b --- /dev/null +++ b/elig-test.py @@ -0,0 +1,23 @@ +import os +import xml.etree.ElementTree as ET + +from axione_api.api import query_axione_pto +from axione_api.config import parse_config + + +if __name__ == '__main__': + cfg_path = os.environ.get("CONFIG", "/etc/axione-elig-test.ini") + print(f'Reading the "{cfg_path}" config file') + cfg = parse_config(cfg_path) + cfg.debug = True if "DEBUG" in os.environ else False + if cfg.debug: + print("===================") + print("DEBUG_MODE") + print("No requests will be performed") + print("We'll inject some dummy data instead") + print("===================") + print("") + + resp = query_axione_pto(cfg, "SPTH-BIEM2-0197") + if resp != None: + respTree = ET.fromstring(resp) diff --git a/fixtures/dummy-data-1.xml b/fixtures/dummy-data-1.xml new file mode 100644 index 0000000..96ccd34 --- /dev/null +++ b/fixtures/dummy-data-1.xml @@ -0,0 +1,52 @@ + + + + + + + + + 0 + + + SPTH + + true + + + + + + + + + + + + + + + + SPTH-BIEM2-0197 + + + + + + + + + + + PME + + OC + + + + + + + + + diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..f7e2632 --- /dev/null +++ b/shell.nix @@ -0,0 +1,5 @@ +{ pkgs ? import {}}: + +pkgs.mkShell({ + nativeBuildInputs = [pkgs.poetry]; +})