diff --git a/telezab.py b/telezab.py index 3cacb1d..057c54f 100644 --- a/telezab.py +++ b/telezab.py @@ -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