import json from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from typing import List from api import ( MAPPING, EndPointNotAvailableException, Option, OptionType, Server, get_api_config, get_logger, ) parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument("--verbose", "-v", action="count", default=0) parser.add_argument("--config", "-c", default="kontor-api") parser.add_argument("--dry-run", "-m", action="store_true") parser.add_argument("--server", "-s") parser.add_argument("--cleanup", "-d", action="store_true") args = parser.parse_args() if __name__ == "__main__": logger = get_logger(args.verbose, "kontor") logger.info("kontor.sync started") apiConfig = get_api_config(logger, args.config) server_list: List[Server] = [] if args.server: server = apiConfig.get_server(args.server) if server: server_list.append(server) else: server_list.extend(apiConfig.server) export_data = {} for server in server_list: export_data[server.name] = {} for table, path in MAPPING.items(): try: data = server.request(logger, table=table) logger.info("%s: %s", table, len(data)) export_data[server.name][table] = data logger.info("%s: %s exported", table, len(data)) except EndPointNotAvailableException: logger.info("Endpoint not implemented") try: json_dump = json.dumps(export_data[server.name], indent=4) file_name = f"{server.name}-data.json" with open(file_name, "w") as dump_file: dump_file.write(json_dump) except TypeError as error: logger.info(f"{error}") for server in server_list: logger.info(f"{server.name}: {len(export_data[server.name])} tables exported") if len(server_list) > 1: for table, path in MAPPING.items(): for item in export_data[server_list[0].name][table]: item_data = server_list[1].request( logger, table=table, param=Option(OptionType.ID, item["id"]) ) if item != item_data: logger.debug("diff: %s\n%s", item, item_data) else: logger.info("no changes for: %s(%s)", table, item["id"]) logger.info("kontor.sync finished")