#!/bin/env python3 import sys import os import inspect sys.path.insert(0, os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) + "/modules/client_python") from prometheus_client import start_http_server import argparse import importlib from pprint import pprint import logging import time import signal 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) signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) 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) 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) 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: 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)