1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#!/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)
|