2018-06-04 22:34:26 +02:00
|
|
|
from typing import Any, Dict
|
|
|
|
|
|
|
|
from django.http import HttpRequest, HttpResponse
|
2020-01-14 22:06:24 +01:00
|
|
|
from django.utils.translation import ugettext as _
|
2018-06-04 22:34:26 +02:00
|
|
|
|
2020-01-14 22:06:24 +01:00
|
|
|
from zerver.decorator import REQ, api_key_only_webhook_view, \
|
|
|
|
has_request_variables
|
2018-12-18 22:14:44 +01:00
|
|
|
from zerver.lib.actions import send_rate_limited_pm_notification_to_bot_owner
|
2020-01-14 22:06:24 +01:00
|
|
|
from zerver.lib.response import json_error, json_success
|
2018-12-18 22:14:44 +01:00
|
|
|
from zerver.lib.send_email import FromAddress
|
2020-01-14 22:06:24 +01:00
|
|
|
from zerver.lib.webhooks.common import check_send_webhook_message
|
2018-06-04 22:34:26 +02:00
|
|
|
from zerver.models import UserProfile
|
|
|
|
|
2018-12-18 22:14:44 +01:00
|
|
|
MISCONFIGURED_PAYLOAD_ERROR_MESSAGE = """
|
|
|
|
Hi there! Your bot {bot_name} just received a Zabbix payload that is missing
|
|
|
|
some data that Zulip requires. This usually indicates a configuration issue
|
|
|
|
in your Zabbix webhook settings. Please make sure that you set the
|
|
|
|
**Default Message** option properly and provide all the required fields
|
|
|
|
when configuring the Zabbix webhook. Contact {support_email} if you
|
|
|
|
need further help!
|
|
|
|
"""
|
|
|
|
|
2018-11-09 21:02:59 +01:00
|
|
|
ZABBIX_TOPIC_TEMPLATE = '{hostname}'
|
2019-04-17 01:53:42 +02:00
|
|
|
ZABBIX_MESSAGE_TEMPLATE = """
|
|
|
|
{status} ({severity}) alert on [{hostname}]({link}):
|
|
|
|
* {trigger}
|
|
|
|
* {item}
|
|
|
|
""".strip()
|
2018-06-04 22:34:26 +02:00
|
|
|
|
|
|
|
@api_key_only_webhook_view('Zabbix')
|
|
|
|
@has_request_variables
|
|
|
|
def api_zabbix_webhook(request: HttpRequest, user_profile: UserProfile,
|
|
|
|
payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse:
|
|
|
|
|
2018-12-18 22:14:44 +01:00
|
|
|
try:
|
|
|
|
body = get_body_for_http_request(payload)
|
|
|
|
subject = get_subject_for_http_request(payload)
|
|
|
|
except KeyError:
|
|
|
|
message = MISCONFIGURED_PAYLOAD_ERROR_MESSAGE.format(
|
|
|
|
bot_name=user_profile.full_name,
|
|
|
|
support_email=FromAddress.SUPPORT,
|
|
|
|
).strip()
|
|
|
|
send_rate_limited_pm_notification_to_bot_owner(
|
|
|
|
user_profile, user_profile.realm, message)
|
|
|
|
|
|
|
|
return json_error(_("Invalid payload"))
|
2018-06-04 22:34:26 +02:00
|
|
|
|
|
|
|
check_send_webhook_message(request, user_profile, subject, body)
|
|
|
|
return json_success()
|
|
|
|
|
|
|
|
def get_subject_for_http_request(payload: Dict[str, Any]) -> str:
|
2018-11-09 21:02:59 +01:00
|
|
|
return ZABBIX_TOPIC_TEMPLATE.format(hostname=payload['hostname'])
|
2018-06-04 22:34:26 +02:00
|
|
|
|
|
|
|
def get_body_for_http_request(payload: Dict[str, Any]) -> str:
|
|
|
|
hostname = payload['hostname']
|
|
|
|
severity = payload['severity']
|
|
|
|
status = payload['status']
|
|
|
|
item = payload['item']
|
|
|
|
trigger = payload['trigger']
|
|
|
|
link = payload['link']
|
|
|
|
|
|
|
|
data = {
|
|
|
|
"hostname": hostname,
|
|
|
|
"severity": severity,
|
|
|
|
"status": status,
|
|
|
|
"item": item,
|
|
|
|
"trigger": trigger,
|
|
|
|
"link": link
|
|
|
|
}
|
|
|
|
return ZABBIX_MESSAGE_TEMPLATE.format(**data)
|