diff --git a/telezab.py b/telezab.py index 66cff1e..41a1562 100644 --- a/telezab.py +++ b/telezab.py @@ -1243,82 +1243,81 @@ def escape_telegram_chars(text): return text +def extract_host_from_name(name): + match = re.match(r"^(.*?)\s*->", name) + return match.group(1) if match else "Неизвестный хост" + + def get_zabbix_triggers(group_id): try: zapi = ZabbixAPI(ZABBIX_URL) zapi.login(api_token=ZABBIX_API_TOKEN) - telebot.logger.info(f"Fetching triggers for group {group_id}") + telebot.logger.info(f"Fetching active hosts for group {group_id}") - # Получение событий - 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, - expandDescription=1, - expandComment=1, - selectItems=["itemid", "lastvalue"], - selectLastEvent=["clock"] + # Получаем список активных хостов в группе + active_hosts = zapi.host.get( + groupids=group_id, + output=["hostid", "name"], + filter={"status": "0"} # Только включенные хосты ) - # Сортировка триггеров по полю clock в локальном коде - triggers_sorted = sorted(triggers, key=lambda t: int(t['lastEvent']['clock'])) + if not active_hosts: + telebot.logger.info(f"No active hosts found for group {group_id}") + return [] - telebot.logger.info(f"Found {len(triggers)} triggers for group {group_id}") + host_ids = [host["hostid"] for host in active_hosts] + telebot.logger.info(f"Found {len(host_ids)} active hosts in group {group_id}") - # Московское время - moskva_tz = timezone('Europe/Moscow') + # Получение активных проблем для этих хостов + problems = zapi.problem.get( + output=["eventid", "name", "severity", "clock"], + hostids=host_ids, + suppressed=0, + acknowledged=0, + filter={"severity": ["4", "5"]}, # Только высокий и аварийный уровень + sortorder="ASC" + ) - priority_map = { - '4': 'HIGH', - '5': 'DISASTER' - } + if not problems: + telebot.logger.info(f"No active problems found for group {group_id}") + return [] - trigger_messages = [] - - for trigger in triggers_sorted: - event_time_epoch = int(trigger['lastEvent']['clock']) - event_time = datetime.fromtimestamp(event_time_epoch, tz=moskva_tz) - - description = escape_telegram_chars(trigger['description']) - host = trigger['hosts'][0]['name'] - priority = priority_map.get(trigger['priority'], 'Неизвестно') - - # Получаем itemids - item_ids = [item['itemid'] for item in trigger['items']] - - telebot.logger.info(f"Trigger {trigger['triggerid']} on host {host} has itemids: {item_ids}") - - # Формируем ссылку для batchgraph - batchgraph_link = f"{ZABBIX_URL}/history.php?action=batchgraph&" - batchgraph_link += "&".join([f"itemids[{item_id}]={item_id}" for item_id in item_ids]) - batchgraph_link += "&graphtype=0" - - # Заменяем {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']) + # Получение IP-адресов хостов + host_interfaces = zapi.hostinterface.get( + hostids=host_ids, + output=["hostid", "ip"] + ) + host_ip_map = {iface["hostid"]: iface["ip"] for iface in host_interfaces} + print(host_ip_map) + moscow_tz = timezone('Europe/Moscow') + severity_map = {'4': 'HIGH', '5': 'DISASTER'} + priority_map = {'4': '⚠️', '5': '⛔️'} + problem_messages = [] + for problem in problems: + event_time_epoch = int(problem['clock']) + event_time = datetime.fromtimestamp(event_time_epoch, tz=moscow_tz) event_time_formatted = event_time.strftime('%Y-%m-%d %H:%M:%S Мск') - message = (f"Host: {host}\n" + severity = severity_map.get(problem['severity'], 'Неизвестно') + priority = priority_map.get(problem['severity'], '') + description = problem.get('name', 'Нет описания') + + # Получаем хост из описания (или по-другому, если известно) + host = extract_host_from_name(description) + host_ip = host_ip_map.get(problem.get("hostid"), "Неизвестный IP") + + message = (f"{priority} Host: {host}\n" + f"IP: {host_ip}\n" f"Описание: {description}\n" - f"Критичность: {priority}\n" - f"Время создания: {event_time_formatted}\n" - f'URL: Ссылка на график') + f"Критичность: {severity}\n" + f"Время создания: {event_time_formatted}") - trigger_messages.append(message) + problem_messages.append(message) - return trigger_messages + return problem_messages except Exception as e: - telebot.logger.error(f"Error fetching triggers for group {group_id}: {e}") + telebot.logger.error(f"Error fetching problems for group {group_id}: {e}") return None