Страница 2 из 2

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

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

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

{{... /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);

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

Добавлено: 31 дек 2017, 03:03
Dragon_Knight
В синтаксисе ошибок больше не вижу.
На не своём железе отлаживать сложно, но вот вам совет, как это делаю я:
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]"   }};

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

Добавлено: 31 дек 2017, 04:06
Kato
после обновления ROS

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

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

Добавлено: 31 дек 2017, 12:16
EIKA
Kato писал(а):
после обновления ROS

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

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

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

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

Спасибо.

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

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

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

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

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

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

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

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

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

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

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