Инструменты пользователя

Инструменты сайта


mikrotik:rb3011uias:routeros:system:scripts:failover

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
mikrotik:rb3011uias:routeros:system:scripts:failover [2020/10/11 16:07]
Николай Солошин [Проверка двойного запуска]
mikrotik:rb3011uias:routeros:system:scripts:failover [2022/02/12 11:40] (текущий)
Строка 64: Строка 64:
 Необходимо для того, чтобы исключить работу нескольких копий этого скрипта одновременно. Получиться это может при запуске по расписанию и через команду 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={
Строка 86: Строка 86:
 ==== SMS команды ==== ==== SMS команды ====
  
-# SMS command to force switch to the backup channel and disable the scheduler+Эти команды меняют логику работы дальнейшей части скрипта посредством подмены значений переменных, тем самым заставляя его думать как нам нужно. 
 + 
 +=== Резервный канал === 
 + 
 +SMS команда для переключения на резервный канал. 
 + 
 +Значение переменной ''stableConnect'' устанавливается заведомо больш**и**м, чтобы при любом исходе тестирования основной канал казался скрипту неработоспособным и он переключил нас на резервный. А для того, чтобы скрипт изменил маршруты сразу, сбрасывается значение переменной ''pastCheckStatus'' в ''false''. Ну и изменяется метка для логов ''startModeEvent'', чтобы было понятно. Последним отключается расписание.
  
 <code>:if ( $channel = "backup") do={ <code>:if ( $channel = "backup") do={
Строка 98: Строка 104:
 }</code> }</code>
  
-# SMS command to force switch to the main channel and disable the scheduler+=== Основной канал === 
 + 
 +SMS команда для переключения на основной канал. 
 + 
 +Значение переменной ''stableConnect'' устанавливается заведомо очень маленьким, чтобы при любом исходе тестирования основной канал казался скрипту работоспособным и он переключил нас на него. Также изменяется метка для логов ''startModeEvent'', чтобы было понятно. Последним выключается расписание.
  
 <code>:if ( $channel = "primary") do={ <code>:if ( $channel = "primary") do={
Строка 109: Строка 119:
 }</code> }</code>
  
-# The command to enable automatic channel selection+=== Автоматический выбор === 
 + 
 +Команда возвращает работу скрипта в нормальный режим и сразу же завершает работу.
  
 <code>:if ( $channel = "auto") do={ <code>:if ( $channel = "auto") do={
Строка 120: Строка 132:
 }</code> }</code>
  
-# SMS command to check both channels and send a report+=== Проверка состояния каналов === 
 + 
 +Команда просто проверяет оба канала, отчитывается в ответной SMS и завершает работу.
  
 <code>:if ( $channel = "test") do={ <code>:if ( $channel = "test") do={
Строка 133: Строка 147:
 }</code> }</code>
  
-==== Проверка маршрутов ====+==== Получение IP шлюзов ====
  
-# Checking routes, if one of them is not - turn off the sheduler, error and send an alert+Ищется по дефолтным маршрутам и названиям интерфейсов, если хоть одного из них нет - выключаем шедулер, пишем в лог ошибку и отправляем алерт.
  
 <code>/ip route { :do { <code>/ip route { :do {
Строка 149: Строка 163:
 }</code> }</code>
  
-# Selective ARP cleaning function, not used+Выборочная очистка ARP. Не используется, осталась из оригинального скрипта. Так и не понял, зачем она нужна была, т.к. кроме проблем ничего не дает. В случае чего можно быстро включить, раскомментировав соответствующие строки [[#проверка_основного_канала|тут]].
  
 <code>:local clearArp do={ <code>:local clearArp do={
Строка 160: Строка 174:
 ==== Функция для 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={
Строка 178: Строка 192:
 ==== Проверка интерфейсов ==== ==== Проверка интерфейсов ====
  
-# Check interfaces, if any is turned off - turn on+Проверяем, чтобы оба интерфейса были включены. Если это не так, ключаем.
  
 <code>/interface ethernet { <code>/interface ethernet {
Строка 193: Строка 207:
 ==== Проверка резервного канала ==== ==== Проверка резервного канала ====
  
-# 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={
Строка 215: Строка 229:
 }</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 {
Строка 221: Строка 237:
   :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>
  
-==== Тексты писем ====+=== Тексты писем ===
  
-# Text strings used in the email to employees on the mailing list.+Тут вводится текст для сотрудников, который сообщает им в каком состоянии находится Интернет. 
 + 
 +Для удобства он разбит на 4 фрагмента - заголовок, текст при переходе на резервный канал, текст при переходе на основной канал и подпись. 
 + 
 +Для переноса строк можно использовать ''\r\n''. Кириллица тоже поддерживается, но вводить текст нужно непосредственно в редакторе скриптов WinBox, т.к. у MikroTik'а с этим есть определенные сложности.
  
 <code>  :local eventHeader "Header,"; <code>  :local eventHeader "Header,";
Строка 229: Строка 249:
   :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]);
Строка 235: Строка 257:
   :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={
Строка 286: Строка 319:
       }       }
 }</code> }</code>
 +
 +И напоследок меняем значение переменной ''failoverRun'' на ''false'', [[#проверка_двойного_запуска|уведомляя другие копии]] этого скрипта о том, что текущий скрипт завершился и можно занимать его место. LOL
  
 <code>:set failoverRun false;</code> <code>:set failoverRun false;</code>
Строка 291: Строка 326:
 ===== Код для импорта ===== ===== Код для импорта =====
  
-<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=\
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)