Сообщите мне по электронной почте, если сессия BGP не установлена., RouterOS
FearlessRabbitt
Guest
0
07.08.2012 10:49:00
Привет всем, я хочу создать скрипт, который будет присылать мне письмо, если сессия BGP не установлена. Это единственное состояние BGP, которое меня интересует. У меня сейчас настроен базовый Netwatch, который отправляет мне письмо, если маршрутизатор ISP недоступен, но этого недостаточно. Можете подсказать, в каком направлении мне двигаться, чтобы это настроить? Пожалуйста, имейте в виду, что мои знания программирования/скриптинга практически отсутствуют. Спасибо.
FearlessRabbitt
Guest
0
08.08.2012 10:07:00
Что мне известно пока: команда, которая нужна – /routing bgp peer print status. Вывод получается примерно такой: name=“tcom” instance=default remote-address=213.149.123.81 remote-as=29453 tcp-md5-key=“” nexthop-choice=default multihop=no route-reflect=no hold-time=3m ttl=default in-filter=“” out-filter=t-com-out address-families=ip default-originate=never remove-private-as=no as-override=no passive=no use-bfd=no remote-id=195.140.164.68 local-address=213.149.123.82 uptime=9w6d7h2m41s prefix-count=1 updates-sent=12 updates-received=1 withdrawn-sent=9 withdrawn-received=0 remote-hold-time=3m used-hold-time=3m used-keepalive-time=1m refresh-capability=yes as4-capability=yes state=established.
Теперь вот как бы мне сделать скрипт, который бы выполнял эту команду каждые 5 минут и присылал мне письмо, если state не established?
mrz
Guest
0
08.08.2012 11:15:00
Добавить запланированный скрипт: если ([/routing bgp peer get [find name="xxx"] state] != "established") do={ .. отправить письмо сюда...}
FearlessRabbitt
Guest
0
08.08.2012 11:16:00
Пытаюсь отредактировать какой-то похожий скрипт, который нашел на форумах, интересно, я близок? :global bgpest ; :global bgpest “established”; :local bgpstate [/routing bgp peer get [find where state=established]]; :if ($ bgpest != $ bgpstate ) do={ /tool e-mail send from= mikrotikDV@portomontenegro.com server=91.220.187.8 to= mvujkovic@portomontenegro.com subject=“bgp script test” } Становится совсем отчаянно.
FearlessRabbitt
Guest
0
08.08.2012 11:38:00
Спасибо за ответ! Очень ценно! В меню "Система / Скрипты" я создал новый скрипт, состоящий из: `:if ([/routing bgp peer get [find name=“mina”] state] != “established”) do={/tool e-mail send from= mikrotikDV@portomontenegro.com server=91.220.187.8 to= mvujkovic@portomontenegro.com subject=“bgp script test”}`
Потом я отключил пира "mina", запустил скрипт вручную и ждал тестового письма. Ничего не происходит, я что-то делаю не так?
mrz
Guest
0
08.08.2012 11:46:00
Скрипт работает у меня отлично. Если почту не получаете — проверьте настройки почты. Возможно, потребуется ввести имя пользователя и пароль или включить опцию starttls.
FearlessRabbitt
Guest
0
08.08.2012 12:14:00
Может, глупый вопрос: я просто копирую и вставляю код в меню Script (прикреплён)?
FearlessRabbitt
Guest
0
08.08.2012 13:43:00
Попробовал вручную ввести код прямо в командную строку – вылез синтаксис ошибки на “=”. Второй раз попробовал без “=”, а там сообщение, что такого элемента нет. Есть какие-нибудь идеи?
FearlessRabbitt
Guest
0
08.08.2012 15:46:00
И после целого дня возился, и вот победитель! Вот он, если кому-то еще понадобится: `if ([/routing bgp peer get [find name=mina] state] != “established”) do={ – send email --}`. В общем, я использовал `find name= "mina"`, и это не работало с кавычками. Кто бы мог подумать?
directlogic
Guest
0
23.05.2013 13:54:00
Привет всем! Этот скрипт проверяет сессии BGP и, если они не установлены, отправляет письмо. Но если BGP был недоступен дольше, чем положено, то отправляет кучу писем. Как предотвратить такую ситуацию и настроить скрипт, чтобы он отправлял письмо только один раз? Спасибо!
mrz
Guest
0
23.05.2013 14:16:00
Нужна дополнительная проверка. Если состояние не установлено, устанавливай глобальную переменную, что пир отмечен как упавший. В следующий раз, когда скрипт запустится, проверяй и отправляй письмо только если ранее было установлено.
plisken
Guest
0
03.05.2014 11:34:00
Можешь, пожалуйста, показать полный рабочий скрипт, чтобы я мог его скопировать и вставить. Я уже много раз пытался, но пока без успеха. Спасибо!
plisken
Guest
0
09.05.2014 12:40:00
Какой скрипт отключить ether2, если установлен BGP пир?
plisken
Guest
0
10.05.2014 10:34:00
Можешь написать полный скрипт со всеми командами для почты, пожалуйста? Использую POP3 сервер, порт 25.
Cha0s
Guest
0
08.08.2015 01:36:00
Я искал такой же скрипт, чтобы получать оповещения, когда какой-либо BGP-пир отключается. Я ничего готового не нашёл, поэтому написал скрипт на основе того, что было предложено в этой теме. Это один скрипт, поддерживающий несколько пиров и несколько адресов электронной почты для получения оповещений. Предполагается, что /tools email правильно настроен на роутере. Скрипт периодически (запускаю его с планировщиком - запускаю каждые 10 секунд без проблем) проверяет все настроенные BGP-пиры. - Если пир отключён, он будет проигнорирован. - Если состояние пира 'established', он будет проигнорирован. - Если у пира любое другое состояние, кроме 'established', будет отправлено информационное письмо на настроенные адреса электронной почты и это будет залогировано как ошибка (красным) в окне журнала. - Если при следующем запуске скрипта пир всё ещё отключён, он запомнит это и больше не будет отправлять никаких писем для этого пира. - Если при следующем запуске пиры, которые были отключены, вернутся в состояние 'established', будет отправлено информационное письмо на настроенный адрес электронной почты и это будет залогировано как предупреждение (синим) в окне журнала. Скрипт протестирован на v6.29 и v6.30.2. Не знаю, будет ли он работать корректно на старых версиях. (Уверенно знаю, что не работает на 5.x и, вероятно, не будет работать на <=6.3) Известные проблемы: Если вы не определяете BGP-пиры с их правильными именами, скрипт не будет работать корректно. Чтобы использовать скрипт, вам нужно отредактировать только первые два массива, чтобы добавить имена ваших BGP-пиров и адреса электронной почты, разделенные запятыми. Также есть опция отладки, чтобы включить больше информации в окне журнала. Установите это значение false, чтобы отключить. Вам не нужно ничего редактировать в скрипте. Просто запустив его, он не должен выдавать никакого вывода (если отладка отключена), когда все пиры находятся в состоянии established. ################################################################## # СТАТУС BGP-ПИРОВ С ПОЧТОЙ ОПОВЕЩЕНИЙ СЦРИПТ (только для RouterOS v6) # # Исходный автор: Cha0s, около 2015 года, с улучшениями от JB172 # # Информация: # ################################################################### # РЕДАКТИРОВАТЬ ЗДЕСЬ :local arrBgpPeers [:toarray "peer1,peer2,peer3"]; :local arrEmails [:toarray "email@example.net,email2@example.net"]; :local debug true # КОНЕЦ РЕДАКТИРОВАНИЯ
если ($debug = true) do={ :log info ("=============НАЧАЛО ОБНАРУЖЕНИЯ СТАТУСА BGP-ПИРОВ=============" ) }
# Инициализировать глобальный массив – довольно глупый способ это делать :P :если ( [:len $arrBgpState] =0 ) do={ :set $arrBgpState {"false"="false"} }
# Цикл по массиву пиров :local arrPos :для arrPos от=0 до=([:len $arrBgpPeers]-1) do={
# Установить peerX в текущее имя пира для этой итерации :set peerX [:pick $arrBgpPeers $arrPos];
# Проверить, включён ли пир, и продолжить :если ([/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={ если ($k != "false") do={ если ($gotKey = false) do={ если ($k = $peerX) do={ :set gotKey true } } } }
# Инициализировать элемент массива arrBgpState с именем peerX, если он ещё не существует :если ($gotKey = false) do={ :set ($arrBgpState->"$peerX") "up" }
# Сбросить это для следующей итерации :set gotKey false
# Предыдущий статус запуска пира :set statusX ($arrBgpState->"$peerX")
# Проверить, не находится ли BGP-пир не в состоянии established :если ($peerStatusX != "established") do={
# Проверить, это первое время, когда пир отключён :если ( $statusX = "up" ) do={
# Установить значение в 'down' для глобального ключа пира :set ($arrBgpState->$peerX) "down"
# Информационное логирование если ($debug = true) do={ :log error ("BGP-пир ". $peerX ." состояние " . $peerStatusX . ". Отправка оповещений по электронной почте!") }
# Подготовить тему письма :set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " НЕ находится в состоянии established!");
# Цикл по массиву писем, чтобы отправить письма всем получателям в массиве :local arrPos2 :для arrPos2 от=0 до=([:len $arrEmails]-1) do={ # Установить mailToX в получателя для этой итерации :set mailToX [:pick $arrEmails $arrPos2]
# Информационное логирование :log error ("BGP-пир " . $peerX . " статус " .$peerStatusX. "! Отправка оповещения по электронной почте " . $mailToX . "." )
# Отправить письмо /tool e-mail send to=$mailToX subject=$mailSubjectX body=$mailBodyX; }
} иное={ # Пир отключён. Уже отправлено уведомление, так что ничего не делайте. если ($debug = true) do={ :log info ("BGP-пир ". $peerX ." уже отключён. Игнорировать!") } }
} иное={
# Проверить, только что вернулся пир в работу и отправить информационное письмо если ($statusX = "down") do={
# Подготовить тему письма :set mailSubjectX ("BGP-пир ". $peerX ." на ". $hostNameX . " восстановился!");
# Цикл по массиву писем, чтобы отправить письма всем получателям в массиве :local arrPos2 :для arrPos2 от=0 до=([:len $arrEmails]-1) do={ # Установить mailToX в получателя для этой итерации :set mailToX [:pick $arrEmails $arrPos2]
# Информационное логирование :log info ("BGP-пир " . $peerX . " работает. Ничего не делать!") }
# Установить статус пира в up :set ($arrBgpState->$peerX) "up" } }
если ($debug = true) do={ :log info ("=============КОНЕЦ ОБНАРУЖЕНИЯ СТАТУСА BGP-ПИРОВ===============" ) } Я не очень хорошо знаком с языком скриптов RouterOS, поэтому, безусловно, есть возможности для улучшения моего кода! Не стесняйтесь редактировать его по своему вкусу.
plisken
Guest
0
08.08.2015 07:10:00
Работает как по маслу. Очень благодарен! Спасибо.
Cha0s
Guest
0
08.09.2015 10:04:00
Вот перевод текста на русский язык:
Вот немного измененная версия, которая автоматически найдет все настроенные BGP-пиры и будет их мониторить (вместо того, чтобы определять каждого пира вручную). Спасибо JB172 за патч. ################################################################## # СТАТУС BGP ПИРОВ - СКРИПТ ОПОЗОРЕНИЯ ПО ЭЛЕКТРОННОЙ ПОЧТЕ (только для RouterOS v6) # # Изначальный автор: Cha0s, примерно 2015 год, с улучшениями от JB172 # # Информация: # ################################################################### # РЕДАКТИРОВАТЬ ЗДЕСЬ :local arrEmails [:toarray "email@example.net,email2@example.net"]; :local debug true # КОНЕЦ РЕДАКТИРОВАНИЯ
} иначе={ # Пир опустился. Уведомление уже было отправлено, поэтому ничего не делаем. если ($debug = true) то={ :log info ("BGP пир ". $peerX ." уже опустился. Игнорируем!") } }
} иначе={
# Проверяем, вернулся ли пир и отправляем информационное электронное письмо если ($statusX = "down") то={
# Подготавливаем тему электронного письма :set mailSubjectX ("Состояние BGP пира ". $peerX ." на ". $hostNameX . " восстановлено!");
# Перебираем массив электронных писем, чтобы отправить электронные письма всем получателям в массиве :local arrPos2 :для arrPos2 от=0 до=([:len $arrEmails]-1) то={ # Устанавливаем mailToX получателю для этой итерации :set mailToX [:pick $arrEmails $arrPos2]
если ($debug = true) то={ :log info ("=============ЗАВЕРШЕНИЕ ОБНАРУЖЕНИЯ СТАТУСА BGP ПИРОВ===============" ) }
plisken
Guest
0
08.09.2015 16:13:00
Работает отлично. Отличная работа!
ajayyadav941
Guest
0
15.11.2018 17:48:00
Привет! Может, кто-нибудь подскажет, как настроить получение уведомления по электронной почте, когда сессия BGP разрывается?
dsfak
Guest
0
09.12.2022 08:43:00
Привет, ребята, @Cha0s! Ваш скрипт работает просто отлично! Есть ли у вас какие-нибудь обновления для версии 7? Потому что он не работает, и я пытаюсь конвертировать его в v7, но без успеха…!