feat: комментарий из address-list рядом с IP

This commit is contained in:
2026-05-17 15:59:21 +07:00
parent 7f470ada63
commit 949f2c029c
+16 -11
View File
@@ -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" • <code>{ip}</code>" for ip in ip_list) or " (список пуст)"
ip_lines = "\n".join(
f" • <code>{ip}</code> ({comment})" if comment else f" • <code>{ip}</code>"
for ip, comment in ip_list
) or " (список пуст)"
notify(
f"🟢 <b>MikroTik Monitor запущен</b>\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"✅ <b>Хост восстановился</b>\n"
f"IP: <code>{ip}</code>\n"
f"IP: <code>{ip}</code>" + (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"🔴 <b>Хост недоступен!</b>\n"
f"IP: <code>{ip}</code>\n"
f"IP: <code>{ip}</code>" + (f" ({comment})" if comment else "") + f"\n"
f"Список: <code>{ADDRESS_LIST_NAME}</code>\n"
f"Не отвечает {failure_count[ip]} проверки подряд\n"
f"Время: {now}"