diff --git a/monitor.py b/monitor.py index 41f9409..298f758 100644 --- a/monitor.py +++ b/monitor.py @@ -77,9 +77,9 @@ def decode(val) -> str: return str(val) if val else "" -def fetch_address_list(api) -> list[str]: +def fetch_address_list(api) -> list[tuple[str, str]]: """ - Читает /ip firewall address-list и возвращает список IP + Читает /ip firewall address-list и возвращает список (ip, comment) из записей с именем ADDRESS_LIST_NAME (пропускает отключённые). """ resource = api.get_binary_resource("/ip/firewall/address-list") @@ -96,8 +96,9 @@ def fetch_address_list(api) -> list[str]: address = decode(entry.get("address", b"")).strip() if "/" in address: address = address.split("/")[0] + comment = decode(entry.get("comment", b"")).strip() if address: - ip_list.append(address) + ip_list.append((address, comment)) return ip_list @@ -213,7 +214,10 @@ def main() -> None: # Стартовое сообщение — отправляем только после успешного подключения if not startup_notified: identity = fetch_identity(api) - ip_lines = "\n".join(f" • {ip}" for ip in ip_list) or " (список пуст)" + ip_lines = "\n".join( + f" • {ip} ({comment})" if comment else f" • {ip}" + for ip, comment in ip_list + ) or " (список пуст)" notify( f"🟢 MikroTik Monitor запущен\n" f"\n" @@ -232,24 +236,25 @@ def main() -> None: log.info("Адресов для проверки: %d → %s", len(ip_list), ip_list) # Добавляем новые хосты в state (без сброса существующих) - for ip in ip_list: + for ip, comment in ip_list: if ip not in failure_count: failure_count[ip] = 0 host_down[ip] = False # Пингуем каждый адрес - for ip in ip_list: + for ip, comment in ip_list: + label = f"{ip} ({comment})" if comment else ip now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") rtt = mikrotik_ping(api, ip) if rtt is not None: - log.info("✅ %-18s avg-rtt=%.1f ms", ip, rtt) + log.info("✅ %-28s avg-rtt=%.1f ms", label, rtt) if host_down[ip]: host_down[ip] = False failure_count[ip] = 0 notify( f"✅ Хост восстановился\n" - f"IP: {ip}\n" + f"IP: {ip}" + (f" ({comment})" if comment else "") + f"\n" f"RTT: {rtt:.1f} ms\n" f"Время: {now}" ) @@ -258,14 +263,14 @@ def main() -> None: else: failure_count[ip] += 1 log.warning( - "❌ %-18s не отвечает (%d/%d)", - ip, failure_count[ip], FAILURE_THRESHOLD, + "❌ %-28s не отвечает (%d/%d)", + label, failure_count[ip], FAILURE_THRESHOLD, ) if failure_count[ip] >= FAILURE_THRESHOLD and not host_down[ip]: host_down[ip] = True notify( f"🔴 Хост недоступен!\n" - f"IP: {ip}\n" + f"IP: {ip}" + (f" ({comment})" if comment else "") + f"\n" f"Список: {ADDRESS_LIST_NAME}\n" f"Не отвечает {failure_count[ip]} проверки подряд\n" f"Время: {now}"