import requests import logging import json class CaddyAPI: """API wrapper for Caddy""" __AUTHOR__ = 'anima' __VERSION__ = '0.1.0' _log = logging.getLogger(__name__) __logFile = logging.FileHandler('CaddyAPI.log') __logPrinter = logging.StreamHandler() __logFormat = logging.Formatter('%(asctime)s %(levelname)s \t %(name)s : %(message)s') __logFile.setFormatter(__logFormat) __logPrinter.setFormatter(__logFormat) _log.addHandler(__logFile) _log.addHandler(__logPrinter) def __init__(self, host: str, port: int = 2019) -> None: self.__baseurl = host self.__port = port def __query(self, path: str, data: str = None) -> dict | bool: """base query method """ url = f'http://{self.__baseurl}:{self.__port}/{path}' headers = { "Accept": "application/json" } if data is None: response = requests.get(url, headers = headers) else: response = requests.post(url, headers = headers, json = data) if response.status_code == 200: content = response.content.decode() if content.startswith('{'): return response.json() else: return True else: self._log.error(f'error on api call {response.status_code} {response.url=} {data=}') return False def get_config(self, saveTo: str = None) -> dict: config = self.__query('config') if config and config is not None: if saveTo is not None: with open(saveTo, 'w') as f: f.write(json.dumps(config)) return config def load_config(self, configFile: str): if configFile is not None: with open(configFile, 'r') as f: config = json.load(f) return self.__query('load', config) return config else: return False if __name__ == '__main__': caddy = CaddyAPI('localhost') data = caddy.get_config('caddy.bak.json') print(f'{data=}') load = caddy.load_config('caddy.json') print(f'{load=}')