Перестал работать скрипт после обновления ROS

Обсуждение ПО и его настройки
Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Парни,

В какой-то момент перестал работать скрипт оценки состояния процессора и USB-модема. По его запуску с параметрами, которые заведомо приведут к отправке сообщения, ничего не происходит. В логах - ничего. При дебаге скрипта в консоли я не могу понять где именно ошибка - никаких I (invalid) или чего-то красного я не вижу. В какой момент все умерло, не знаю - скрипту пара лет. Сам скрипт, а точнее, два: https://2keep.net/3g-internet-connectio ... -mikrotik/

Кто подскажет куда копнуть?


Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Единственное, какая раскраска есть при дебаге, это черные прямоугольники после некоторых do. Может это и есть проблема?

Изображение


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

А можно скрипт целиком и текстом пожалуйста...
Но первое что бросается в глаза это:

Код: Выделить всё

#incorrect:
:for i from = 1 to = 2 do = { :put $i }
#correct syntax:
:for i from=1 to=2 do={ :put $i }
:for i from= 1 to= 2 do={ :put $i }   


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Спасибо за ответ.

У меня при вставке в консоль нет строчек #incorrect.

Скрипт состоит из 2 частей. Ниже привожу полный текст:

Код: Выделить всё

{

##############################
### SETTINGS SECTION BEGIN ###
##############################

# Recipients to send notifications
:global mailAddrTo "yourmail@dom.ru";
:global mailAddrCopy "yourbackupmail@dom2.com";
 
# CPU load test duration
:global sec 3;
 
# ICMP packets qty
:local cnt 10;
 
# Expected qty of received packets
# In this case we send 10 packets and expect 1 or more to be received
:local cntOkRes 1;
 
# First test host
:local host1 ya.ru;
 
# Second test host
:local host2 8.8.8.8;

##############################
#### SETTINGS SECTION END ####
##############################

##############################
####### CPU LOAD TEST ########
##############################

:global cpu100 0;
for x1 from=1 to=$sec do {
   :if ( [/system resource get cpu-load]="100")  do={
      :global cpu100 ($cpu100+1);
   }
:delay 1;
}
:if ( $cpu100 = $sec )  do={
   /tool e-mail send to=$mailAddrTo cc=$mailAddrCopy body="Within $sec seconds, CPU load on Mikrotik was 100%. Mikrotik will be restarted!" subject="$[/system identity get name]. Mikrotik CPU load was 100% on $[/system clock get time] $[/system clock get date]"
   :delay 20;
   /system reboot;
}

##############################
##### CPU LOAD TEST END ######
##############################

# Checking default route presence
if ([/ip route find where dst-address=0.0.0.0/0]  = "") do={
   :log warning "No default gateway! USB port will be power cycled!";
# USB port power cycle
   /system routerboard usb power-reset duration=5s
   :delay 25;
}

# Finding IP address of default GW & looking for traffic via it
:local defGw [/ip route get [/ip route find where dst-address=0.0.0.0/0] gateway];
 
# Default route's interface lookup
:global ifName [/ip address get [/ip address find where network=$defGw] interface];

# Looking and counting traffic on interface
:global wanTrafTx "0";
:global wanTrafTxRes "0";
:global wanTrafRx "0";
:global wanTrafRxRes "0";
for x from=1 to=5 do {
   /interface monitor-traffic [/interface find name=$ifName] once do={
      :global wanTrafTx (tx-bits-per-second / 1024);
   }
   /interface monitor-traffic [/interface find name=$ifName] once do={
      :global wanTrafRx (rx-bits-per-second / 1024);
   }
   if ($wanTrafTx > $wanTrafTxRes) do {
      :global wanTrafTxRes $wanTrafTx;
   }
   if ($wanTrafRx > $wanTrafRxRes) do {
      :global wanTrafRxRes $wanTrafRx;
   }
   :delay 1;
}
 
# Comparing actual traffic with reference value (30 kbps). If less, ping hosts.
if ($wanTrafTxRes < 30 and $wanTrafRxRes < 30) do {
   # Hosts test and setting variables
   :local cntRes1 [/ping count=$cnt $host1];
   :local cntRes2 [/ping count=$cnt $host2];
   # If less than 1 from 10 packets was received
   if ($cntRes1 < $cntOkRes and $cntRes2 < $cntOkRes) do {
         # Writing data to log
         :local logmsg ("Internet connection fail! \n\nCPU Load: ".[/system resource get cpu-load]."% \nWAN speed RX: ".[:tonum $wanTrafRxRes]." kbit/s \nWAN speed TX: ".[:tonum $wanTrafTxRes]." kbit/s \nHost - ".[:tostr $host1]." lost ".[:tonum $cnt] - [:tonum $cntRes1]." packets of ".[:tostr $cnt]." \nHost - ".[:tostr $host2]." lost ".[:tonum $cnt] - [:tonum $cntRes2]." packets of ".[:tostr $cnt]."\n");
         :log info $logmsg;
         
         # Disabling default route's interface
         /interface ppp-client disable [/interface ppp-client find name=$ifName];
         :delay 10;
 
         # Checking modem status / Running "modemStatus" script
         execute "/system script run \"modemStatus\"";
         :delay 5s;
         :global modemStatus;

         # Enabling default route's interface
         /interface ppp-client enable [/interface ppp-client find name=$ifName];
         :delay 20;

         # E-maling report
         /tool e-mail send to=$mailAddrTo cc=$mailAddrCopy body="$logmsg$modemStatus" subject="$[/system identity get name]. Internet connection fails! $[/system clock get time] $[/system clock get date]"
      }
   }
}

