feat: переменная OBJECT_NAME в уведомлениях

This commit is contained in:
2026-05-19 11:40:44 +07:00
parent 143e67a859
commit 5c3181bb27
2 changed files with 26 additions and 1 deletions
+16 -1
View File
@@ -41,6 +41,7 @@ MAX_CHAT_ID = os.getenv("MAX_CHAT_ID", "")
MAX_API_URL = os.getenv("MAX_API_URL", "https://platform-api.max.ru")
ADDRESS_LIST_NAME = os.environ["ADDRESS_LIST_NAME"]
OBJECT_NAME = os.getenv("OBJECT_NAME", "") # название объекта/локации
CHECK_INTERVAL = int(os.getenv("CHECK_INTERVAL", "60"))
PING_COUNT = int(os.getenv("PING_COUNT", "3"))
PING_TIMEOUT_MS = int(os.getenv("PING_TIMEOUT_MS", "1000"))
@@ -59,6 +60,13 @@ logging.basicConfig(
)
log = logging.getLogger(__name__)
# ──────────────────────────────────────────────
# Хелпер: префикс объекта для уведомлений
# ──────────────────────────────────────────────
def obj_prefix() -> str:
return f"🏢 <b>{OBJECT_NAME}</b>\n" if OBJECT_NAME else ""
# ──────────────────────────────────────────────
# Глобальное состояние
# ──────────────────────────────────────────────
@@ -222,7 +230,8 @@ def fmt_label(ip: str) -> str:
# ──────────────────────────────────────────────
def build_status_report(title: str) -> str:
now = datetime.now()
lines = [f"<b>{title}</b>", f"🔧 Роутер: <b>{router_identity}</b>", ""]
prefix = f"🏢 <b>{OBJECT_NAME}</b>\n" if OBJECT_NAME else ""
lines = [f"{prefix}<b>{title}</b>", f"🔧 Роутер: <b>{router_identity}</b>", ""]
down = [ip for ip, s in hosts_state.items() if s["status"] == "down"]
up = [ip for ip, s in hosts_state.items() if s["status"] == "up"]
@@ -444,6 +453,7 @@ def main() -> None:
if mikrotik_error_notified:
mikrotik_error_notified = False
notify(
f"{obj_prefix()}"
f"✅ <b>Подключение к MikroTik восстановлено</b>\n"
f"🔧 Роутер: <b>{router_identity}</b> (<code>{MIKROTIK_HOST}</code>)"
)
@@ -457,6 +467,7 @@ def main() -> None:
for ip, comment in ip_list
) or " (список пуст)"
notify(
f"{obj_prefix()}"
f"🟢 <b>MikroTik Monitor запущен</b>\n\n"
f"🔧 Роутер: <b>{router_identity}</b> (<code>{MIKROTIK_HOST}</code>)\n"
f"📋 Address-list: <code>{ADDRESS_LIST_NAME}</code>\n\n"
@@ -502,6 +513,7 @@ def main() -> None:
dur = fmt_duration(now - ds) if ds else "?"
state.update({"status": "up", "down_since": None, "last_notify": None})
notify(
f"{obj_prefix()}"
f"✅ <b>Хост восстановился</b>\n"
f"IP: <code>{ip}</code>" + (f" ({comment})" if comment else "") + "\n"
f"RTT: {rtt:.1f} ms\n"
@@ -518,6 +530,7 @@ def main() -> None:
if state["status"] != "down":
state.update({"status": "down", "down_since": now, "last_notify": now})
notify(
f"{obj_prefix()}"
f"🔴 <b>Хост недоступен!</b>\n"
f"IP: <code>{ip}</code>" + (f" ({comment})" if comment else "") + "\n"
f"Список: <code>{ADDRESS_LIST_NAME}</code>\n"
@@ -530,6 +543,7 @@ def main() -> None:
dur = fmt_duration(now - ds) if ds else "?"
state["last_notify"] = now
notify(
f"{obj_prefix()}"
f"🔴 <b>Хост всё ещё недоступен!</b>\n"
f"IP: <code>{ip}</code>" + (f" ({comment})" if comment else "") + "\n"
f"Недоступен уже: {dur}\n"
@@ -544,6 +558,7 @@ def main() -> None:
if not mikrotik_error_notified:
mikrotik_error_notified = True
notify(
f"{obj_prefix()}"
f"⚠️ <b>Ошибка подключения к MikroTik</b>\n"
f"🔧 Роутер: <b>{router_identity}</b> (<code>{MIKROTIK_HOST}</code>)\n"
f"<code>{exc}</code>"
+10
View File
@@ -40,6 +40,9 @@ services:
- MAX_CHAT_ID=123456789 # ← ID чата в MAX
- MAX_API_URL=https://platform-api.max.ru
# Название объекта/локации где стоит роутер (отображается в уведомлениях)
- OBJECT_NAME=Офис # ← например: Склад, Квартал54, Офис
# Имя address-list из /ip firewall address-list на MikroTik
- ADDRESS_LIST_NAME=monitor
@@ -48,10 +51,17 @@ services:
- PING_COUNT=3 # кол-во пинг-пакетов
- PING_TIMEOUT_MS=1000 # таймаут пинга (мс)
- FAILURE_THRESHOLD=2 # провалов подряд → уведомление DOWN
- REPEAT_NOTIFY_MIN=30 # повтор уведомления DOWN каждые N минут (0 = отключить)
- DAILY_REPORT_TIME=09:00 # время ежедневного отчёта (HH:MM)
- WEB_PORT=8080 # порт веб-дашборда
# Временная зона
- TZ=Europe/Moscow
# ── Порты ──────────────────────────────────────────────────────
ports:
- "8080:8080" # веб-дашборд
# ── Тома ───────────────────────────────────────────────────────
volumes:
- /etc/localtime:/etc/localtime:ro