Показаны сообщения с ярлыком Синтаксис. Показать все сообщения
Показаны сообщения с ярлыком Синтаксис. Показать все сообщения

понедельник, 21 декабря 2015 г.

Подсветка синтаксиса скриптов RouterOS в сторонних редакторах.

  Когда приходится писать объемные скрипты в стандартном редакторе MikroTik встроенном в RouterOS это делать очень неудобно. Уследить за синтаксисом без "подсветки" нереально. Для примера приведу два скрина одного и того же скрипта в стандартном редакторе и в стороннем редакторе с подсветкой синтаксиса RouterOS:


Стандартный редактор скриптов RouterOS.
Редактор Sublime Text + Package Mikrotik​Script.

пятница, 9 октября 2015 г.

Отладка скриптов.

  Как таковой отладки в RouterOS нет. Но можно воспользоваться командой
/system script> print from=<your script name>
которая подсветит ваши ошибки скрипта в терминале.
  Так-же вы можете поместить скрипт в { } и скопировать его в терминал. Если этого не сделать, то на локлаьные переменные будет ругаться. Ну и это можно обойти, сделал все локальные переменные - глобальными.

суббота, 19 сентября 2015 г.

Скрипт делающий функцию(в виде глобальной переменной) из скрипта.

В версии 6.2 ввели использование функций. Для того, что-бы  из скрипта сделать функцию используем код:
:local fnArray;
:foreach f in=[/system script find where name~"^Function.*"] do={:set fnArray ($fnArray.",".[/system script get $f name])};
:set fnArray [:toarray $fnArray];
:foreach f in=$fnArray do={:exec script=":global \"$f\" [:parse [/system script get $f source]]"; /log info ("Defined function ".$f);};
Все скрипты которые у вас есть и начинаются с "Function." появятся в виде глобальный переменных с тем же названием. Дальше их можно использовать как функции.
  Например, есть скрипт Function.1 с телом log info 1. После использования вышеуказанного кода:
:put $Function.1
Output:
log info 1

Спасибо dissident76 с офф. форума.

пятница, 18 сентября 2015 г.

Функции.

Если в скрипте нужно использовать повторяющийся кусок кода можно использовать функцию:
#define function and run it
:global myFunc do={:put "hello from function"}
$myFunc
output:
hello from function
Таким образом можно сократить количество строк в коде. Например функцию можно использовать в таком куске кода:
:if ($lenPass = 8) do={:log warning "WiFi password s random.org: $newPassword"; $myFunc} 
Он выполнит запись в лог, а потом все команды которые записаны в функции $myFunc.

Еще пример с вики:
:global myFunc do={ :return ($a + $b)}
:put [$myFunc a=6 b=2]
output:
8
Так же можно передать существующий скрипт в функцию:

#add script
 /system script add name=myScript source=":put \"Hello $myVar !\"" 

:global myFunc [:parse [/system script get myScript source]]
$myFunc myVar=world
output:
Hello world !

Обработчик ошибок.

Есть такой скрипт:
/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt";
log info 1;
Если по какой-то причине  www.random.org будет недоступен, то скрипт не продолжит работу, а завершится с ошибкой. Что-бы он продолжил работу нужно добавить обработчик:
:do {/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt"} on-error={:log warning "random.org not generator"};
log info 1;
В таком случае скрипт продолжит работу.
Еще пример с вики:
:do {
      :put [:resolve www.example.com];
} on-error={ :put "resolver failed"};
:put "lala"
output:
resolver failed
lala 
http://wiki.mikrotik.com/wiki/Manual:Scripting 

пятница, 8 мая 2015 г.

:len считаем количество символов.

:put [:len "length=8"];
 :if ($lenPass = 8) do={}

четверг, 7 мая 2015 г.

If если.

:if ($"current-vpn-ip" != $"new-vpn-ip") do={ /interface l2tp-client set [find name=$"vpn-interface-name"] connect-to=$"new-vpn-ip"}

Find поиск.

/ip f a remove [find comment=ntp];

Edit редактирование.

из терминала:
/system script edit awesome_script source

из скрипта:
/system script set awesome_script source="#### Blah\rblah blah"

Print выводит значения (в терминал или в файл).

in et  print

Set присваивает значение.

/system ntp client set primary-ntp=[:resolve "0.ua.pool.ntp.org"]; 

Enable, disable включение, отключение.

in et en ether5 

Remove удаление.

/ip f a remove [find comment=ntp];

Add создает значение.

/ip f a a list=ntp address=$pntp comment=ntp; 

Get присвает значение переменной.

:local "pntp" [system ntp client get primary-ntp]