diff --git a/auth/__init__.py b/auth/__init__.py index d07cd44..a00ee99 100644 --- a/auth/__init__.py +++ b/auth/__init__.py @@ -1,6 +1,7 @@ -from .static_env import verify_user_pwd, verify_token_zabbix +from .static_env import verify_user_pwd, verify_token_zabbix, verify_token_scom __all__ = [ "verify_user_pwd", "verify_token_zabbix", + "verify_token_scom", ] diff --git a/auth/static_env.py b/auth/static_env.py index 3831358..cea029c 100644 --- a/auth/static_env.py +++ b/auth/static_env.py @@ -18,6 +18,16 @@ def verify_token_zabbix(token: str = Depends(api_key_header)): ) +def verify_token_scom(token: str = Depends(api_key_header)): + if token != conf.scom.token: + log.warning("Invalid token") + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid authentication credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + + def verify_user_pwd(credentials: HTTPBasicCredentials = Depends(security)): if ( credentials.username != conf.swagger.login diff --git a/config/.env-template b/config/.env-template index f0ed4e0..88e83b5 100644 --- a/config/.env-template +++ b/config/.env-template @@ -18,4 +18,6 @@ OAA_CFG__TG__DASHBOARD_TRED_ID=0 OAA_CFG__TG__NET_TRED_ID=0 OAA_CFG__ZBX__TOKEN=string -OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved \ No newline at end of file +OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved + +OAA_CFG__SCOM__TOKEN=string \ No newline at end of file diff --git a/config/config.py b/config/config.py index 2f8f6fd..506ae27 100644 --- a/config/config.py +++ b/config/config.py @@ -35,6 +35,7 @@ class PrefixConfig(BaseModel): tg_v1: str = api_v1 + "/tg" ping: str = "/ping" zbx: str = api_v1 + "/zbx" + scom: str = api_v1 + "/scom" class RedisConfig(BaseModel): @@ -55,6 +56,10 @@ class FromZabbix(BaseModel): close_alert_pattern: str +class FromScom(BaseModel): + token: str + + class SwaggerConfig(BaseModel): openapi_url: str = "/openapi.json" title: str = "API" @@ -83,6 +88,7 @@ class Settings(BaseSettings): redis: RedisConfig tg: TelegramConfig zbx: FromZabbix + scom: FromScom conf = Settings() diff --git a/routers/__init__.py b/routers/__init__.py index 2ca6a86..a0b9c11 100644 --- a/routers/__init__.py +++ b/routers/__init__.py @@ -3,6 +3,7 @@ from fastapi import APIRouter from .swagger import router as swagger_router from .ping import router as ping_router from .from_zbx import router as zbx_router +from .from_scom import router as scom_router from config import conf @@ -23,3 +24,9 @@ router.include_router( prefix=conf.prefix.zbx, tags=["From Zabbix"], ) + +router.include_router( + scom_router, + prefix=conf.prefix.scom, + tags=["From SCOM"], +) diff --git a/routers/from_scom.py b/routers/from_scom.py new file mode 100644 index 0000000..29918c7 --- /dev/null +++ b/routers/from_scom.py @@ -0,0 +1,51 @@ +from fastapi import APIRouter, Depends +import logging as log + +from schemas import scomNetworkMessage +from auth import verify_token_scom +from redis_db import set_value, pop_value +from config import conf +from telegram import send_message +from telegram import del_message + +router = APIRouter() + + +@router.post("/send-to-dashboard") +async def send_message_to_dashboard( + message: scomNetworkMessage, + token: str = Depends(verify_token_scom), +): + + if message.alert_resolution_state == "Closed": + msg_id = await pop_value(f"scom:net:{message.alert_source}") + if msg_id: + msg_id = int(msg_id.decode("utf-8")) + await del_message(message_id=msg_id, chat_id=conf.tg.chat_id) + return + + result = await send_message( + text=f"‼️{message.alert_resolution_state} {message.alert_source} is not responding", + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.dashboard_tred_id, + ) + if result and result["status"] == 200: + await set_value(f"scom:net:{message.alert_source}", result["msg_id"]) + + +@router.post("/send-to-net-chat") +async def send_message_to_net_chat( + 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" + else: + text = ( + f"✅{message.alert_resolution_state} {message.alert_source} is responding" + ) + await send_message( + text=text, + chat_id=conf.tg.chat_id, + message_thread_id=conf.tg.net_tred_id, + ) diff --git a/schemas/__init__.py b/schemas/__init__.py index a53eef4..8d801bc 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -2,8 +2,10 @@ from .from_zabbix import ( MessageToDashboard as zbxMessageToDashboard, MessageToNetworkChat as zbxMessageToNetworkChat, ) +from .from_scom import NetworkMessage as scomNetworkMessage __all__ = [ "zbxMessageToDashboard", "zbxMessageToNetworkChat", + "scomNetworkMessage", ] diff --git a/schemas/from_scom.py b/schemas/from_scom.py new file mode 100644 index 0000000..501d953 --- /dev/null +++ b/schemas/from_scom.py @@ -0,0 +1,16 @@ +from pydantic import BaseModel + + +class Message(BaseModel): + alert_source: str + alert_resolution_state: str + + +class NetworkMessage(Message): + pass + + +class ServerMessage(Message): + alert_name: str + alert_time: str + alert_description: str