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