From 4ba3cfb27955d7dc00aa9dae329ae833ea75aab7 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Thu, 14 Dec 2023 14:05:22 +0100 Subject: [PATCH] Implemented logging and configuration files --- .gitignore | 3 +++ backend.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e7425cf..7c20c5e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# backups +*~ + # script-generated aliases*.json nodedb/ diff --git a/backend.py b/backend.py index 7b328d4..9d9939b 100755 --- a/backend.py +++ b/backend.py @@ -11,9 +11,11 @@ Erweiterte Version von Freifunk Pinneberg """ import argparse +import configparser import json import os import sys +import logging, logging.handlers from datetime import datetime import networkx as nx @@ -29,6 +31,18 @@ from lib.validate import validate_nodeinfos NODES_VERSION = 1 GRAPH_VERSION = 1 +cfg = { + 'cfgfile': '/etc/ffmap/ffmap-test.cfg', + 'logfile': '/var/log/ffmap.log', + 'loglevel': 5, + 'dest_dir': '/var/lib/ffmap/mapdata', + 'aliases': [], + 'prune': 0, + 'nodedb': '/var/lib/ffmap/nodedb', + 'rrd_data': False, + 'rrd_graphs': False, + 'redis': False +} def main(params): os.makedirs(params['dest_dir'], exist_ok=True) @@ -67,7 +81,7 @@ def main(params): try: with open(nodes_fn, 'r') as nodedb_handle: nodedb = json.load(nodedb_handle) - except IOError: + except (IOError, ValueError): nodedb = {'nodes': dict()} # flush nodedb if it uses the old format @@ -171,6 +185,19 @@ def main(params): if params['img']: rrd.update_images() +def set_loglevel(nr): + """ + Umsetzen der Nummer auf einen für "logging" passenden Wert + Die Nummer kann ein Wert zwischen 0 - kein Logging und 5 - Debug sein + """ + level = (None, logging.CRITICAL, logging.ERROR, logging.WARNING, + logging.INFO, logging.DEBUG) + if nr > 5: + nr = 5 + elif nr < 0: + nr = 0 + return level[nr] + if __name__ == '__main__': # get options from command line @@ -188,7 +215,9 @@ if __name__ == '__main__': 'bat0:/run/alfred0.sock.') parser.add_argument('-d', '--dest-dir', action='store', help='Write output to destination directory', - required=True) + required=False) + parser.add_argument('-c', '--config', action='store', metavar='FILE', + help='read configuration from FILE') parser.add_argument('-V', '--vpn', nargs='+', metavar='MAC', help='Assume MAC addresses are part of vpn') parser.add_argument('-p', '--prune', metavar='DAYS', type=int, @@ -204,4 +233,37 @@ if __name__ == '__main__': 'intensive)') options = vars(parser.parse_args()) + if options['config']: + cfg['cfgfile'] = options['config'] + + config = configparser.ConfigParser(cfg) + if config.read(cfg['cfgfile']): + if not options['nodedb']: + options['nodedb'] = config.get('rrd', 'nodedb') + if not options['dest_dir']: + options['dest_dir'] = config.get('global', 'dest_dir') + if not options['rrd']: + options['rrd'] = config.getboolean('rrd', 'enabled') + if not options['img']: + options['img'] = config.getboolean('rrd', 'graphs') + cfg['logfile'] = config.get('global', 'logfile') + cfg['loglevel'] = config.getint('global', 'loglevel') + + # At this point global configuration is available. Time to enable logging + # Logging is handled by the operating system, so use WatchedFileHandler + handler = logging.handlers.WatchedFileHandler(cfg['logfile']) + handler.setFormatter(logging.Formatter(fmt='%(asctime)s %(levelname)s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S')) + log = logging.getLogger() + log.addHandler(handler) + loglevel = set_loglevel(cfg['loglevel']) + if loglevel: + log.setLevel(loglevel) + else: + log.disabled = True + + log.info("%s started" % sys.argv[0]) + if os.path.isfile(cfg['cfgfile']): + log.info("using configuration from '%s'" % cfg['cfgfile']) main(options) + log.info("%s finished" % sys.argv[0])