bundlewrap/bundles/icinga2/files/scripts/icinga_notification_wrapper

126 lines
2.7 KiB
Python

#!/usr/bin/env python3
import email.mime.text
import smtplib
from argparse import ArgumentParser
from requests import get
from subprocess import run
from sys import argv
parser = ArgumentParser(
prog='icinga_notification_wrapper',
description='Icinga2 Notification Wrapper',
)
parser.add_argument(
'--host_name',
type=str,
required=True,
)
parser.add_argument(
'--service_name',
type=str,
)
parser.add_argument(
'--output',
type=str,
required=True,
)
parser.add_argument(
'--state',
type=str,
required=True,
)
parser.add_argument(
'--sms',
type=str,
)
parser.add_argument(
'--mail',
type=str,
)
parser.add_argument(
'--escalation',
action='store_true',
)
def log_to_syslog(message):
try:
msg = '{}/{}: {}'.format(args.host_name, args.service_name, message)
run(['logger', '-t', 'icinga_notification_wrapper', msg])
except:
# We don't expect this to fail. However, *if* it fails, we don't
# want it to get in the way of other notifications we may have
# to send.
pass
def notify_per_sms():
log_to_syslog('SMS requested, but not implemented yet!') # FIXME TODO
return
msg = 'ICINGA: {host}/{service} is {state}: {output}'.format(
host=args.host_name,
service=args.service_name,
state=args.state,
output=args.output
)
def notify_per_mail():
text = """
_ _
(_)____(_)___ ____ _____ _
/ / ___/ / __ \/ __ `/ __ `/
/ / /__/ / / / / /_/ / /_/ /
/_/\___/_/_/ /_/\__, /\__,_/
/____/
Host: {host}"""
if args.service_name:
text += """
Service: {service}"""
text += """
State: {state}
{output}"""
mail = email.mime.text.MIMEText(text.format(
host=args.host_name,
service=args.service_name,
state=args.state,
output=args.output
),
'plain',
'utf-8',
)
if args.service_name:
mail['Subject'] = '[ICINGA] {}/{} is {}'.format(args.host_name, args.service_name, args.state)
else:
mail['Subject'] = '[ICINGA] {} is {}'.format(args.host_name, args.state)
mail['To'] = args.mail
mail['From'] = 'noreply+icinga@kunbox.net'
try:
s = smtplib.SMTP('localhost')
s.sendmail(mail['From'], [args.mail], mail.as_string())
s.quit()
log_to_syslog('Sent mail to "{}"'.format(args.mail))
except Exception as e:
log_to_syslog('Sending mail to "{}" failed: {}'.format(args.mail, repr(e)))
if __name__ == '__main__':
args = parser.parse_args()
log_to_syslog(' '.join(argv))
if args.mail and not args.escalation:
notify_per_mail()
if args.sms:
notify_per_sms()