40 lines
1021 B
Python
40 lines
1021 B
Python
from subprocess import CalledProcessError
|
|
from subprocess import check_call
|
|
|
|
import yamlenv
|
|
|
|
# TODO: validate on start
|
|
|
|
def get_config(path):
|
|
"""Loads config from a YAML file with env interpolation"""
|
|
with open(path, 'r') as yaml:
|
|
contents = yaml.read()
|
|
return yamlenv.load(contents)
|
|
|
|
|
|
def check_monitor(monitor):
|
|
cmd = monitor.get('command', [])
|
|
if cmd:
|
|
check_call(cmd, shell=isinstance(cmd, str))
|
|
|
|
|
|
def alert_for_monitor(monitor, alerts):
|
|
for alert_name in monitor.get('alerts', []):
|
|
cmd = alerts.get(alert_name, {}).get('command', [])
|
|
if cmd:
|
|
check_call(cmd, shell=isinstance(cmd, str))
|
|
|
|
|
|
def main():
|
|
# TODO: get config file off command line
|
|
config = get_config('./sample-config.yml')
|
|
alerts = config.get('alerts', {})
|
|
for monitor in config.get('monitors', []):
|
|
try:
|
|
check_monitor(monitor)
|
|
except CalledProcessError:
|
|
alert_for_monitor(monitor, alerts)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|