Скрипт предназначен для измерения скорости между MikroTik-устройствами с отправкой уведомлений (алертов) по электронной почте.
Создание файла со списком узлов
Создайте файл filials.txt со следующим содержимым:
test isp1 = 1.1.1.1 test isp2 = 2.2.2.2 test isp3 = 3.3.3.3 test isp4 = 4.4.4.4 test isp5 = 5.5.5.5
Описание переменных
testSpeed — максимальная скорость теста (Мбит/с).
testAlert — минимальная скорость для срабатывания алерта (Мбит/с).
duration — время тестирования каждого канала (в секундах).
testuser — пользователь удалённого MikroTik с правами test (bandwidth-test).
testpass — пароль пользователя удалённого MikroTik с правами test (bandwidth-test).
sender — адрес электронной почты отправителя.
mailreciever — адрес электронной почты получателя.
mailServer — адрес почтового сервера.
:local testSpeed 30; :local testAlert 15; :local duration 60; :local testuser testusername; :local testpass testP@ssword; :local mailreciever "rАдрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. "; :local sender "sАдрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. "; :local mailServer mailServer.address; # 1) Get file content :local fileContent [ /file get [ find name="filials.txt" ] contents ]; # 2) Split content by Lines to $splitLines array :local splitLines [ :toarray "" ]; :local tempStr ""; :for i from=0 to=( [ :len $fileContent ] - 1 ) do={ :local char [ :pick $fileContent $i ( $i + 1 ) ]; :if ( $char != "\n" && $char != "\r" ) do={ :set tempStr ( $tempStr . $char ); }; :if ( $char = "\n" ) do={ :if ( [ :len $tempStr ] > 2 ) do={ :set splitLines ( $splitLines , $tempStr ); }; :set $tempStr ""; }; }; # service function for trim spaces at start and end of string :local trimString do={ :local inputString $1; :local outputString ""; :local endOfSpaces false; :for i from=0 to=( [ :len $inputString ] - 1 ) do={ :local char [ :pick $inputString $i ( $i + 1 ) ]; :if ( $endOfSpaces = true || ( $char != " " && $char != "\f" && $char != "\n" && $char != "\r" && $char != "\t" && $char != "\v" ) ) do={ :if ( $endOfSpaces = false ) do={ :set endOfSpaces true }; :set outputString ( $outputString . $char ); }; }; :set inputString $outputString; :set outputString ""; :set endOfSpaces false; :for i from=( [ :len $inputString ] - 1 ) to=0 step=-1 do={ :local char [ :pick $inputString $i ( $i + 1 ) ]; :if ( $endOfSpaces = true || ( $char != " " && $char != "\f" && $char != "\n" && $char != "\r" && $char != "\t" && $char != "\v" ) ) do={ :if ( $endOfSpaces = false ) do={ :set endOfSpaces true }; :set outputString ( $char . $outputString ); }; }; :return $outputString; }; # 3) Split every line to array :local filials [ :toarray "" ]; :local counter 0; :foreach line in=$splitLines do={ :local tempDescription ""; :local tempIp ""; :local flagIpInString false; :for i from=0 to=( [ :len $line ] - 1 ) do={ :local char [ :pick $line $i ( $i + 1 ) ]; :if ( $char != "=" ) do={ :if ( $flagIpInString = false ) do={ :set tempDescription ( $tempDescription . $char ); } else={ :set tempIp ( $tempIp . $char ); }; } else={ :set flagIpInString true; }; }; :set ( $filials->$counter ) { "description"=[ $trimString $tempDescription ]; "ip"=[ :toip [ $trimString $tempIp ] ] }; :set counter ( $counter + 1 ); }; :local currentDate ([/system clock get date]." ".[/system clock get time]); :local rxSpeed 0; :local txSpeed 0; :local message ""; :local subject ""; :set subject (">>> ".$testAlert." Mbps Bandwidth report on ".$currentDate); :log warning ($subject); :foreach filial in=$filials do={ :do { :local testcount 0; :for i from=0 to=1 do={ :if ($testcount = 0) do={ /tool bandwidth-test address=[:put ( $filial->"ip" );] duration=[:put ("$duration"."s")] protocol=tcp user=$testuser password=$testpass direction=both local-tx-speed=[:put ("$testSpeed"."M")] remote-tx-speed=[:put ("$testSpeed"."M")] do={ :set rxSpeed [$"rx-total-average"]; :set txSpeed [$"tx-total-average"]; } }; :set rxSpeed ($rxSpeed/1048576); :set txSpeed ($txSpeed/1048576); :set message ($message("Speed to ".[:put ( $filial->"description" );].", IP: ".[:put ( $filial->"ip" );]." Rx: ".$rxSpeed." mbps".", Tx: ".$txSpeed." mbps")); :if ($rxSpeed > 0 && $txSpeed > 0) do={ :if ($rxSpeed < $testAlert || $txSpeed < $testAlert) do={ :log error ($message); /tool e-mail send to=$mailreciever subject=("Speed Alert - ".[:put ( $filial->"description" );]) body="Speedtest alerts on $currentDate:\r\nSpeed lower then $testAlert mbps\r\n$message" server=$mailServer from=$sender } else={ :log warning ($message);}; :set testcount 1; } else={ :if ($i = 0 && $testcount = 0) do={ :log error ("Error, test again. ".$message); }; :if ($i > 0 && $testcount = 0) do={ :log error ($message); /tool e-mail send to=$mailreciever subject=("Speed Alert - ".[:put ( $filial->"description" );]) body="Speedtest alerts on $currentDate:\r\nSpeed lower then $testAlert mbps\r\n$message" server=$mailServer from=$sender }; }; }; } on-error={ :log warning (">>> Script error. Not found any IP"); }; }; :log warning (">>> Test completed");