| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
mikrotik:rb3011uias:routeros:system:scripts:failover [2020/10/11 16:51] Николай Солошин [Получение IP шлюзов] |
mikrotik:rb3011uias:routeros:system:scripts:failover [2022/02/12 11:40] (текущий) |
| Необходимо для того, чтобы исключить работу нескольких копий этого скрипта одновременно. Получиться это может при запуске по расписанию и через команду SMS. | Необходимо для того, чтобы исключить работу нескольких копий этого скрипта одновременно. Получиться это может при запуске по расписанию и через команду SMS. |
| |
| Проверяется значение переменной ''failoverRun'', если оно равно ''true'', значит в настоящий момент выполняется другая копия скрипта -> ждем в течение ''failoverRunTime'' и пробуем еще раз. Если за это время значение изменилось на ''false'', продолжаем выполнять скрипт, если нет, то отключаем [[mikrotik:rb3011uias:routeros:system:scheduler|шедулер]] и сообщаем о внештатной ситуации и завершаем выполнение скрипта. | Проверяется значение переменной ''failoverRun'', если оно равно ''true'', значит в настоящий момент выполняется другая копия скрипта -> ждем в течение ''failoverRunTime'' и пробуем еще раз. Если за это время значение изменилось на ''false'', меняем его на ''true'' и продолжаем выполнять скрипт, если нет, то отключаем [[mikrotik:rb3011uias:routeros:system:scheduler|шедулер]] и сообщаем о внештатной ситуации и завершаем выполнение скрипта. Если значение и так было ''false'', меняем его на ''true'' и продолжаем выполнять скрипт без ожидания. |
| |
| <code>:if ( $failoverRun != true ) do={ :set failoverRun true; } else={ | <code>:if ( $failoverRun != true ) do={ :set failoverRun true; } else={ |
| ==== Функция для CAPsMAN ==== | ==== Функция для CAPsMAN ==== |
| |
| # Function of switching guest network availability through CAPsMAN | Функция для переключения Wi-Fi сетей. Для выключения гостевой сети ждет переменную ''hotSpotOff'' с параметром ''yes'', для включения нужно вызвать без переменных. Для использования нужна [[mikrotik:rb3011uias:routeros:capsman:provisioning:switching_guests|соответствующая настройка]]. |
| |
| <code>:local swWireless do={ | <code>:local swWireless do={ |
| ==== Проверка интерфейсов ==== | ==== Проверка интерфейсов ==== |
| |
| # Check interfaces, if any is turned off - turn on | Проверяем, чтобы оба интерфейса были включены. Если это не так, ключаем. |
| |
| <code>/interface ethernet { | <code>/interface ethernet { |
| ==== Проверка резервного канала ==== | ==== Проверка резервного канала ==== |
| |
| # Call ping session function to check the backup channel | Вызываем функцию для проверки резервного канала. |
| |
| <code>:set pingStatus [ $pingSession pingFrom=$ether2Name; ];</code> | <code>:set pingStatus [ $pingSession pingFrom=$ether2Name; ];</code> |
| |
| # Checking the response of the function and suppressing frequent alerts about the failure of the backup channel | Проверяем ответ функции, сравниваем с эталоном. Если плохо, то, или сразу сообщаем об этом (SMS и логи), или молчим, пока ''pingFailCount'' не станет равен ''setFailCounter''. Сделано это для того, чтобы при неработающем резервном канале SMS-ки не сыпались при каждом запуске скрипта ([[mikrotik:rb3011uias:routeros:system:scheduler|а это часто]]), что... перебор. Если хорошо, то просто молчим. Если было плохо, но стало хорошо, сообщаем об этом, логируем и сбрасываем счетчик. |
| |
| <code> :if ( $pingStatus < $stableConnectFrom ) do={ | <code> :if ( $pingStatus < $stableConnectFrom ) do={ |
| }</code> | }</code> |
| |
| # Script kernel - checks the availability of the main channel, switches to the backup and sends notifications to the administrator and employees | ==== Основная часть скрипта ==== |
| | |
| | Собственно, отсюда она только начинается. До этого были цветочки. 8-O |
| |
| <code>/ip route { | <code>/ip route { |
| :set ether2Route [find dst-address="0.0.0.0/0" gateway=$gateway2ip];</code> | :set ether2Route [find dst-address="0.0.0.0/0" gateway=$gateway2ip];</code> |
| |
| ==== Тексты писем ==== | === Тексты писем === |
| | |
| | Тут вводится текст для сотрудников, который сообщает им в каком состоянии находится Интернет. |
| | |
| | Для удобства он разбит на 4 фрагмента - заголовок, текст при переходе на резервный канал, текст при переходе на основной канал и подпись. |
| |
| # Text strings used in the email to employees on the mailing list. | Для переноса строк можно использовать ''\r\n''. Кириллица тоже поддерживается, но вводить текст нужно непосредственно в редакторе скриптов WinBox, т.к. у MikroTik'а с этим есть определенные сложности. |
| |
| <code> :local eventHeader "Header,"; | <code> :local eventHeader "Header,"; |
| :local eventTextPrimary "Text\r\nPrimary"; | :local eventTextPrimary "Text\r\nPrimary"; |
| :local eventSign "Sign";</code> | :local eventSign "Sign";</code> |
| | |
| | А тут формируется итоговое письмо и тема, которая будет состоять из пояснительного текста и временной метки. Опять же, текст темы можно писать на русском. |
| |
| <code> :local dateTime ([/system clock get date]."@".[/system clock get time]); | <code> :local dateTime ([/system clock get date]."@".[/system clock get time]); |
| :local eventPrimary "$eventHeader\r\n\r\n$eventTextPrimary\r\n\r\n$eventSign"; | :local eventPrimary "$eventHeader\r\n\r\n$eventTextPrimary\r\n\r\n$eventSign"; |
| :local eventBackup "$eventHeader\r\n\r\n$eventTextBackup\r\n\r\n$eventSign";</code> | :local eventBackup "$eventHeader\r\n\r\n$eventTextBackup\r\n\r\n$eventSign";</code> |
| | |
| | == Пример письма == |
| |
| {{:mikrotik:rb3011uias:routeros:system:scripts:mail-sample.png?nolink|}} | {{:mikrotik:rb3011uias:routeros:system:scripts:mail-sample.png?nolink|}} |
| ==== Корректировка маршрутов ==== | |
| | === Подготовка маршрутов === |
| | |
| | Проверка и, при необходимости, корректировка обоих маршрутов. Для удобства, основной канал имеет дистанцию ''2'', а резервный ''3''. При переходе на резервный канал меняется только дистанция у маршрута этого канала - с ''3'' на ''1''. |
| |
| <code> :if ( [get $ether1Route distance] != 2 ) do={ | <code> :if ( [get $ether1Route distance] != 2 ) do={ |
| set $ether1Route distance=2; | set $ether1Route distance=2; |
| :log warning ("Distance for " . $ether1Name . " corrected!"); | :log warning ("Distance for " . $ether1Name . " corrected!"); |
| }</code> | } |
| |
| <code> :if ( [get $ether2Route distance] != 1 && [get $ether2Route distance] != 3 ) do={ | :if ( [get $ether2Route distance] != 1 && [get $ether2Route distance] != 3 ) do={ |
| set $ether2Route distance=3; | set $ether2Route distance=3; |
| :log warning ("Distance for " . $ether2Name . " corrected!"); | :log warning ("Distance for " . $ether2Name . " corrected!"); |
| }</code> | }</code> |
| |
| ==== Проверка основного канала ==== | === Проверка основного канала === |
| | |
| | Вызываем функцию для проверки основного канала. |
| |
| <code>:local pingStatus [ $pingSession pingFrom=$ether1Name; ];</code> | <code>:local pingStatus [ $pingSession pingFrom=$ether1Name; ];</code> |
| | |
| | Вот наконец и самая суть скрипта. Если ''pingStatus'' меньше ''stableConnect'' проверяем, первый ли это раз. Если первый, то просто предупреждаем администратора и выставляем метку ''pastCheckStatus'' в значение ''false''. Если не первый, т.е. ''pastCheckStatus'' уже равно ''false'', то переключаем канал на резервный, пишем в лог, уведомляем сотрудников и отключаем гостевую Wi-Fi сеть. |
| | |
| | Если ''pingStatus'' не меньше ''stableConnect'', значит основной канал работает нормально и можно переключиться обратно на него. В этом случае переключаем канал, меняя дистанцию резервного канала на ''3'', пишем в лог и всех уведомляем. Все! |
| |
| <code> :if ( $pingStatus < $stableConnect ) do={ | <code> :if ( $pingStatus < $stableConnect ) do={ |
| } | } |
| }</code> | }</code> |
| | |
| | И напоследок меняем значение переменной ''failoverRun'' на ''false'', [[#проверка_двойного_запуска|уведомляя другие копии]] этого скрипта о том, что текущий скрипт завершился и можно занимать его место. LOL |
| |
| <code>:set failoverRun false;</code> | <code>:set failoverRun false;</code> |
| ===== Код для импорта ===== | ===== Код для импорта ===== |
| |
| <file rsc failover.rsc>add comment="\D2\E5\F1\F2\E8\F0\EE\E2\E0\ED\E8\E5 \E8\ED\F2\E5\F0\ED\E5\F2 \EA\ | <file rsc failover.rsc>/system script |
| | add comment="\D2\E5\F1\F2\E8\F0\EE\E2\E0\ED\E8\E5 \E8\ED\F2\E5\F0\ED\E5\F2 \EA\ |
| \E0\ED\E0\EB\EE\E2 \E8 \EF\E5\F0\E5\EA\EB\FE\F7\E5\ED\E8\E5 \ED\E0 \F0\E5\ | \E0\ED\E0\EB\EE\E2 \E8 \EF\E5\F0\E5\EA\EB\FE\F7\E5\ED\E8\E5 \ED\E0 \F0\E5\ |
| \E7\E5\F0\E2\ED\FB\E9" dont-require-permissions=no name=script1 owner=\ | \E7\E5\F0\E2\ED\FB\E9" dont-require-permissions=no name=script1 owner=\ |