Данный скрипт предполагает подключение USB-модема только в режиме Stick
! Для режима HiLink
нужно писать совершенно другой скрипт.
Инициализация функций, используемых в скрипте. Эти функции вводятся скриптом «variable-initialization»!
:global sendEvent; :global pingSession; :global ispLogging;
Эти переменные также вводятся скриптом «variables-initialization».
:global pppNumber; :global pingCount; :global stableConnectFrom;
Локальные переменные, используемы этим скриптом.
:local interfaceName [/interface ppp-client get $pppNumber name]; :local pingCountTotal ($pingCount * 2); :local pingStatus;
Тело скрипта. Подключает модем, проверяет и, если ошибка, сообщает администратору и логирует.
/interface ppp-client {
:if ( [get $pppNumber disable] = true ) do={
:log info ("Connecting $interfaceName for testing...");
:do { set $pppNumber disable=no } on-error={
:log warning ("$interfaceName enabled at the second attempt!");
set $pppNumber disable=no; };
:delay 10s;
$pingSession pingFrom=$interfaceName myPingCount=2;
:set pingStatus [ $pingSession pingFrom=$interfaceName ];
set $pppNumber disable=yes;
:log info ("Disconnecting $interfaceName after testing.");
$ispLogging outInt=$interfaceName receivedPing=$pingStatus totalPing=$pingCountTotal startMode="test-modem-scheduler" newFileAt=month;
:if ( $pingStatus < $stableConnectFrom ) do={
:local msgBad "$interfaceName failure (received $pingStatus/$pingCountTotal)!";
:log warning ("$msgBad");
$sendEvent msg=$msgBad;
} else={
:log info ("$interfaceName is OK (received $pingStatus/$pingCountTotal)."); }
} else={
:local modemEnabled "$interfaceName testing is not complete! It is already enabled...";
$sendEvent mode=sms msg=$modemEnabled;
:log warning ("$modemEnabled"); }
}
В версии RouterOS 6.46.3
(про другие не знаю) есть баг из-за которого, если в списке PPP интерфейсов есть только модем, он с первой попытки не включается, только со второй. Поэтому пришлось вводить костыль. Как только в списке их стало больше одного, добавилась постоянно подключенная VPN сессия, ошибка пропала!
/system script
add comment="\CF\E5\F0\E8\EE\E4\E8\F7\E5\F1\EA\EE\E5 \F2\E5\F1\F2\E8\F0\EE\E2\
\E0\ED\E8\E5 \EC\EE\E4\E5\EC\E0" dont-require-permissions=no name=\
test-modem owner=petya policy=ftp,read,write,policy,test,sensitive \
source="# Written by Nikolay Soloshin (nikolay@soloshin.su) for RouterOS v\
6.46.3 on RB3011UiAS (arm) @ 2020.03\r\
\n\r\
\n# Functions used in the script. They are entered by the script \"variabl\
e-initialization\" when the device starts!\r\
\n:global sendEvent;\r\
\n:global pingSession;\r\
\n:global ispLogging;\r\
\n\r\
\n# These variables are set by the script \"variables-initialization\" whe\
n the device starts!\r\
\n:global pppNumber;\r\
\n:global pingCount;\r\
\n:global stableConnectFrom;\r\
\n\r\
\n# Local variables used in the script.\r\
\n:local interfaceName [/interface ppp-client get \$pppNumber name];\r\
\n:local pingCountTotal (\$pingCount * 2);\r\
\n:local pingStatus;\r\
\n\r\
\n# The body of the script. Checks the modem and sends a message to the ad\
ministrator in case of failure.\r\
\n/interface ppp-client {\r\
\n :if ( [get \$pppNumber disable] = true ) do={\r\
\n :log info (\"Connecting \$interfaceName for testing...\");\r\
\n :do { set \$pppNumber disable=no } on-error={\r\
\n :log warning (\"\$interfaceName enabled at the second attempt!\");\
\r\
\n set \$pppNumber disable=no; };\r\
\n :delay 10s;\r\
\n \$pingSession pingFrom=\$interfaceName myPingCount=2;\r\
\n :set pingStatus [ \$pingSession pingFrom=\$interfaceName ];\r\
\n set \$pppNumber disable=yes;\r\
\n :log info (\"Disconnecting \$interfaceName after testing.\");\r\
\n \$ispLogging outInt=\$interfaceName receivedPing=\$pingStatus totalP\
ing=\$pingCountTotal startMode=\"test-modem-scheduler\" newFileAt=month;\r\
\n :if ( \$pingStatus < \$stableConnectFrom ) do={\r\
\n :local msgBad \"\$interfaceName failure (received \$pingStatus/\$p\
ingCountTotal)!\";\r\
\n :log warning (\"\$msgBad\");\r\
\n \$sendEvent msg=\$msgBad;\r\
\n } else={\r\
\n :log info (\"\$interfaceName is OK (received \$pingStatus/\$ping\
CountTotal).\"); }\r\
\n } else={\r\
\n :local modemEnabled \"\$interfaceName testing is not complete!\
\_It is already enabled...\";\r\
\n \$sendEvent mode=sms msg=\$modemEnabled;\r\
\n :log warning (\"\$modemEnabled\"); }\r\
\n}\r\
\n\r\
\n# With love from Vladivostok."
Скрипт должен выполняться периодически. Параметры запуска смотрите в соответствующем разделе.
Это минимально необходимый набор для работы скрипта.
Обсуждение