From eaed97cf4ff79bc1d5c5bc104a17117494864155 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 3 Feb 2020 20:49:52 +0100 Subject: [PATCH] utilize /etc/ directory + add config.py to read / touch create the etc config file _read(): tries to open the config files in read only mode to parse its contents. _check(): checks if the config file is present and then calls _read() if that is false it tries to touch create a new file. worst case scenario: file is present and holds content, the method assumes that the file isn't present. Therefore tries to touch-create a new file, if a file is against all odds present, only the mtime would be updated. Hence any file content would not be altered. get(): main method, calling _check() if a key is given return only the assigned value or None or return the whole dictionary --- .gitignore | 1 + config.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ influx.py | 8 ++------ 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 config.py diff --git a/.gitignore b/.gitignore index 263cfcc..b4c2e09 100644 --- a/.gitignore +++ b/.gitignore @@ -110,6 +110,7 @@ dmypy.json # Pycharm .idea/ .venv/ +venv # config config.json diff --git a/config.py b/config.py new file mode 100644 index 0000000..374257e --- /dev/null +++ b/config.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import json +import sys +from pathlib import Path + + +class Config: + def __init__(self): + # global config path + conf_path = '/etc/ejabberd-metrics.conf' + self.file = Path(conf_path) + + self.content = None + + def _read(self): + with open(self.file, 'r', encoding='utf-8') as f: + try: + self.content = json.load(f) + + # catch json decoding errors + except json.JSONDecodeError as err: + print(err, file=sys.stderr) + exit(1) + + def _check(self): + try: + # if file is present try to read it's contents + if self.file.exists(): + self._read() + + # if not create a blank file + else: + Path.touch(self.file) + + # catch permission exceptions as this tries to write to /etc/ + except PermissionError as err: + print(err, file=sys.stderr) + sys.exit(err.errno) + + def get(self, key: str = None) -> (dict, None): + self._check() + + # if a special key is request, return just that + if key is not None: + + # safety measure + if key in self.content: + return self.content[key] + + # if the key isn't part if self.content return None + else: + return None + + # else return everything + return self.content diff --git a/influx.py b/influx.py index 36d7a47..1557a6a 100644 --- a/influx.py +++ b/influx.py @@ -1,12 +1,10 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- - -import json -import os import time from influxdb import InfluxDBClient +from config import Config from ejabberdrpc import EjabberdMetrics @@ -79,9 +77,7 @@ class Influx: if __name__ == '__main__': # load config - path = os.path.dirname(__file__) - with open('/'.join([path, 'config.json']), 'r', encoding='utf-8') as f: - config = json.load(f) + config = Config().get() # creds and params url = config['url'] if 'url' in config else 'http://localhost:5280/api'