diff --git a/config/.env-template b/config/.env-template index 88e83b5..ae02a89 100644 --- a/config/.env-template +++ b/config/.env-template @@ -15,7 +15,11 @@ OAA_CFG__REDIS__PWD=P@ssw0rd! OAA_CFG__TG__BOT_TOKEN=string OAA_CFG__TG__CHAT_ID=0 OAA_CFG__TG__DASHBOARD_TRED_ID=0 + OAA_CFG__TG__NET_TRED_ID=0 +OAA_CFG__TG__NET_DASHBOARD_TRED_ID=0 +OAA_CFG__TG__SRV_TRED_ID=0 +OAA_CFG__TG__SRV_DASHBOARD_TRED_ID=0 OAA_CFG__ZBX__TOKEN=string OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved diff --git a/config/config.py b/config/config.py index 506ae27..ca6f01f 100644 --- a/config/config.py +++ b/config/config.py @@ -49,6 +49,9 @@ class TelegramConfig(BaseModel): chat_id: int dashboard_tred_id: int | None = None net_tred_id: int | None = None + net_dashboard_tred_id: int | None = None + srv_tred_id: int | None = None + srv_dashboard_tred_id: int | None = None class FromZabbix(BaseModel): diff --git a/routers/from_scom.py b/routers/from_scom.py index 29918c7..6aaa6ec 100644 --- a/routers/from_scom.py +++ b/routers/from_scom.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends import logging as log -from schemas import scomNetworkMessage +from schemas import scomNetworkMessage, scomServerMessage from auth import verify_token_scom from redis_db import set_value, pop_value from config import conf @@ -49,3 +49,92 @@ async def send_message_to_net_chat( chat_id=conf.tg.chat_id, message_thread_id=conf.tg.net_tred_id, ) + + +@router.post("/net") +async def srv_send_message( + message: scomNetworkMessage, + token: str = Depends(verify_token_scom), +): + if message.alert_resolution_state == "New": + text = f"‼️{message.alert_resolution_state} {message.alert_source} is not responding" + result = await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.net_dashboard_tred_id, + ) + if result and result["status"] == 200: + await set_value( + f"scom:net_dashboard:{message.alert_source}", result["msg_id"] + ) + result = await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.net_tred_id, + ) + if result and result["status"] == 200: + await set_value(f"scom:net:{message.alert_source}", result["msg_id"]) + else: + text = f"✅{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}" + dashboard_msg_id = await pop_value(f"scom:net_dashboard:{message.alert_source}") + if dashboard_msg_id: + dashboard_msg_id = int(dashboard_msg_id.decode("utf-8")) + await del_message(message_id=dashboard_msg_id, chat_id=conf.tg.chat_id) + msg_id = await pop_value(f"scom:net:{message.alert_source}") + if msg_id: + msg_id = int(msg_id.decode("utf-8")) + await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.net_tred_id, + reply_to_message_id=msg_id, + ) + + +@router.post("/srv") +async def srv_send_message( + message: scomServerMessage, + token: str = Depends(verify_token_scom), +): + if message.alert_resolution_state == "New": + text = f"‼️{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}" + result = await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.srv_dashboard_tred_id, + ) + if result and result["status"] == 200: + await set_value( + f"scom:srv_dashboard:{message.alert_source}-{message.alert_name}", + result["msg_id"], + ) + result = await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.srv_tred_id, + ) + if result and result["status"] == 200: + await set_value( + f"scom:srv:{message.alert_source}-{message.alert_name}", + result["msg_id"], + ) + else: + text = f"✅{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}" + dashboard_msg_id = await pop_value( + f"scom:srv_dashboard:{message.alert_source}-{message.alert_name}" + ) + if dashboard_msg_id: + dashboard_msg_id = int(dashboard_msg_id.decode("utf-8")) + await del_message(message_id=dashboard_msg_id, chat_id=conf.tg.chat_id) + + msg_id = await pop_value( + f"scom:srv:{message.alert_source}-{message.alert_name}" + ) + if msg_id: + msg_id = int(msg_id.decode("utf-8")) + await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.srv_tred_id, + reply_to_message_id=msg_id, + ) diff --git a/schemas/__init__.py b/schemas/__init__.py index 8d801bc..2957fe9 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -2,10 +2,14 @@ from .from_zabbix import ( MessageToDashboard as zbxMessageToDashboard, MessageToNetworkChat as zbxMessageToNetworkChat, ) -from .from_scom import NetworkMessage as scomNetworkMessage +from .from_scom import ( + NetworkMessage as scomNetworkMessage, + ServerMessage as scomServerMessage, +) __all__ = [ "zbxMessageToDashboard", "zbxMessageToNetworkChat", "scomNetworkMessage", + "scomServerMessage", ] diff --git a/schemas/from_scom.py b/schemas/from_scom.py index 501d953..8838d2b 100644 --- a/schemas/from_scom.py +++ b/schemas/from_scom.py @@ -12,5 +12,4 @@ class NetworkMessage(Message): class ServerMessage(Message): alert_name: str - alert_time: str alert_description: str diff --git a/telegram/message.py b/telegram/message.py index 27b0289..ce8f609 100644 --- a/telegram/message.py +++ b/telegram/message.py @@ -8,6 +8,7 @@ async def send_message( text: str, chat_id: int, message_thread_id: int | None = None, + reply_to_message_id: int | None = None, ) -> dict | None: url = f"https://api.telegram.org/bot{conf.tg.bot_token}/sendMessage" params = { @@ -16,6 +17,10 @@ async def send_message( } if message_thread_id: params["message_thread_id"] = message_thread_id + if reply_to_message_id: + params["reply_to_message_id"] = reply_to_message_id + + log.info(f"Params: {params}") async with aiohttp.ClientSession() as session: async with session.post( url,