Здравствуйте, недавно я внедрил скрипт (нашёл в интернете) для мониторинга BGP-пиров, чтобы при падении одного из них получать уведомление на почту. Проблема в том, что скрипт, похоже, не работает (не отправляет письма). Почтовый инструмент настроен и работает, если отправлять письма вручную. Ниже сам скрипт:
# EDIT HERE
:local arrEmails [:toarray "mail@mail.com"];
:local debug false
# EDIT END
# Определение переменных
:global arrBgpState;
:global gotKey false;
:local hostNameX ([/system identity get name]);
:local statusX;
:local peerX;
:local peerXarrEl;
:local mailToX;
:local mailSubjectX;
:local mailBodyX;
:local peerStatusX;
:local arrBgpPeers [:toarray ""];
:local peername "";
:local peerTotal "";
if ($debug = true) do={
:log info ("=============НАЧАЛО ПРОВЕРКИ СТАТУСА BGP ПИРОВ=============" )
}
# Инициализация глобального массива — немного корявая реализация :P
:if ( [:len $arrBgpState] =0 ) do={
:set $arrBgpState {"false"="false"}
}
# Заполнение массива arrBgpPeers именами пиров
:foreach i in=[/routing bgp peer find] do={
:set peername [/routing bgp peer get $i name];
:set peerTotal ($peerTotal . "," .$peername);
}
:set arrBgpPeers [:toarray $peerTotal];
# Цикл по массиву пирингов
:local arrPos
:for arrPos from=0 to=([:len $arrBgpPeers]-1) do={
# Устанавливаем peerX в текущее имя пира
:set peerX [:pick $arrBgpPeers $arrPos];
# Проверяем, включен ли пир, и идём дальше
:if ([/routing bgp peer get [find name=$peerX] disabled ] != true) do={
# Получаем статус пира
:set peerStatusX [/routing bgp peer get [find name="$peerX"] state]
# Ищем ключ пира в глобальном массиве
:foreach k,v in=$arrBgpState do={
if ($k != "false") do={
:if ($gotKey = false) do={
:if ($k = $peerX) do={
:set gotKey true
}
}
}
}
# Инициализируем элемент массива arrBgpState с именем пира, если его ещё нет
:if ($gotKey = false) do={
:set ($arrBgpState->"$peerX") "up"
}
# Сбрасываем флаг для следующей итерации
:set gotKey false
# Предыдущий статус пира
:set statusX ($arrBgpState->"$peerX")
# Формируем тело письма
:set mailBodyX ("Имя маршрутизатора: " . $hostNameX . "\nСтатус BGP-пира: " . $peerStatusX . "\nИмя BGP-пира: " . $peerX . "\n");
# Проверяем, не установлен ли пир
:if ($peerStatusX != "established") do={
# Проверяем, первый ли раз пир упал
:if ( $statusX = "up" ) do={
# Ставим статус 'down' для глобальной переменной пира
:set ($arrBgpState->$peerX) "down"
# Лог для отладки
if ($debug = true) do={
:log error ("Статус BGP-пира ". $peerX ." — " . $peerStatusX . ". Отправляю уведомление по почте!")
}
# Тема письма
:set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " НЕ установлен!");
# Цикл по массиву email для отправки всем получателям
:local arrPos2
:for arrPos2 from=0 to=([:len $arrEmails]-1) do={
:set mailToX [:pick $arrEmails $arrPos2]
:log error ("Статус BGP-пира " . $peerX . " — " .$peerStatusX. "! Отправка Email уведомления на " . $mailToX . "." )
/tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX start-tls=yes;
}
} else={
# Пир уже падает, уведомление отправлено — пропускаем
if ($debug = true) do={
:log info ("BGP-пир ". $peerX ." уже не работает. Игнорирую!")
}
}
} else={
# Проверяем, если пир только что восстановился, отправляем уведомление
if ($statusX = "down") do={
:set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " восстановился!");
:local arrPos2
:for arrPos2 from=0 to=([:len $arrEmails]-1) do={
:set mailToX [:pick $arrEmails $arrPos2]
:log warning ("Статус BGP-пира " . $peerX . " восстановился! Отправляю информирующее письмо на " . $mailToX . "." )
/tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX start-tls=yes;
}
}
if ($debug = true) do={
:log info ("BGP-пир " . $peerX . " работает. Делать ничего не надо!")
}
# Устанавливаем статус пира в up
:set ($arrBgpState->$peerX) "up"
}
} else={
if ($debug = true) do={
:log warning ("BGP-пир " . $peerX . " отключён. Пропускаю!")
}
}
}
if ($debug = true) do={
:log info ("==============КОНЕЦ ПРОВЕРКИ СТАТУСА BGP ПИРОВ===============" )
}
В логах выскакивает такая ошибка:
Topics script error
Message: BGP Peer status is idle! Sending Email alert to > mail@mail.com > .
Кто-нибудь может помочь разобраться, в чём проблема?
Модель роутера: CCR1072-1G-8S+
Версия RouterOS: 6.39.2
# EDIT HERE
:local arrEmails [:toarray "mail@mail.com"];
:local debug false
# EDIT END
# Определение переменных
:global arrBgpState;
:global gotKey false;
:local hostNameX ([/system identity get name]);
:local statusX;
:local peerX;
:local peerXarrEl;
:local mailToX;
:local mailSubjectX;
:local mailBodyX;
:local peerStatusX;
:local arrBgpPeers [:toarray ""];
:local peername "";
:local peerTotal "";
if ($debug = true) do={
:log info ("=============НАЧАЛО ПРОВЕРКИ СТАТУСА BGP ПИРОВ=============" )
}
# Инициализация глобального массива — немного корявая реализация :P
:if ( [:len $arrBgpState] =0 ) do={
:set $arrBgpState {"false"="false"}
}
# Заполнение массива arrBgpPeers именами пиров
:foreach i in=[/routing bgp peer find] do={
:set peername [/routing bgp peer get $i name];
:set peerTotal ($peerTotal . "," .$peername);
}
:set arrBgpPeers [:toarray $peerTotal];
# Цикл по массиву пирингов
:local arrPos
:for arrPos from=0 to=([:len $arrBgpPeers]-1) do={
# Устанавливаем peerX в текущее имя пира
:set peerX [:pick $arrBgpPeers $arrPos];
# Проверяем, включен ли пир, и идём дальше
:if ([/routing bgp peer get [find name=$peerX] disabled ] != true) do={
# Получаем статус пира
:set peerStatusX [/routing bgp peer get [find name="$peerX"] state]
# Ищем ключ пира в глобальном массиве
:foreach k,v in=$arrBgpState do={
if ($k != "false") do={
:if ($gotKey = false) do={
:if ($k = $peerX) do={
:set gotKey true
}
}
}
}
# Инициализируем элемент массива arrBgpState с именем пира, если его ещё нет
:if ($gotKey = false) do={
:set ($arrBgpState->"$peerX") "up"
}
# Сбрасываем флаг для следующей итерации
:set gotKey false
# Предыдущий статус пира
:set statusX ($arrBgpState->"$peerX")
# Формируем тело письма
:set mailBodyX ("Имя маршрутизатора: " . $hostNameX . "\nСтатус BGP-пира: " . $peerStatusX . "\nИмя BGP-пира: " . $peerX . "\n");
# Проверяем, не установлен ли пир
:if ($peerStatusX != "established") do={
# Проверяем, первый ли раз пир упал
:if ( $statusX = "up" ) do={
# Ставим статус 'down' для глобальной переменной пира
:set ($arrBgpState->$peerX) "down"
# Лог для отладки
if ($debug = true) do={
:log error ("Статус BGP-пира ". $peerX ." — " . $peerStatusX . ". Отправляю уведомление по почте!")
}
# Тема письма
:set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " НЕ установлен!");
# Цикл по массиву email для отправки всем получателям
:local arrPos2
:for arrPos2 from=0 to=([:len $arrEmails]-1) do={
:set mailToX [:pick $arrEmails $arrPos2]
:log error ("Статус BGP-пира " . $peerX . " — " .$peerStatusX. "! Отправка Email уведомления на " . $mailToX . "." )
/tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX start-tls=yes;
}
} else={
# Пир уже падает, уведомление отправлено — пропускаем
if ($debug = true) do={
:log info ("BGP-пир ". $peerX ." уже не работает. Игнорирую!")
}
}
} else={
# Проверяем, если пир только что восстановился, отправляем уведомление
if ($statusX = "down") do={
:set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " восстановился!");
:local arrPos2
:for arrPos2 from=0 to=([:len $arrEmails]-1) do={
:set mailToX [:pick $arrEmails $arrPos2]
:log warning ("Статус BGP-пира " . $peerX . " восстановился! Отправляю информирующее письмо на " . $mailToX . "." )
/tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX start-tls=yes;
}
}
if ($debug = true) do={
:log info ("BGP-пир " . $peerX . " работает. Делать ничего не надо!")
}
# Устанавливаем статус пира в up
:set ($arrBgpState->$peerX) "up"
}
} else={
if ($debug = true) do={
:log warning ("BGP-пир " . $peerX . " отключён. Пропускаю!")
}
}
}
if ($debug = true) do={
:log info ("==============КОНЕЦ ПРОВЕРКИ СТАТУСА BGP ПИРОВ===============" )
}
В логах выскакивает такая ошибка:
Topics script error
Message: BGP Peer status is idle! Sending Email alert to > mail@mail.com > .
Кто-нибудь может помочь разобраться, в чём проблема?
Модель роутера: CCR1072-1G-8S+
Версия RouterOS: 6.39.2
