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