diff options
Diffstat (limited to 'python-status-exporter/python-status-exporter.py')
-rwxr-xr-x | python-status-exporter/python-status-exporter.py | 113 |
1 files changed, 93 insertions, 20 deletions
diff --git a/python-status-exporter/python-status-exporter.py b/python-status-exporter/python-status-exporter.py index b6c0807..27a6e5f 100755 --- a/python-status-exporter/python-status-exporter.py +++ b/python-status-exporter/python-status-exporter.py @@ -11,43 +11,116 @@ import argparse import importlib from pprint import pprint +import logging -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument("-m", "--module", help="Module to load", action="append", nargs="+", required=True, type=str) - args = parser.parse_args() +import time +import signal - """ -On the other hand, the statement from spam.ham import eggs, sausage as saus results in +def sig_handler(signal, frame): + if "args" in globals(): + try: + os.remove(args.pid_file) + except FileNotFoundError as EX: + logger = logging.getLogger() + logger.exception("Unable to remove PID-file {}".format(args.pid_file)) + sys.exit(signal) -_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1) -eggs = _temp.eggs -saus = _temp.sausage +signal.signal(signal.SIGINT, sig_handler) +signal.signal(signal.SIGTERM, sig_handler) -Here, the spam.ham module is returned from __import__(). From this object, the names to import are retrieved and assigned to their respective names. +def main(args): + logger = logging.getLogger() + logger.debug("Starting main({})".format(args)) + if args.fork: + logger.debug("Trying to fork") + pid = os.fork() + if pid: + pidfile = open(args.pid_file, "w") + print(pid, file=pidfile) + logger.debug("Forked into PID: {}".format(pid)) + pidfile.close() + sys.exit(0) + else: + pidfile = open(args.pid_file, "w") + print(os.getpid(), file=pidfile) + logger.debug("Running in forground with PID: {}".format(os.getpid())) + pidfile.close() -""" mods = list() for m in args.module: mod = importlib.import_module("modules." + m[0]) mods.append(mod) - for m in mods: - pprint(m) - pprint(dir(m)) - + if logger.getEffectiveLevel() <= logging.DEBUG: + for m in mods: + logger.debug("Listing loaded modules:") + logger.debug(" " + str(m)) + prom_data = dict() for m in mods: m.init_datapoints(prom_data) m.update_datapoints(prom_data) - start_http_server(8000) + + if logger.getEffectiveLevel() <= logging.DEBUG: + logger.debug("Listing datapoints from all modules:") + for d in prom_data: + logger.debug(" " + d) + + + if args.host is None: + logger.debug("start http listener") + start_http_server(args.port) + else: + logger.debug("start http listener") + start_http_server(args.port, args.host) while True: - try: - time.sleep(15) - except Exception: - pass + logger.debug("Sleeping") + time.sleep(15) for m in mods: + logger.debug("Updating values for " + str(m)) m.init_datapoints(prom_data) m.update_datapoints(prom_data) +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("-H", "--host", help="Listen address", action="store", nargs=1, type=str) + parser.add_argument("-p", "--port", help="Listen port", action="store", nargs='?', default=8080, type=int) + parser.add_argument("-m", "--module", help="Module to load", action="append", required=True, nargs=1, type=str) + parser.add_argument("--pid-file", help="Where to write PID file", action="store", default="/var/run/"+sys.argv[0]+".pid", type=str) + parser.add_argument("--fork", help="Fork process to background", action="store_true", default=False) + parser.add_argument("-l", "--log-file", help="Logfile", action="store", nargs='?', default="/dev/stderr") + parser.add_argument("-L", "--log-level", help="Logfile", action="store", nargs='?', default="error", choices=["debug","info","warning","error","critical"], type=str) + parser.add_argument("-v", "--version", help="Show version information and exit", action="store_true", default=False) + global args + args = parser.parse_args() + + if args.log_file.startswith("/dev/std"): + logging.basicConfig(filename=args.log_file, filemode="w") + else: + logging.basicConfig(filename=args.log_file) + logger = logging.getLogger() + + if args.log_level == "debug": + logger.setLevel(logging.DEBUG) + if args.log_level == "info": + logger.setLevel(logging.INFO) + if args.log_level == "warning": + logger.setLevel(logging.WARNING) + if args.log_level == "error": + logger.setLevel(logging.ERROR) + if args.log_level == "critical": + logger.setLevel(logging.CRITICAL) + + if args.version: + print("{} version {}".format(sys.argv[0], "0.00 beta")) + sys.exit(0) + + # logger.debug("DEBUG") + # logger.info("INFO") + # logger.warning("WARNING") + # logger.error("ERROR") + # logger.critical("CRITICEL") + + main(args) + |