snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
0
zerver/webhooks/pingdom/__init__.py
Normal file
0
zerver/webhooks/pingdom/__init__.py
Normal file
33
zerver/webhooks/pingdom/doc.md
Normal file
33
zerver/webhooks/pingdom/doc.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Zulip Pingdom integration
|
||||
|
||||
Zulip supports integration with Pingdom and can notify you of
|
||||
uptime status changes from your Pingdom dashboard.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. In Pingdom, open the **Integrations** menu, and click
|
||||
**Add integration**.
|
||||
|
||||
1. For **Type**, select **Webhook**. Set **Name** to a name of your
|
||||
choice, like `Zulip`, and set **URL** to the URL generated above.
|
||||
Make sure **Active** is toggle, and click **Save integration**.
|
||||
|
||||
1. Finally, when creating a new check or editing an existing check,
|
||||
toggle the integration created above in the **Connect Integrations**
|
||||
section for that check.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
{!event-filtering-additional-feature.md!}
|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
34
zerver/webhooks/pingdom/fixtures/http_up_to_down.json
Normal file
34
zerver/webhooks/pingdom/fixtures/http_up_to_down.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"check_id": 2048467,
|
||||
"check_name": "Test check",
|
||||
"check_type": "HTTP",
|
||||
"check_params": {
|
||||
"basic_auth": false,
|
||||
"encryption": false,
|
||||
"full_url": "http:\/\/someurl.com\/",
|
||||
"header": "User-Agent:Pingdom.com_bot_version_1.4_(http:\/\/www.pingdom.com\/)",
|
||||
"hostname": "someurl.com",
|
||||
"ipv6": false,
|
||||
"port": 80,
|
||||
"url": "\/"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
],
|
||||
"previous_state": "UP",
|
||||
"current_state": "DOWN",
|
||||
"state_changed_timestamp": 1457939434,
|
||||
"state_changed_utc_time": "2016-03-14T07:10:34",
|
||||
"long_description": "Non-recoverable failure in name resolution",
|
||||
"description": "DNS error",
|
||||
"first_probe": {
|
||||
"ip": "85.17.156.99",
|
||||
"ipv6": "2001:1af8:4100:a09b::454",
|
||||
"location": "Amsterdam 5, Netherlands"
|
||||
},
|
||||
"second_probe": {
|
||||
"ip": "64.141.100.136",
|
||||
"ipv6": "",
|
||||
"location": "Calgary, Canada"
|
||||
}
|
||||
}
|
||||
25
zerver/webhooks/pingdom/fixtures/imap_down_to_up.json
Normal file
25
zerver/webhooks/pingdom/fixtures/imap_down_to_up.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"check_id": 2051859,
|
||||
"check_name": "IMAP check",
|
||||
"check_type": "IMAP",
|
||||
"check_params": {
|
||||
"basic_auth": false,
|
||||
"encryption": true,
|
||||
"hostname": "imap.someurl.com",
|
||||
"ipv6": false,
|
||||
"port": 993
|
||||
},
|
||||
"tags": [],
|
||||
"previous_state": "DOWN",
|
||||
"current_state": "UP",
|
||||
"state_changed_timestamp": 1458070380,
|
||||
"state_changed_utc_time": "2016-03-15T19:33:00",
|
||||
"long_description": "OK",
|
||||
"description": "OK",
|
||||
"first_probe": {
|
||||
"ip": "69.64.56.47",
|
||||
"ipv6": "",
|
||||
"location": "St. Louis, MO"
|
||||
},
|
||||
"second_probe": {}
|
||||
}
|
||||
29
zerver/webhooks/pingdom/fixtures/imap_up_to_down.json
Normal file
29
zerver/webhooks/pingdom/fixtures/imap_up_to_down.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"check_id": 2051859,
|
||||
"check_name": "IMAP check",
|
||||
"check_type": "IMAP",
|
||||
"check_params": {
|
||||
"basic_auth": false,
|
||||
"encryption": true,
|
||||
"hostname": "imap.someurl.com",
|
||||
"ipv6": false,
|
||||
"port": 993
|
||||
},
|
||||
"tags": [],
|
||||
"previous_state": "UP",
|
||||
"current_state": "DOWN",
|
||||
"state_changed_timestamp": 1458069480,
|
||||
"state_changed_utc_time": "2016-03-15T19:18:00",
|
||||
"long_description": "Invalid hostname, address or socket",
|
||||
"description": "Unknown target",
|
||||
"first_probe": {
|
||||
"ip": "188.138.118.184",
|
||||
"ipv6": "",
|
||||
"location": "Strasbourg 2, France"
|
||||
},
|
||||
"second_probe": {
|
||||
"ip": "76.164.194.74",
|
||||
"ipv6": "2605:6f80:0:c::449",
|
||||
"location": "Las Vegas 2, NV"
|
||||
}
|
||||
}
|
||||
29
zerver/webhooks/pingdom/fixtures/smtp_up_to_down.json
Normal file
29
zerver/webhooks/pingdom/fixtures/smtp_up_to_down.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"check_id": 2051844,
|
||||
"check_name": "SMTP check",
|
||||
"check_type": "SMTP",
|
||||
"check_params": {
|
||||
"basic_auth": false,
|
||||
"encryption": false,
|
||||
"hostname": "smtp.someurl.com",
|
||||
"ipv6": false,
|
||||
"port": 25
|
||||
},
|
||||
"tags": [],
|
||||
"previous_state": "UP",
|
||||
"current_state": "DOWN",
|
||||
"state_changed_timestamp": 1458068544,
|
||||
"state_changed_utc_time": "2016-03-15T19:02:24",
|
||||
"long_description": "Connection refused",
|
||||
"description": "Connection refused",
|
||||
"first_probe": {
|
||||
"ip": "174.34.162.242",
|
||||
"ipv6": "",
|
||||
"location": "Atlanta, GA"
|
||||
},
|
||||
"second_probe": {
|
||||
"ip": "64.141.100.136",
|
||||
"ipv6": "",
|
||||
"location": "Calgary, Canada"
|
||||
}
|
||||
}
|
||||
31
zerver/webhooks/pingdom/tests.py
Normal file
31
zerver/webhooks/pingdom/tests.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class PingdomHookTests(WebhookTestCase):
|
||||
def test_pingdom_from_up_to_down_http_check_message(self) -> None:
|
||||
"""
|
||||
Tests if pingdom http check from up to down is handled correctly
|
||||
"""
|
||||
expected_message = "Service someurl.com changed its HTTP status from UP to DOWN:\n\n``` quote\nNon-recoverable failure in name resolution\n```"
|
||||
self.check_webhook("http_up_to_down", "Test check status.", expected_message)
|
||||
|
||||
def test_pingdom_from_up_to_down_smtp_check_message(self) -> None:
|
||||
"""
|
||||
Tests if pingdom smtp check from up to down is handled correctly
|
||||
"""
|
||||
expected_message = "Service smtp.someurl.com changed its SMTP status from UP to DOWN:\n\n``` quote\nConnection refused\n```"
|
||||
self.check_webhook("smtp_up_to_down", "SMTP check status.", expected_message)
|
||||
|
||||
def test_pingdom_from_up_to_down_imap_check_message(self) -> None:
|
||||
"""
|
||||
Tests if pingdom imap check from up to down is handled correctly
|
||||
"""
|
||||
expected_message = "Service imap.someurl.com changed its IMAP status from UP to DOWN:\n\n``` quote\nInvalid hostname, address or socket\n```"
|
||||
self.check_webhook("imap_up_to_down", "IMAP check status.", expected_message)
|
||||
|
||||
def test_pingdom_from_down_to_up_imap_check_message(self) -> None:
|
||||
"""
|
||||
Tests if pingdom imap check from down to up is handled correctly
|
||||
"""
|
||||
expected_message = "Service imap.someurl.com changed its IMAP status from DOWN to UP."
|
||||
self.check_webhook("imap_down_to_up", "IMAP check status.", expected_message)
|
||||
88
zerver/webhooks/pingdom/view.py
Normal file
88
zerver/webhooks/pingdom/view.py
Normal file
@@ -0,0 +1,88 @@
|
||||
# Webhooks for external integrations.
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.exceptions import UnsupportedWebhookEventTypeError
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
PINGDOM_TOPIC_TEMPLATE = "{name} status."
|
||||
|
||||
MESSAGE_TEMPLATE = """
|
||||
Service {service_url} changed its {type} status from {previous_state} to {current_state}:
|
||||
""".strip()
|
||||
|
||||
DESC_TEMPLATE = """
|
||||
|
||||
``` quote
|
||||
{description}
|
||||
```
|
||||
""".rstrip()
|
||||
|
||||
SUPPORTED_CHECK_TYPES = (
|
||||
"HTTP",
|
||||
"HTTP_CUSTOM",
|
||||
"HTTPS",
|
||||
"SMTP",
|
||||
"POP3",
|
||||
"IMAP",
|
||||
"PING",
|
||||
"DNS",
|
||||
"UDP",
|
||||
"PORT_TCP",
|
||||
)
|
||||
|
||||
ALL_EVENT_TYPES = list(SUPPORTED_CHECK_TYPES)
|
||||
|
||||
|
||||
@webhook_view("Pingdom", all_event_types=ALL_EVENT_TYPES)
|
||||
@typed_endpoint
|
||||
def api_pingdom_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
check_type = get_check_type(payload)
|
||||
|
||||
if check_type in SUPPORTED_CHECK_TYPES:
|
||||
topic_name = get_topic_for_http_request(payload)
|
||||
body = get_body_for_http_request(payload)
|
||||
else:
|
||||
raise UnsupportedWebhookEventTypeError(check_type)
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body, check_type)
|
||||
return json_success(request)
|
||||
|
||||
|
||||
def get_topic_for_http_request(payload: WildValue) -> str:
|
||||
return PINGDOM_TOPIC_TEMPLATE.format(name=payload["check_name"].tame(check_string))
|
||||
|
||||
|
||||
def get_body_for_http_request(payload: WildValue) -> str:
|
||||
current_state = payload["current_state"].tame(check_string)
|
||||
previous_state = payload["previous_state"].tame(check_string)
|
||||
|
||||
data = {
|
||||
"service_url": payload["check_params"]["hostname"].tame(check_string),
|
||||
"previous_state": previous_state,
|
||||
"current_state": current_state,
|
||||
"type": get_check_type(payload),
|
||||
}
|
||||
body = MESSAGE_TEMPLATE.format(**data)
|
||||
if current_state == "DOWN" and previous_state == "UP":
|
||||
description = DESC_TEMPLATE.format(
|
||||
description=payload["long_description"].tame(check_string)
|
||||
)
|
||||
body += description
|
||||
else:
|
||||
body = f"{body[:-1]}."
|
||||
|
||||
return body
|
||||
|
||||
|
||||
def get_check_type(payload: WildValue) -> str:
|
||||
return payload["check_type"].tame(check_string)
|
||||
Reference in New Issue
Block a user