summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Luttermann Poulsen <llp@nordu.net>2017-09-04 15:18:49 +0200
committerLasse Luttermann Poulsen <llp@nordu.net>2017-09-04 15:18:49 +0200
commite769deab948c31f94f5e20914ccdc5cd727c7ab6 (patch)
tree0a9a1bccbac72bb71a1e650780afa06280145248
parentad0081372073797e7cadcee323ff694de2dd270d (diff)
Init script CentOS 6HEADmaster
-rwxr-xr-xpython-status-exporter/python-status-exporter.init-script83
-rwxr-xr-xpython-status-exporter/python-status-exporter.py113
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)
+