feat: комментарий из address-list рядом с IP
This commit is contained in:
+16
-11
@@ -77,9 +77,9 @@ def decode(val) -> str:
|
|||||||
return str(val) if val else ""
|
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 (пропускает отключённые).
|
из записей с именем ADDRESS_LIST_NAME (пропускает отключённые).
|
||||||
"""
|
"""
|
||||||
resource = api.get_binary_resource("/ip/firewall/address-list")
|
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()
|
address = decode(entry.get("address", b"")).strip()
|
||||||
if "/" in address:
|
if "/" in address:
|
||||||
address = address.split("/")[0]
|
address = address.split("/")[0]
|
||||||
|
comment = decode(entry.get("comment", b"")).strip()
|
||||||
if address:
|
if address:
|
||||||
ip_list.append(address)
|
ip_list.append((address, comment))
|
||||||
|
|
||||||
return ip_list
|
return ip_list
|
||||||
|
|
||||||
@@ -213,7 +214,10 @@ def main() -> None:
|
|||||||
# Стартовое сообщение — отправляем только после успешного подключения
|
# Стартовое сообщение — отправляем только после успешного подключения
|
||||||
if not startup_notified:
|
if not startup_notified:
|
||||||
identity = fetch_identity(api)
|
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(
|
notify(
|
||||||
f"🟢 <b>MikroTik Monitor запущен</b>\n"
|
f"🟢 <b>MikroTik Monitor запущен</b>\n"
|
||||||
f"\n"
|
f"\n"
|
||||||
@@ -232,24 +236,25 @@ def main() -> None:
|
|||||||
log.info("Адресов для проверки: %d → %s", len(ip_list), ip_list)
|
log.info("Адресов для проверки: %d → %s", len(ip_list), ip_list)
|
||||||
|
|
||||||
# Добавляем новые хосты в state (без сброса существующих)
|
# Добавляем новые хосты в state (без сброса существующих)
|
||||||
for ip in ip_list:
|
for ip, comment in ip_list:
|
||||||
if ip not in failure_count:
|
if ip not in failure_count:
|
||||||
failure_count[ip] = 0
|
failure_count[ip] = 0
|
||||||
host_down[ip] = False
|
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")
|
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
rtt = mikrotik_ping(api, ip)
|
rtt = mikrotik_ping(api, ip)
|
||||||
|
|
||||||
if rtt is not None:
|
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]:
|
if host_down[ip]:
|
||||||
host_down[ip] = False
|
host_down[ip] = False
|
||||||
failure_count[ip] = 0
|
failure_count[ip] = 0
|
||||||
notify(
|
notify(
|
||||||
f"✅ <b>Хост восстановился</b>\n"
|
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"RTT: {rtt:.1f} ms\n"
|
||||||
f"Время: {now}"
|
f"Время: {now}"
|
||||||
)
|
)
|
||||||
@@ -258,14 +263,14 @@ def main() -> None:
|
|||||||
else:
|
else:
|
||||||
failure_count[ip] += 1
|
failure_count[ip] += 1
|
||||||
log.warning(
|
log.warning(
|
||||||
"❌ %-18s не отвечает (%d/%d)",
|
"❌ %-28s не отвечает (%d/%d)",
|
||||||
ip, failure_count[ip], FAILURE_THRESHOLD,
|
label, failure_count[ip], FAILURE_THRESHOLD,
|
||||||
)
|
)
|
||||||
if failure_count[ip] >= FAILURE_THRESHOLD and not host_down[ip]:
|
if failure_count[ip] >= FAILURE_THRESHOLD and not host_down[ip]:
|
||||||
host_down[ip] = True
|
host_down[ip] = True
|
||||||
notify(
|
notify(
|
||||||
f"🔴 <b>Хост недоступен!</b>\n"
|
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"Список: <code>{ADDRESS_LIST_NAME}</code>\n"
|
||||||
f"Не отвечает {failure_count[ip]} проверки подряд\n"
|
f"Не отвечает {failure_count[ip]} проверки подряд\n"
|
||||||
f"Время: {now}"
|
f"Время: {now}"
|
||||||
|
|||||||
Reference in New Issue
Block a user