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 ""
|
||||
|
||||
|
||||
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}"
|
||||
|
||||
Reference in New Issue
Block a user