-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmon_status.py
More file actions
executable file
·85 lines (69 loc) · 2.52 KB
/
mon_status.py
File metadata and controls
executable file
·85 lines (69 loc) · 2.52 KB
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
#!/usr/bin/env python3
'''Status monitoring tool
'''
from logging import getLogger, Formatter, DEBUG, StreamHandler
from logging.handlers import TimedRotatingFileHandler
from pathlib import Path
from subprocess import CalledProcessError
from argparse import ArgumentParser
from util_remote import get_remote_status
from pcstatus import get_status
from alert import send_alert
LOGDIR = Path('.')
def do_nothing(**kwargs):
pass
def logger_preparation(logname):
''' Preaparation of logger '''
logger = getLogger(logname)
tr_handler = TimedRotatingFileHandler(LOGDIR.joinpath(f'{logname}.log'),
when='MIDNIGHT')
tr_handler.setLevel(DEBUG)
fmt = Formatter('[{asctime}][{levelname}]{message:s}',
style='{')
tr_handler.setFormatter(fmt)
st_handler = StreamHandler()
st_handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(tr_handler)
logger.addHandler(st_handler)
logger.propagate = False
return logger
def check_status(hostname, cmdpath=None, logger=None, pyprocs=[], errhandler=do_nothing):
''' Check status of the host '''
if logger is None:
logger = logger_preparation(hostname)
try:
if hostname != 'localhost':
status = get_remote_status(hostname, cmdpath=cmdpath)
else:
status = get_status()
except CalledProcessError as err:
logger.error(f'Remote-code excection failed: {err.returncode}')
errhandler(message='Remote-code excection failed.',
hostname=hostname)
return
procs_dead = pyprocs.copy()
for proc in pyprocs:
for _, item in status['pyprocs'].items():
if proc in ' '.join(item['cmdline']):
procs_dead.pop(procs_dead.index(proc))
break
if len(procs_dead) != 0:
logger.error(f'One or more processes dead: {procs_dead}')
errhandler(message=f'One or more processes dead: {procs_dead}',
hostname=hostname)
else:
logger.info('OK')
def main():
''' Main function '''
parser = ArgumentParser()
parser.add_argument('hostname', type=str)
parser.add_argument('--cmdpath', '-c', type=str, nargs='?', default=None)
parser.add_argument('--pyprocs', '-p', type=str, nargs='*', default=[])
args = parser.parse_args()
check_status(args.hostname,
cmdpath=args.cmdpath,
pyprocs=args.pyprocs,
errhandler=send_alert)
if __name__ == '__main__':
main()