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

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

Кажется, дело в поиске имен конкретных интерфейсов. Как только подаются такие команды, Микротик отдает список всех возможных агрументов:

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

{{... /interface monitor-traffic [/interface find name=$ifName] once do={
{{{...                                                                   
bonding          ethernet     l2tp-server  ovpn-client  pppoe-client  sstp-client       vlan      blink    enable           print         
bridge           gre          list         ovpn-server  pppoe-server  sstp-server       vpls      comment  export           reset-counters
detect-internet  ipip         lte          ppp-client   pptp-client   traffic-eng       vrrp      disable  find             set           
eoip             l2tp-client  mesh         ppp-server   pptp-server   virtual-ethernet  wireless  edit     monitor-traffic 
{{{... :global wanTrafTx (tx-bits-per-second / 1024);
{{{... }                                             
{{... /interface monitor-traffic [/interface find name=$ifName] once do={
{{{...                                                                   
bonding          ethernet     l2tp-server  ovpn-client  pppoe-client  sstp-client       vlan      blink    enable           print         
bridge           gre          list         ovpn-server  pppoe-server  sstp-server       vpls      comment  export           reset-counters
detect-internet  ipip         lte          ppp-client   pptp-client   traffic-eng       vrrp      disable  find             set           
eoip             l2tp-client  mesh         ppp-server   pptp-server   virtual-ethernet  wireless  edit     monitor-traffic 
{{{... :global wanTrafRx (rx-bits-per-second / 1024);


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

В синтаксисе ошибок больше не вижу.
На не своём железе отлаживать сложно, но вот вам совет, как это делаю я:
1) Во первых весь скрипт превращаю в одну строку (тут важный момент, т.к. должна КАЖДАЯ строка в конце иметь точку с запятой, даже на закрывающих скобках, например { :put $i }; )
2) Делаю точки отладки (вывод в консоль полученных данных, методом :put "отладка";) да, с учётом первого пункта это сложно, но иного пути я не знаю. Можно сначала сделать отладку а потмо превратить в одну строку.
3) Выполняю скрипт в консоле и смотрю что выводится. Это нам даст место, где всё затыкается. Далее нужно думать.

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

: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] $[/sys
tem 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 powe
r-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];:glob
al 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 wanTrafTxR
es $wanTrafTx;};if ($wanTrafRx > $wanTrafRxRes) do={   :global wanTrafRxRes $wanTrafRx;};:delay 1;};if ($wanTrafTxRes < 30000 and $wanTrafRxRes < 30000) do={:local cntRes1 [/ping count=$cnt $host1];:loc
al 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]"   }};


Небольшой свод правил логики и ссылок:
  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.
Аватара пользователя
Kato
Сообщения: 271
Зарегистрирован: 17 май 2016, 04:23
Откуда: Primorye

после обновления ROS

с какой на какую обновили? Читайте изменения и в соответствии с изменениями корректируйте скрипт


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

Kato писал(а):
после обновления ROS

с какой на какую обновили? Читайте изменения и в соответствии с изменениями корректируйте скрипт

Спасибо, кэп. Но это как бы через чур очевидно, но проблема в том, что скрипту 2 года, и за это время в ROS чего только не наколбасили.


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

Dragon_Knight писал(а):В синтаксисе ошибок больше не вижу.
На не своём железе отлаживать сложно, но вот вам совет, как это делаю я:
1) Во первых весь скрипт превращаю в одну строку (тут важный момент, т.к. должна КАЖДАЯ строка в конце иметь точку с запятой, даже на закрывающих скобках, например { :put $i }; )
2) Делаю точки отладки (вывод в консоль полученных данных, методом :put "отладка";) да, с учётом первого пункта это сложно, но иного пути я не знаю. Можно сначала сделать отладку а потмо превратить в одну строку.
3) Выполняю скрипт в консоле и смотрю что выводится. Это нам даст место, где всё затыкается. Далее нужно думать.

Спасибо.

Т.е. экраны с n и t - это штатно, и не является косяком?

1. В чем смысл переноса в одну строку?
1.1. Что делать с put $i не понял, в вашем коде нет такого.
2. Чем это лучше, чем просто построчный paste в консоль?
3. В консоли у меня скрипт проходит целиком, и я там ничего не не вижу. Единственное, что смущало, я привел на скринах выше.

P.S.
А в чем сложность отладки на своем железе? Достаточно любого PPP-интерфейса в системе, код унифицирован под поиск имени.


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

Значит так. Построчный прогон скрипта (с переносом строк) ошибок не дает. Но после третьей закрывабщей скобки, спустя несколько секунд выводится: No such item. Эта ошибка указывает не нечто динамическое, что существовало и потом перестало существовать. Внимание, вопрос - как найти это место поточнее?

Прогон скрипта в версии от Dragon_Knight дает ошибку в переменной Within $sec.


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

Через каждую строчку написать :put "отладка1";, :put "отладка2"; .... :put "отладка999"; и посмотреть где остановится..


Небольшой свод правил логики и ссылок:
  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.
Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

EIKA писал(а):Прогон скрипта в версии от Dragon_Knight дает ошибку в переменной Within $sec.

Эта строка вселяет в меня уверенность, что ТС вообще к данному скрипту не имеет никакого отношения и просто копипастит без раздумий всё подряд. Нет там такой переменной. Вообще. Есть переменная $sec, изначально со значением 3, а то, что он привел - часть строки из тела письма )))
С Новым годом, с новым счастьем, товарищи!


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить