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

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View File

View 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!}
![](/static/images/integrations/pingdom/001.png)
{!event-filtering-additional-feature.md!}
### Related documentation
{!webhooks-url-specification.md!}

View 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"
}
}

View 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": {}
}

View 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"
}
}

View 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"
}
}

View 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)

View 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)