Fix Get Active Triggers now working with Zabbix

This commit is contained in:
Влад Зверев 2024-07-30 12:09:33 +05:00
parent b65b6aee48
commit 2c06ccde2e

View File

@ -3,7 +3,7 @@ from flask import Flask, request, jsonify
import telebot
from dotenv import load_dotenv
import hashlib
#import logging
import logging
from logging.config import dictConfig
from threading import Thread, Lock, Timer
import sqlite3
@ -295,7 +295,7 @@ def set_user_state(chat_id, state):
def start_settings_timer(chat_id):
if chat_id in user_timers:
user_timers[chat_id].cancel()
timer = Timer(60, transition_to_notification_mode, [chat_id])
timer = Timer(30, transition_to_notification_mode, [chat_id])
user_timers[chat_id] = timer
timer.start()
@ -918,14 +918,53 @@ def handle_region_selection(call):
region_id = call.data.split("_")[1]
chat_id = call.message.chat.id
# Получение триггеров из реального Zabbix API
triggers = get_zabbix_triggers(region_id)
if not triggers:
bot.send_message(chat_id, "Нет активных проблем по указанному региону за последние 24 часа.")
else:
bot.send_message(chat_id, triggers, parse_mode="Markdown")
try:
# Получение всех групп хостов, содержащих region_id в названии
zapi = ZabbixAPI(ZABBIX_URL)
zapi.login(api_token=ZABBIX_API_TOKEN)
host_groups = zapi.hostgroup.get(
output=["groupid", "name"],
search={"name": region_id}
)
# Фильтрация групп хостов, исключая те, в названии которых есть "test"
filtered_groups = [group for group in host_groups if 'test' not in group['name'].lower()]
if not filtered_groups:
bot.send_message(chat_id, "Нет групп хостов, соответствующих данному региону.")
return
# Отправка списка групп хостов пользователю в виде кнопок
markup = telebot.types.InlineKeyboardMarkup()
for group in filtered_groups:
markup.add(telebot.types.InlineKeyboardButton(text=group['name'], callback_data=f"group_{group['groupid']}"))
bot.send_message(chat_id, f"Найдены следующие группы хостов для региона {region_id}:", reply_markup=markup)
except Exception as e:
logging.error(f"Error connecting to Zabbix API: {e}")
bot.send_message(chat_id, "Не удалось подключиться к Zabbix API. Пожалуйста, попробуйте позже.")
@bot.callback_query_handler(func=lambda call: call.data.startswith("group_"))
def handle_group_selection(call):
group_id = call.data.split("_")[1]
chat_id = call.message.chat.id
try:
# Получение триггеров для выбранной группы хостов
triggers = get_zabbix_triggers(group_id)
if triggers is None:
bot.send_message(chat_id, "Не удалось подключиться к Zabbix API. Пожалуйста, попробуйте позже.")
elif not triggers:
bot.send_message(chat_id, "Нет активных проблем по указанной группе за последние 24 часа.")
else:
bot.send_message(chat_id, triggers, parse_mode="Markdown")
except Exception as e:
logging.error(f"Error processing group selection: {e}")
bot.send_message(chat_id, "Произошла ошибка при обработке вашего запроса. Пожалуйста, попробуйте позже.")
bot.answer_callback_query(call.id) # Завершение обработки callback
@bot.callback_query_handler(func=lambda call: call.data.startswith("prev_") or call.data.startswith("next_"))
@ -947,37 +986,60 @@ def handle_pagination(call):
# Функция для получения активных триггеров из Zabbix API
def get_zabbix_triggers(region_id):
zapi = ZabbixAPI(ZABBIX_URL)
zapi.login(api_token=ZABBIX_API_TOKEN)
def get_zabbix_triggers(group_id):
try:
zapi = ZabbixAPI(ZABBIX_URL)
zapi.login(api_token=ZABBIX_API_TOKEN)
# Получение триггеров уровня "Высокая" и "Авария" за последние 24 часа
triggers = zapi.trigger.get(
output=["triggerid", "description", "priority"],
selectHosts=["hostid", "name"],
filter={"priority": ["4", "5"], "value": "1"},
search={"host": region_id},
only_true=1,
active=1,
withLastEventUnacknowledged=1,
limit=100
)
# Получение триггеров уровня "Высокая" и "Авария" за последние 24 часа для указанной группы хостов
time_from = int(time.time()) - 24 * 3600 # последние 24 часа
triggers = zapi.trigger.get(
output=["triggerid", "description", "priority"],
selectHosts=["hostid", "name"],
groupids=group_id,
filter={"priority": ["4", "5"], "value": "1"},
only_true=1,
active=1,
withLastEventUnacknowledged=1,
time_from=time_from,
expandDescription=1,
expandComment=1,
selectItems=["itemid", "lastvalue"]
)
priority_map = {
'4': 'Высокая',
'5': 'Авария'
}
trigger_messages = []
for trigger in triggers:
description = trigger['description']
host = trigger['hosts'][0]['name']
priority = priority_map.get(trigger['priority'], 'Неизвестно')
trigger_id = trigger['triggerid']
# Заменяем {HOST.NAME} на имя хоста
description = description.replace("{HOST.NAME}", host)
# Заменяем {ITEM.LASTVALUE1} и другие на соответствующие значения
for i, item in enumerate(trigger['items']):
lastvalue_placeholder = f"{{ITEM.LASTVALUE{i + 1}}}"
if lastvalue_placeholder in description:
description = description.replace(lastvalue_placeholder, item['lastvalue'])
message = f"*Host*: {host}\n*Критичность*: {priority}\n*Описание*: {description}"
if trigger_id:
message += f"\n[Ссылка на триггер]({ZABBIX_URL}/tr_events.php?triggerid={trigger_id})"
trigger_messages.append(message)
return "\n---\n".join(trigger_messages)
except Exception as e:
logging.error(f"Error connecting to Zabbix API: {e}")
return None
priority_map = {
'4': 'Высокая',
'5': 'Авария'
}
trigger_messages = []
for trigger in triggers:
description = trigger['description']
host = trigger['hosts'][0]['name']
priority = priority_map.get(trigger['priority'], 'Неизвестно')
trigger_id = trigger['triggerid']
link = f"[Ссылка на триггер](https://{ZABBIX_URL}/tr_events.php?triggerid={trigger_id})"
trigger_messages.append(f"*Host*: {host}\n*Уровень*: {priority}\n*Описание*: {description}\n{link}")
return "\n\n---\n\n".join(trigger_messages)
# Test functions for admin