diff options
author | Lasse Luttermann Poulsen <llp@nordu.net> | 2017-09-04 15:18:49 +0200 |
---|---|---|
committer | Lasse Luttermann Poulsen <llp@nordu.net> | 2017-09-04 15:18:49 +0200 |
commit | e769deab948c31f94f5e20914ccdc5cd727c7ab6 (patch) | |
tree | 0a9a1bccbac72bb71a1e650780afa06280145248 | |
parent | ad0081372073797e7cadcee323ff694de2dd270d (diff) |
-rwxr-xr-x | python-status-exporter/python-status-exporter.init-script | 83 | ||||
-rwxr-xr-x | python-status-exporter/python-status-exporter.py | 113 |
2 files changed, 176 insertions, 20 deletions
diff --git a/python-status-exporter/python-status-exporter.init-script b/python-status-exporter/python-status-exporter.init-script new file mode 100755 index 0000000..7f2c661 --- /dev/null +++ b/python-status-exporter/python-status-exporter.init-script @@ -0,0 +1,83 @@ +#!/bin/bash +# +# python-status-exporter Python Status Exporter +# +# chkconfig: 2345 90 10 +# description: python-status-exporter exports statused for promethius +# + +### BEGIN INIT INFO +# Provides: python-status-exporter +# Required-Start: $local_fs $network $remote_fs +# Required-Stop: $local_fs $network $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: start and stop python-status-exporter +# Description: python-status-exporter exports statused for promethius +### END INIT INFO + +# Source function library. +. /etc/rc.d/init.d/functions + +# Source networking configuration. +. /etc/sysconfig/network + +RETVAL=0 +exec_file="/opt/python-status-exporter/python-status-exporter.py" +work_dir="$(dirname $exec_file)" +prog_name="python-status-exporter.py" +py3="/usr/bin/python3" +pidfile="/var/run/${prog_name}.pid" +logfile="/var/log/${prog_name}.log" +loglevel="debug" + + + +conf_check() { + [ -x $exec_file ] || exit 5 +} + +start() { + [ ${NETWORKING} = "no" ] && exit 1 + conf_check + if [ -f "$pidfile" ]; then + if [ -d "/proc/$(cat $pidfile)" ]; then + if [ "$(readlink -- \"/proc/$pidfile/cwd\")" = $work_dir ]; then + echo "$prog_name seems to be running already." + exit -1 + fi + fi + fi + # Start daemons. + cd $work_dir || exit 6 + echo -n $"Starting $proc_name: " + $exec_file -p 9095 -m nginx_vod --pid-file $pidfile --fork -l $logfile -L $loglevel + RETVAL=$? + echo + return $RETVAL +} + +stop() { + # Stop daemons. + echo -n $"Shutting down $proc_name: " + [ -f "$pidfile" ] || echo "No pidfile found at $pidfile, unable to stop $proc_name" && exit 6 + kill $(cat $pidfile) + sleep 1 && test -f "$pidfile" && RETVAL=7 || RETVAL=0 + echo + return $RETVAL +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + *) + echo $"Usage: $0 {start|stop}" + exit 2 +esac + +exit $? 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) + |