From 104a7effe1a1e194e9de144d79d8b1433da06983 Mon Sep 17 00:00:00 2001 From: zailon Date: Tue, 23 Jun 2026 15:31:32 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20docs/services/lxc208-manage/alert/matrix-relay.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lxc208-manage/alert/matrix-relay.py | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/services/lxc208-manage/alert/matrix-relay.py diff --git a/docs/services/lxc208-manage/alert/matrix-relay.py b/docs/services/lxc208-manage/alert/matrix-relay.py new file mode 100644 index 0000000..2cb21d6 --- /dev/null +++ b/docs/services/lxc208-manage/alert/matrix-relay.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 + +import sys +sys.path.insert(0, '/usr/local/bin') + +import json +import logging +from http.server import HTTPServer, BaseHTTPRequestHandler +from typing import Dict + +from alerts.matrix import send_matrix +from alerts.grafana import process_grafana +from alerts.pbs import detect_backup_source, process_backup +from alerts.config import PORT + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + + +class WebhookHandler(BaseHTTPRequestHandler): + def log_message(self, format, *args): + logger.info("%s - %s", self.address_string(), format % args) + + def do_POST(self): + try: + content_length = int(self.headers.get('Content-Length', 0)) + body = self.rfile.read(content_length).decode('utf-8') + + try: + obj = json.loads(body) + except json.JSONDecodeError as e: + logger.error("JSON parse error: %s", e) + self.send_error(400, "Invalid JSON") + return + + self.process_webhook(obj) + self.send_response(200) + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write(b"OK") + + except Exception as e: + logger.exception("Error processing request") + self.send_error(500, "Internal Server Error") + + def process_webhook(self, obj: Dict) -> None: + source = detect_backup_source(obj) + if source: + logger.info("Processing backup notification (source=%s)", source.value) + process_backup(obj, send_matrix, source) + return + + if "alerts" in obj: + alerts = obj["alerts"] + logger.info("Processing Grafana alerts: %d items", len(alerts)) + process_grafana({"alerts": alerts}, send_matrix) + return + + logger.warning("Unknown webhook type") + send_matrix( + "Webhook received

" +
+            json.dumps(obj, ensure_ascii=False, indent=2) +
+            "
" + ) + + +def main(): + server = HTTPServer(("0.0.0.0", PORT), WebhookHandler) + logger.info("Matrix Relay started on port %s", PORT) + + try: + server.serve_forever() + except KeyboardInterrupt: + logger.info("Shutting down...") + server.shutdown() + + +if __name__ == "__main__": + main() \ No newline at end of file