И modemStatus - вызываемый скрипт из первого:

Код: Выделить всё

:global modemStatus;
:global ifName;
:global rssi;
:global operator;
:local i 0;
/interface ppp-client info $ifName do={
:set i ($i+1);
:if ($i=3) do={
:global rssi "\nSignal: $"signal-strengh"\n";
:global operator "Operator: $"current-operator"";

:set modemStatus "\nModem Status: $"modem-status"\nFunctionality: $"functionality"\nManufacturer: $"manufacturer"\nModel: $"model"\nRevision: $"revision"\nSerial Number: $"serial-number"\nCurrent Operator: $"current-operator"\nAccess Technology: $"access-technology"\nSignal Strength: $"signal-strengh"";

:log info $modemStatus;

:local stop {[:find $"signal-strengh" "dBm";]-1};
:local rssi1 {:tonum [:pick $"signal-strengh" 1 $stop]};

:log info $rssi1;

/system script job remove [find script=modemStatus ];
}}

Заранее благодарю.


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

Ладно, хорошо, попробую ещё раз.

Код: Выделить всё

НЕ правильно:
do = { :put $i }

Правильно:
do={ :put $i }


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Ну вот черные прямоугольники на пробелах я вижу в дебаге. Вы о том, что они лишние?


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

После do должен идти знак равенства без пробелов, после знака равенства должна идти открывающая скобочка без пробелов.


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Спасибо. Вот исправленный вариант без комментов.

Код: Выделить всё

{

:global mailAddrTo "yourmail@dom.ru";
:global mailAddrCopy "yourbackupmail@dom2.com";
:global sec 3;
:local cnt 10;
:local cntOkRes 1;
:local host1 ya.ru;
:local host2 8.8.8.8;
:global cpu100 0;
for x1 from=1 to=$sec do={
   :if ( [/system resource get cpu-load]="1")  do={
      :global cpu100 ($cpu100+1);
   }
:delay 1;
}
:if ( $cpu100 = $sec )  do={
   /tool e-mail send to=$mailAddrTo cc=$mailAddrCopy body="Within $sec seconds, CPU load on Mikrotik was 100%. Mikrotik will be restarted!" subject="$[/system identity get name]. Mikrotik CPU load was 100% on $[/system clock get time] $[/system clock get date]"
   :delay 20;
   /system reboot;
}
if ([/ip route find where dst-address=0.0.0.0/0]  = "") do={
   :log warning "No default gateway! USB port will be power cycled!";
   /system routerboard usb power-reset duration=5s
   :delay 25;
}
:local defGw [/ip route get [/ip route find where dst-address=0.0.0.0/0] gateway];
:global ifName [/ip address get [/ip address find where network=$defGw] interface];
:global wanTrafTx "0";
:global wanTrafTxRes "0";
:global wanTrafRx "0";
:global wanTrafRxRes "0";
for x from=1 to=5 do={
   /interface monitor-traffic [/interface find name=$ifName] once do={
      :global wanTrafTx (tx-bits-per-second / 1024);
   }
   /interface monitor-traffic [/interface find name=$ifName] once do={
      :global wanTrafRx (rx-bits-per-second / 1024);
   }
   if ($wanTrafTx > $wanTrafTxRes) do={
      :global wanTrafTxRes $wanTrafTx;
   }
   if ($wanTrafRx > $wanTrafRxRes) do={
      :global wanTrafRxRes $wanTrafRx;
   }
   :delay 1;
}
if ($wanTrafTxRes < 30000 and $wanTrafRxRes < 30000) do={
   :local cntRes1 [/ping count=$cnt $host1];
   :local cntRes2 [/ping count=$cnt $host2];
   if ($cntRes1 < $cntOkRes and $cntRes2 < $cntOkRes) do={
         :local logmsg ("Internet connection fail! \n\nCPU Load: ".[/system resource get cpu-load]."% \nWAN speed RX: ".[:tonum $wanTrafRxRes]." kbit/s \nWAN speed TX: ".[:tonum $wanTrafTxRes]." kbit/s \nHost - ".[:tostr $host1]." lost ".[:tonum $cnt] - [:tonum $cntRes1]." packets of ".[:tostr $cnt]." \nHost - ".[:tostr $host2]." lost ".[:tonum $cnt] - [:tonum $cntRes2]." packets of ".[:tostr $cnt]."\n");
         :log info $logmsg;
         /interface ppp-client disable [/interface ppp-client find name=$ifName];
         :delay 10;
          execute "/system script run \"modemStatus\"";
         :delay 5s;
         :global modemStatus;
         /interface ppp-client enable [/interface ppp-client find name=$ifName];
         :delay 20;
         /tool e-mail send to=$mailAddrTo cc=$mailAddrCopy body="$logmsg$modemStatus" subject="$[/system identity get name]. Internet connection fails! $[/system clock get time] $[/system clock get date]"
      }
   }
}

Теперь при дебаге нет ни одного прямоугольника с темным фоном.

Скрипт по-прежнему не работает. В нем для проверки я изменил значение cpu со 100 на 1, а также скорость на интерфейсах с 30 kbps на 30000 (у меня такие скорости невозможны физически). В почту ничего не приходит. В логах тоже ничего.

Единственное что сейчас подсвечивается синим болдом (не прямоугольником) - это вхождения "\n". Это норм?

Изображение


Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

В логах нет попыток скрипта стукнуться в почту.


Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Вот еще обратные слеши вокруг вызова субскрипта:

Изображение

Это ошибка или корректный синтаксис?


Ответить