Compare commits

..

7 Commits
main ... dev

Author SHA1 Message Date
sergey fabe1c37a0 replace \n 2024-10-18 13:53:15 +03:00
sergey 0ce65ab99e add return ok 2024-10-18 13:01:15 +03:00
s.mostryukov 40ce559f53 remove old scom endpoints 2024-10-15 13:39:49 +03:00
s.mostryukov 88433c4c94 fix 2024-10-15 13:18:04 +03:00
s.mostryukov f8f5d55391 fix 2024-10-14 17:01:47 +03:00
s.mostryukov 99a1f55a3c add server scom alert 2024-10-14 16:59:25 +03:00
sergey df76a66d4f add scom 2024-10-11 16:40:19 +03:00
9 changed files with 167 additions and 2 deletions

View File

@ -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__ = [ __all__ = [
"verify_user_pwd", "verify_user_pwd",
"verify_token_zabbix", "verify_token_zabbix",
"verify_token_scom",
] ]

View File

@ -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)): def verify_user_pwd(credentials: HTTPBasicCredentials = Depends(security)):
if ( if (
credentials.username != conf.swagger.login credentials.username != conf.swagger.login

View File

@ -15,7 +15,13 @@ OAA_CFG__REDIS__PWD=P@ssw0rd!
OAA_CFG__TG__BOT_TOKEN=string OAA_CFG__TG__BOT_TOKEN=string
OAA_CFG__TG__CHAT_ID=0 OAA_CFG__TG__CHAT_ID=0
OAA_CFG__TG__DASHBOARD_TRED_ID=0 OAA_CFG__TG__DASHBOARD_TRED_ID=0
OAA_CFG__TG__NET_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__TOKEN=string
OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved
OAA_CFG__SCOM__TOKEN=string

View File

@ -35,6 +35,7 @@ class PrefixConfig(BaseModel):
tg_v1: str = api_v1 + "/tg" tg_v1: str = api_v1 + "/tg"
ping: str = "/ping" ping: str = "/ping"
zbx: str = api_v1 + "/zbx" zbx: str = api_v1 + "/zbx"
scom: str = api_v1 + "/scom"
class RedisConfig(BaseModel): class RedisConfig(BaseModel):
@ -48,6 +49,9 @@ class TelegramConfig(BaseModel):
chat_id: int chat_id: int
dashboard_tred_id: int | None = None dashboard_tred_id: int | None = None
net_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): class FromZabbix(BaseModel):
@ -55,6 +59,10 @@ class FromZabbix(BaseModel):
close_alert_pattern: str close_alert_pattern: str
class FromScom(BaseModel):
token: str
class SwaggerConfig(BaseModel): class SwaggerConfig(BaseModel):
openapi_url: str = "/openapi.json" openapi_url: str = "/openapi.json"
title: str = "API" title: str = "API"
@ -83,6 +91,7 @@ class Settings(BaseSettings):
redis: RedisConfig redis: RedisConfig
tg: TelegramConfig tg: TelegramConfig
zbx: FromZabbix zbx: FromZabbix
scom: FromScom
conf = Settings() conf = Settings()

View File

@ -3,6 +3,7 @@ from fastapi import APIRouter
from .swagger import router as swagger_router from .swagger import router as swagger_router
from .ping import router as ping_router from .ping import router as ping_router
from .from_zbx import router as zbx_router from .from_zbx import router as zbx_router
from .from_scom import router as scom_router
from config import conf from config import conf
@ -23,3 +24,9 @@ router.include_router(
prefix=conf.prefix.zbx, prefix=conf.prefix.zbx,
tags=["From Zabbix"], tags=["From Zabbix"],
) )
router.include_router(
scom_router,
prefix=conf.prefix.scom,
tags=["From SCOM"],
)

106
routers/from_scom.py Normal file
View File

@ -0,0 +1,106 @@
from fastapi import APIRouter, Depends
import logging as log
from schemas import scomNetworkMessage, scomServerMessage
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("/net")
async def net_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"])
return "ok"
else:
text = (
f"{message.alert_resolution_state} {message.alert_source} is responding"
)
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,
)
return "ok"
@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.replace('\\n', '\n')}"
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"],
)
return "ok"
else:
text = f"{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description.replace('\\n', '\n')}"
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,
)
return "ok"

View File

@ -2,8 +2,14 @@ from .from_zabbix import (
MessageToDashboard as zbxMessageToDashboard, MessageToDashboard as zbxMessageToDashboard,
MessageToNetworkChat as zbxMessageToNetworkChat, MessageToNetworkChat as zbxMessageToNetworkChat,
) )
from .from_scom import (
NetworkMessage as scomNetworkMessage,
ServerMessage as scomServerMessage,
)
__all__ = [ __all__ = [
"zbxMessageToDashboard", "zbxMessageToDashboard",
"zbxMessageToNetworkChat", "zbxMessageToNetworkChat",
"scomNetworkMessage",
"scomServerMessage",
] ]

15
schemas/from_scom.py Normal file
View File

@ -0,0 +1,15 @@
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_description: str

View File

@ -8,6 +8,7 @@ async def send_message(
text: str, text: str,
chat_id: int, chat_id: int,
message_thread_id: int | None = None, message_thread_id: int | None = None,
reply_to_message_id: int | None = None,
) -> dict | None: ) -> dict | None:
url = f"https://api.telegram.org/bot{conf.tg.bot_token}/sendMessage" url = f"https://api.telegram.org/bot{conf.tg.bot_token}/sendMessage"
params = { params = {
@ -16,6 +17,10 @@ async def send_message(
} }
if message_thread_id: if message_thread_id:
params["message_thread_id"] = 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 aiohttp.ClientSession() as session:
async with session.post( async with session.post(
url, url,