python-zulip-api/zulip/integrations/nagios/nagios-notify-zulip
Anders Kaseorg 626359596e Replace typing.Text with str.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-08-24 20:07:35 -07:00

54 lines
1.9 KiB
Python
Executable file

#!/usr/bin/env python3
import argparse
from typing import Any, Dict
import zulip
VERSION = "0.9"
# Nagios passes the notification details as command line options.
# In Nagios, "output" means "first line of output", and "long
# output" means "other lines of output".
parser = zulip.add_default_arguments(argparse.ArgumentParser()) # type: argparse.ArgumentParser
parser.add_argument("--output", default="")
parser.add_argument("--long-output", default="")
parser.add_argument("--stream", default="nagios")
parser.add_argument("--config", default="/etc/nagios3/zuliprc")
for opt in ("type", "host", "service", "state"):
parser.add_argument("--" + opt)
opts = parser.parse_args()
client = zulip.Client(
config_file=opts.config, client="ZulipNagios/" + VERSION
) # type: zulip.Client
msg = dict(type="stream", to=opts.stream) # type: Dict[str, Any]
# Set a subject based on the host or service in question. This enables
# threaded discussion of multiple concurrent issues, and provides useful
# context when narrowed.
#
# We send PROBLEM and RECOVERY messages to the same subject.
if opts.service is None:
# Host notification
thing = "host"
msg["subject"] = f"host {opts.host}"
else:
# Service notification
thing = "service"
msg["subject"] = f"service {opts.service} on {opts.host}"
if len(msg["subject"]) > 60:
msg["subject"] = msg["subject"][0:57].rstrip() + "..."
# e.g. **PROBLEM**: service is CRITICAL
msg["content"] = f"**{opts.type}**: {thing} is {opts.state}"
# The "long output" can contain newlines represented by "\n" escape sequences.
# The Nagios mail command uses /usr/bin/printf "%b" to expand these.
# We will be more conservative and handle just this one escape sequence.
output = (opts.output + "\n" + opts.long_output.replace(r"\n", "\n")).strip()
if output:
# Put any command output in a code block.
msg["content"] += "\n\n~~~~\n" + output + "\n~~~~\n"
client.send_message(msg)