mikrotik остановить выполнение скрипта

Полезные скрипты для MikroTik RouterOS

Перезагрузка роутера, при зигрузке CPU

Копирование и применение последней актуальной понфигурации

То есть забираем по FTP lastconfig.backup и восстанавливаемся с него. FTP пользователь должен быть настроен, желательно с ограничением доступа по IP. Обратите внимание, что к FTP подключаемся по IP-адресу локального физического интерфейса, который доступен только между роутерами.

Этот скрипт ставим в планировщик на несколько минут позже выполнения скрипта резервного копирования.

И последний скрипт — применение настроек на резервном сервере. В нем также используется МАС для идентификации роутера.

Здесь меняем имя роутера, ip-адрес LAN-интерфейса и приоритет VRRP на меньший, чтобы роутер сделать слейвом. Запуск этого скрипта нужно поставить в автозагрузку. Изменения будут происходить на резервном сервере после копирования и применения последней актуальной конфигурации.

Резервное копирование

Проверка статуса роутера и выключение интерфейса

Подключение к динамическим серверам или сервисам, на примере pptp-соединения

Проверка синтаксиса скрипта

Настройка на 2 провайдера:

Блокировка трафика по времени:

Если нужно запретить трафик по времени ночью, скажем с 22:00 до 10:00 утра:

0) Стандартный способ – использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00

1) Использовать через запрет – Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.

2) Использовать шедулер –
также создаём правило в файрволе, но не указываем конкретное время –

Источник

Писать скрипты для Mikrotik RouterOS — это просто

блокировать все TCP соединения на порт 80 по адресу example.com

блокировать все TCP соединения на порт 80 по любому адресу из списка с именем DenyThis

Текст скрипта нужно добавить в репозиторий скриптов, находящийся в разделе /system scripts.
Скрипт выполняется построчно. Каждая строка имеет следующий синтаксис:
[prefix] — «:» — для глобальных комманд, с символа «/» начинается командная строка, которая будет выполняться относительно корня конфигурации, префикс может отсутствовать, тогда командная строка выполняется относительно текущего раздела конфигурации;
[path] — путь до требуемого раздела конфигурации, по которому происходит переход перед выполнением команды;
command — непосредственно действие, выполняемое командной строкой;
[uparam] — безымянный параметр команды;
[param=[value]] — именованные параметры и их значения.

Итак, первым делом, определим параметры работы скрипта в виде переменных. Переменная объявляется командами :local и :global, соответственно получаем локальную переменную, доступную только внутри своей зоны видимости, или глобальную, которая добавляется в список переменных окружения ОС и будет доступна откуда угодно. Локальные переменные живут, пока выполняется их зона видимости, глобальные — пока мы не удалим их.

Переменная DNSList содержит массив доменов, с которым мы хотим работать. Переменная ListName содержит строку, которой будет называться полученный address-list. Переменная DNSServers — содержит массив адресов DNS-серверов, прописанных на роутере или полученных от провайдера при подключении, плюс «восьмёрки» на случай, если на роутере не используется служба DNS, который будет использоваться для получения информации о записях доменов.

В цикле «для каждого» обойдём массив доменов и отрезолвим их IP-адреса на каждом DNS-сервере на случай, если разные DNS отдают разные IP. Конструкцияслужит для отлова runtime-ошибок. Если не использовать её, то скрипт может прервётся при ошибке резолва несуществующего или ошибочного адреса.

перейдём в раздел конфигурации /ip dns cahe all. Там содержатся DNS-кэш роутера в виде таблицы Name — Type — Data — TTL. Выполним отбор по типу — нам требуются только A-записи. И результат отбора обойдём в цикле «для каждого». Это и будет главным циклом нашего скрипта.

Создадим переменные, обновляемые в каждом цикле: два флага — bNew, исключающий дублирования, match, показывающий, входит ли текущая запись кэша в наш список доменов; переменная cacheName содержит поле Name текущей записи кэша, то есть домен.

Обойдём список доменов и для каждого проверим, содержится ли в строке cacheName подстрока в виде домена из этого списка.

Если содержится, установим значение флага match в true.

В заключающем этапе если текущий адрес требует добавления (match установлен в true), то мы его добавляем в список адресов. Коментарий к добавляемой записи будет содержать домен, к которому она относится. При этом выполняем несколько проверок. Если address-list пустой, то добавляем сразу, если что-то там есть, проверяем, нет ли там уже записи с таким IP-адресом и если нет — добавляем.

Список адресов нужно периодически обновлять. Для этого в RouterOS есть диспетчер заданий. Задание можно добавить из консоли или из графического интерфейса winbox

Сценарии работы со списком адресов не ограничиваются созданием правил в фаерволе. Поэтому приведу несколько примеров. Можно выполнять в консоли, можно добавлять мышкой в winbox’е.
Чёрный список:

Статический маршрут до данных узлов

Сбор информации о клиентах

UPD: специально по просьбе turone внёс изменения в скрипт, чтобы адреса DNS-серверов брались из системы.
UPD 24.08.2016: заметил, что в новых версиях RouterOS (начиная с 6.36) появилась возможность указывать в адрес-листах DNS-имена. Так что теперь ценность данного скрипта лишь образовательная.

Источник

MikroTik`s scripts спешат на помощь

mikrotik остановить выполнение скрипта

В статье показан пример практического анализа работы DDNS клиента, интегрированного в прошивку домашнего роутера, и его интерпретация на оборудовании MikroTik. Возможности RouterOS позволяют без труда выполнить всю необходимую работу. Если кому-то придется столкнуться с такого рода задачей, то держите решение, оно позволит сберечь ваше время и нервы.

Модернизируя сетевую инфраструктуру одного из заказчиков, мы столкнулись с настоящим телеком динозавром из семейства «for home use only». На границе периметра был засунут старенький роутер Asus, основное назначение которого было выполнение роли DDNS клиента. Так получилось, что в компании давно были настроены внутренние сетевые ресурсы и с интернет провайдером заключен договор о лизинге белого динамического IP. Со временем в инфраструктуре многое поменялось, но из-за твердого не желания заказчика вмешиваться в существующие, налаженные годами процессы, настройки клиентской стороны не менялись, и Asus работал себе и работал, сообщая внешнему DDNS сервису свой текущий адрес. В этом месте вспоминается разговор у костра с одним коллегой, который поведал мне о увиденном им лично коммутаторе Cisco с uptime в целых 11 лет, хотите верьте, хотите нет. Настал черед выйти Asus-у на пенсию и уступить место оборудованию от MikroTik. В этом месте мы столкнулись с инженерной задачей, готового решения которого в интернете найдено не было. В связи с чем, было проведено небольшое исследование, которое может кому-то поможет сэкономить время.

▍Техническая часть

Протокол DDNS отвечает за автоматизированное преобразование доменного имени в динамические IP адреса. Прошивки роутеров Asus имеют функционал по настройке DDNS клиента, в котором зашиты определенные сервисы.

mikrotik остановить выполнение скрипта Настройка DDNS клиента

В первую очередь, это, конечно, сервис от самой компании Asus. Из настроек можно указать только «Имя хоста», которое и будет резолвиться в IP. У оборудования MikroTik дела с этим обстоят по-другому. Встроенный функционал работает только со своим сервером cloud.mikrotik.com и, разумеется, никакого www.asus.com в нем нет. В интернете мы не нашли описание, как выкрутиться из этой истории и все-таки списать динозавра на пенсию. Имеются материалы, касающиеся настройки сервиса No-IP, но нам они не подходят, потому что не работают. Сразу стало понятно, что в такой ситуации решением будет регулярная отправка из скрипта необходимой информации на сервера Asus посредством HTTP клиента fetch. Осталось только разобраться что, куда и как. Запишем трафик, который передает Asus. Для этого отключим работу его DDNS клиента и брандмауэра, настроим DHCP клиент на WAN порту и подключим к подготовленному MikroTik с работающим DHCP сервером.

mikrotik остановить выполнение скрипта Отключение брандмауэра для WAN порта

mikrotik остановить выполнение скрипта Настройка DHCP клиента для WAN порта

Если все сделано верно, тогда в лизинге увидим нужный нам IP.

Настраивая на MikroTik снифер, мы выбрали наиболее простой вариант /tool sniffer с сохранением дампа в память роутера:

Активируем DDNS клиент на Asus и смотрим трафик, а там все как на ладони.

mikrotik остановить выполнение скрипта
Работа DDNS клиента

Все данные у нас есть, верстаем скрипт на RouterOS, заголовки Authorization и User-Agent пропускаем для простоты:

Сервер нам выдает ошибку 401 Unauthorized, все понятно, добавляем в скрипт данные для аутентификации, как есть, в сыром виде. И DDNS сервис от Asus заработал, но уже на оборудовании MikroTik:

Не забываем скрипт засунуть в планировщик заданий:

Как видно, мы пропустили User-Agent, но лучше так не делать, мало ли ребята из Asus рассердятся и начнут блокировать наше решение (http-header-field=«User-Agent: ez-update-3.0.11b5»). Осталось разобрать заголовок Authorization. Это связка логина и пароля, закодированные в Base64. После декодирования видно, что в качестве логина используется прошитый MAC адрес WAN интерфейса.

mikrotik остановить выполнение скрипта
Декодированный заголовок Authorization

mikrotik остановить выполнение скрипта
MAC адрес WAN порта

А вот откуда берется пароль, нам выяснить не удалось. В системных логах загрузки роутера ничего подобного не упоминалось. Даже не поленились посмотреть под корпусом, ничего похоже и там не нашли. После обновления версии операционной системы он не изменился, поэтому будем считать, что она берет эту информацию откуда-то изнутри железа. Что интересно, сервер DDNS проверяет на валидность только первые 6 знаков (для шестнадцатеричного представления, разумеется) и наличие «:» после 12 знака, остальное можно опустить или изменить, но аутентификацию так не пройти.

▍Заключение

В работе технических специалистов постоянно возникают различного рода нестыковки, иногда в самых неожиданных местах. Тогда в дело вступает светлая голова, ровные руки, везение и качественное оборудование, на котором приятно работать. Немного добавим про безопасность такой вот реализации DDNS клиента. На наш взгляд, все хорошо. Чтобы злоумышленнику попытаться стравить IP адрес, ему придется ввести данные для аутентификации. Если с MAC адресом вроде как все это проще, то пароль точно не подобрать. Да и вообще на дворе 2021 год и пора давно бы отказаться от DDNS, в корпоративной среде уж точно, как-то не серьезно.

Источник

Mikrotik остановить выполнение скрипта

Бесплатный чек-лист
по настройке RouterOS
на 28 пунктов

Скрипт, таймер, остановка скрипта.

Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку «Действия до настройки роутера».
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.

День добрый, есть ли механизм остановки обработки скрипта?

Я написал скрипт автобэкапа на мейл.. но как я вижу бэкап не успевает создасться и прилетает только часть данных..а делать два шедулера не очень будет.
Спасибо.
PS гуглил, искал, не нашел.

Источник

Написание скриптов для RouterOS

РУКОВОДСТВО ПО ЯЗЫКУ СКРИПТОВ

Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

В качестве полезных данных следует привести ссылки на страницы из официальной документации:

Скриптовый язык routeros предоставляет возможность для автоматизации задач средствами исполнения определённых пользователем скриптов, связанных с какими-либо событиями.

Скрипты могут могут храниться в репозитории (хранилище) или могут быть написаны прямо в консоли. События, вызывающие исполнение скриптов генерируются системным планировщиком, утилитой мониторинга траффика и утилитой netwatch, но не ограничены только этими генераторами.

СТРУКТУРА КОМАНДЫ

Скрипты для RouterOS состоят из команд. Команды исполняются одна за одной, пока не будет достигнут конец скрипта или не возникнет ошибка во время исполнения.

Команда

Консоль использует следующий синтакс команды:

[prefix] — может принимать следующие символьные значения, «:» или «/», что определяет команду, как ICE или путь.
[path] — относительный путь к желаемому уровню меню.
command — одна из возможных встроенных команд, определённых уровнем меню.
[uparam] — безымянный параметр, кот. должен быть определён, если этого требует встроенная команда (command).
[params] — последовательность именованных параметров со значениями.

* Всё, что перечислено в квадратных скобках является необязательными составными частями команды.

Каждая команда заканчивается символом «;» или концом строки. В некоторых случаях эти символы не нужны для окончания команды. Команда внутри (), [] или <> не нуждается в таких символах.

Каждая команда внутри другой команды начинается и заканчивается квадратными скобками [] (объединение команд):

:put [/ip route get [find gateway=1.1.1.1]];

Команда может состоять из нескольких строк, объединённых специальным символом. Смотри «Объединение команд».

Команда и EOL (End of Line)

Команда — это последовательность символов, заканчивающихся EOL последовательностью. Любая из стандартных последовательностей EOL может быть использована:

— Unix = ASCII LF
— Windows = ASCII CR LF
— Mac = ASCII CR

Комментарии

Комментарий начинается с символа «#» и заканчивается последовательностью EOL. Пробел и любые другие символы не разрешены к использованию перед #. Комментарии игнорируются синтаксическим анализатором. Если символ # появится в строке, то это не будет считаться комментарием:

# хороший комментарий
# плохой комментарий
:global a; # плохой комментарий
:global myStr «лала # это не комментарий»

Объединение команд

Две или более строки могут быть объединены в одну команду, если использовать символ «\» (обратный слэш). Это не работает с комментариями и с токенами исключая строки. Примеры:

Пробелы между токенами

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

<
:local a true; :local b false;
# пробелы не нужны
:put (a&&b);
# пробелы нужны
:put (a and b);
>

Пробелы не разрешены в следующих конструкциях:

— =
— from=, to=, step=, in=, do=, else=

#неправильно
/ip route add gateway = 3.3.3.3
#правильно
/ip route add gateway=3.3.3.3

Области видимости

Переменные могут быть использованы только в определённых областях скрипта. Эти области называют областями видимости. Существует два типа областей видимости: локальная и глобальная. Переменная, объявленная внутри блока может быть использована только в его пределах после места объявления.

Глобальная область видимости, по другому корневая область, видимости является областью по умолчанию для скрипта. Она создаётся автоматически и существует всегда.

Пользователь может определить свои области видимости при помощи скобок <>. Такие области называются локальными. Пример:

<
:local a 3;
<
:local b 4;
:put ($a+$b);
>
# команда ниже некорректна, так как переменная b не определена в данной области видимости
:put ($a+$b);
>

Важное замечание: каждая команда в консоли обрабатывается в своей локальной области видимости.

Важно: не определяйте глобальные переменные внутри локальных областей видимости.

# этот код сгенерирует ошибку
<
:local a 3;
<
:global b 4;
>
:put ($a+$b);
>

ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА

Следующие слова являются зарезервированными и не могут быть использованы, как имена переменных или функций:

ОГРАНИЧИТЕЛИ

Следующие токены служат ограничителями в грамматике:

ТИПЫ ДАННЫХ

Язык имеет следующие типы данных:

— num — 64 битное знаковое целое. может быть инициализировано шестнадцатиричным значением
— bool — булев тип. может быть true или false
— str — строковый тип. последовательность символов
— ip — IP адрес
— ip6-prefix — IPv6 префикс
— id — шестнадцатиричное значение с префиксом *. Каждая позиция меню имеет уникальный внутрений ID
— time — дата и время
— array — последовательность значений, массив
— nil — тип переменной по умолчанию, если она не инициализирована никаким значением

Escape последовательности

Следующие последовательности могут быть использованы для помещения спецсимволов в строки:

\» — двойные кавычки
\\ — обратный слэш
\n — символ конца строки
\r — return
\t — горизонтальная табуляция
\$ — знак доллара
\? — знак вопроса. спецназначение этого символа — выводить справку меню
\_ — пробел
\a — звуковой сигнал терминала BEL (0x07)
\b — бэкспейс
\f — form feed (0xFF)
\v — вертикальная табуляция
\xx — шестнадцатиричный код символа

ОПЕРАТОРЫ

Арифметические операторы

+ бинарное сложение
— бинарное вычитание
* бинарное умножение
/ бинарное деление
— унарное отрицание

Операторы сравнения

больше
= равно
= больше или равно
!= не равно

Логические операторы

Битовые операторы

Применимы к числовому типу и типу IP address.

Инверсия
^ XOR
> сдвиг вправо

Примеры. Вычисление адреса подсети по IP адресу и маске

<
:local IP 192.168.88.77;
:local CIDRnetmask 255.255.255.0;
:put ($IP&$CIDRnetmask);
>

Получение последних 8 бит IP адреса

Вычисление широковещательного адреса

<
:local IP 192.168.88.77;
:local Network 192.168.88.0;
:local CIDRnetmask 255.255.255.0;
:local InvertedCIDR (

Операторы конкатенации

Также возможно добавлять значения переменных в строки без конкатенации

Другие операторы

[] Использование команды в команде
() Группировка выражений
$ Унарный оператор подстановки. доступ к значению переменной

Бинарный оператор, сравнивающий значение с POSIX регулярным выражением
-> Получение элемента массива по ключу

Пример с регулярными выражениями

# печатаем все маршруты со шлюзом, у которого адрес заканчивается на 202
/ip route print where gateway

[admin@x86] >:global aaa
[admin@x86] > :put ($aaa->»a»)
1
[admin@x86] > :put ($aaa->»b»)
2

ПЕРЕМЕННЫЕ

Язык допускает два типа переменных, глобальные и локальные.

global — доступно из всех скриптов, созданных текущим пользователем.
local — доступно только внутри текущей области видимости.

Замечание: значение переменной ограничено 4096 байтами.

Каждая переменная, исключая встроенные, должна быть объявлена перед использованием при помощи зарезервированных слов global или local.

Исключая случай, когда используется множество (set) переменных. Пример

/system script
add name=myLeaseScript policy=\
ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api \
source=»:log info \$leaseActIP\r\
\n:log info \$leaseActMAC\r\
\n:log info \$leaseServerName\r\
\n:log info \$leaseBound»
/ip dhcp-server set myServer lease-script=myLeaseScript

Допустимыми символами для составления имён переменных являются буквы и цифры. Если имя содержит любые другие символы, то его нужно помещать в двойные кавычки «».

# корректно
:local myVar;
# некорректно
:local my-var;
# корректно
:global «my-var»;

Если переменная объявлена, но не инициализирована, то ей назначается тип nil. Иначе тип определяется автоматически. Иногда необходимо преобразовать переменную из одного типа в другой. Это можно сделать при помощи специальных команд.

Имена переменных чувствительны к регистру. Команда set без значения удаляет переменную из окружения.

:global myVar «myValue»
:set myVar;

ВСТРОЕННЫЕ КОМАНДЫ

Навигация и справка

1) / — переход в корень меню

Команды общего назначения

Любая встроенная команда начинается с символа «:», иначе она будет воспринята, как переменная.

1) global — определение глобальной переменной

2) local — определение локальной переменной

3) beep — звуковой сингнал из встроенного спикера

Пример:
:beep frequency=320 length=100ms;

4) delay — задержка заданный период времени

5) put — вывод в консоль

6) len — печать длины переданой последовательности (массива или строки)

Пример:
:put [:len «length=8»];

7) typeof — определение типа переменной

Пример:
:put [:typeof 4];

8) pick — вернуть подпоследовательность массива или строки. если неопределено, то вернёт элемент из позиции

Пример:
:put [:pick «abcde» 1 3]

9) log — запись в системный лог. topic=

Пример:
:log info «Hello from script»;

10) time — определить время, необходимое для выполнения команды

11) set — присвоить значение переменной

Пример:
:global a; :set a true;

12) find — вернуть позицию искомого в строке или массиве

13) environment — печать информации об инициализированных переменных

Синтаксис:
:environment print

Пример:
:global myVar true; :environment print;

15) error — сгенерировать ошибку в консоль и остановить выполнение

16) execute — выполнение скрипта в фоне

17) parse — парсинг текста в набор команд для исполнения. можно использовать для определения функций

Пример:
:global myFunc [:parse «:put hello!»];
$myFunc;

18) resolve — разрешение имени в IP адрес

Пример:
:put [:resolve «www.mikrotik.com»];

* Команды преобразования типов *

1) toarray
2) tobool
3) toid
4) toip
5) toip6
6) tonum
7) tostr
8) totime

Команды, специфичные для меню

Следующие команды доступны в большинстве подменю и не требуют использования символа «:»

1) add — добавить запись
Синтаксис:
add

2) remove — удалить запись
Синтаксис:
remove

3) enable — активировать запись
Синтаксис:
enable

4) disable — дизактивировать запись
Синтаксис:
disable

5) set — изменение параметров записи с заданным ID
Синтаксис:
set

Пример:
/system script get myScript source

7) print — печать записей. вывод зависит от параметров
Синтаксис:
print

8) export — сохранить записи в файл в виде скрипта, если файл указан. иначе вывести записи в окно терминала
Синтаксис:
export [file= ]

9) edit — редактирование выделеной записи во встроеном текстовом редакторе
Синтаксис:
edit

10) find — вернуть список ID записей, которые совпадают с expression.
Синтаксис:
find

Пример:
:put [/interface find name

Возможный вывод:
*1;*2;*3;*4

Импорт

Команда import доступна из корневого меню и используется для импорта конфигураций из файлов, созданных командой export или вручную.

Параметры команды print

append —
as-value — вернуть, как массив параметров и их значений ( :put [/ip address print as-value] )
brief — печать в сокращённом табличном виде
advanced —
detail — детальная печать, отображает все параметры
count-only — печатать количество записей, а не сами записи
file — перенаправить печать в файл
follow — печать текущих записей и слежение за появлением новых записей, пока не будет нажата комбинация ctrl+c ( /log print follow )
follow-only — печать и слежение только за новыми записями. выход также по ctrl+c
from — печатать параметры только указанной записи ( /user print from=admin )
interval — непрерывно печатать через определённые интервалы времени
terse — отобразить в компактном, удобном для программной обработки виде
value-list — отобразить параметры и значения по одному на линии. удобно для парсинга
without-paging — печать информации без разбиения на части
where — фильтр по значению какого-либо параметра

Одновременно можно использовать несколько параметров. Пример:

# печатать текущее количество маршрутов через интерфейс ether1 каждую секунду
/ip route print count-only interval=1 where interface=»ether1″

ЦИКЛЫ И ВЕТВЛЕНИЯ

Циклы

:for from= to= step= do=

ФУНКЦИИ

Язык не позволяет создавать функции напрямую, однако можно использовать команду :parse, как обходной способ для создания функций. Начиная с версии 6.2 добавлен новый синтаксис, позволяющий определять функции и передавать им параметры. Также возможно возвращать значение из функции при помощи команды :return. Пример:

# создание и выполнение простой функции
:global myFunc do=<:put "hello from function">
$myFunc

Вывод:
hello from function

# передача аргументов в функцию
:global myFunc do= <:put "arg a=$a"; :put "arg '1'=$1">
$myFunc a=»this is arg a value» «this is arg1 value»

Вывод:
arg a=this is arg a value
arg ‘1’=this is arg1 value

Из примера видно, что существуют два способа передачи аргументов в функцию:

— передача по имени
— передача по порядковому номеру

Пример использования :return

Также возможно копирование существующего скрипта из окружения и использование его, как функции. Пример:

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

Внимание: если функция содержит глобально определённую переменную с именем совпадающим с именем передаваемого параметра, то глобально определённая переменная будет проигнорирована, для совместимости со старыми версиями. Эта возможность может быть изменена в будущих версиях. Избегайте использование параметров с теми же именами, что и глобальные переменные. Пример:

Вывод:
1234
lala
global value 123

Чтобы вызвать функцию внутри другой функции, её имя должно быть определено.

:global funcA do=< :return 5 >
:global funcB do= <
:global funcA;
:return ([$funcA] + 4)
>
:put [$funcB]

ПЕРЕХВАТ И ОБРАБОТКА ОШИБОК ВО ВРЕМЯ ИСПОЛНЕНИЯ

Начиная с версии 6.2 скрипты могут перехватывать ошибки, возникающие во время выполнения. Рассмотрим следующий скрипт:

Мы хотим перехватить эту ошибку и обработать её:

Вывод:
resolver failed
lala

ОПЕРАЦИИ С МАССИВАМИ

Внимание: Если имя ключа содержит символы, отличающиеся от латинских в нижнем регистре, то такое имя нужно заключать в двойные кавычки. Пример:

Конструкция foreach может быть использована для циклического прохода элементам массива.

Если элементы массива имеют ключевую часть, то они сортируются в алфавитном порядке (alphabetical order) по ключу. Элементы без ключевой части распологаются до элементов с ключевой частью и их порядок остаётся неизменным.

Если конструкиця foreach используется с одним аргументом, то возвращаются значения элементов.

Пример изменеия значения элемента массива:

:global a
:set ($a->»x») 5
:environment print

РЕПОЗИТОРИЙ (ХРАНИЛИЩЕ) СКРИПТОВ

Уровень меню: /system script

Содержит скрипты, созданные пользователями. Скрипты могут быть выполнены в следующих случаях:

— по событию
— один скрипт вызывает другой скрипт
— запуск вручную

— comment (тип: string, значение по умолчанию: «») — комментарий, облегчающий понимание, что делает скрипт
— name (тип: string, значение по умолчанию: «Script[num]») — уникальное имя
— policy (тип: string, значение по умолчанию: «») — список применяемых политик

* api — разрешает использование API
* ftp — разрешает удалённый доступ по ftp, передачу файлов на и с роутера
* local — разрешает локальный вход через консоль
* password — разрешает смену паролей
* policy — управление пользователями, добавление/удаление
* read — разрешение чтения конфигурации
* reboot — разрешение на перезагрузку
* sensitive — просмотр паролей и прочей информации
* sniff — разрешение использовать sniffer, torch и тд
* ssh — разрешение на удалённый логин по ssh
* telnet — разрешение на удалённый логин по telnet
* test — разрешение использовать ping, traceroute, bandwidth test
* web — разрешение на удалённый логин по http
* winbox — разрешает использование winbox
* write — разрешение изменения конфигурации

— source (тип: string, значение по умолчанию: «») — код скрипта

Параметры состояния, доступные только для чтения:

— last-started (тип: date) — дата и время последнего запуска
— owner (тип: string) — владелец скрипта
— run-count (тип: integer) — количство запусков

Окружение

Уровень меню: /system script environment или /environment

Содержит все переменные, определённые пользователем и их значения. Пример:

[admin@MikroTik] > :global example;
[admin@MikroTik] > :set example 123
[admin@MikroTik] > /environment print

Параметры только для чтения:

* name (тип: string)
* user (тип: string)
* value

Список выполняющихся скриптов

Уровень меню: /system script job

Содержит список всех скриптов, выполняющихся в данный момент.

Параметры только для чтения:

* owner (тип: string)
* policy (тип: array)
* started (тип: date)

ПРАКТИКА

Задача: базовая настройка домашнего или офисного маршрутизатора на базе hAp lite.

Решение:
Данное решение предполагает, что провайдер даёт доступ в интернет через PPPoE. Настройку других способов подключения можно почитать в статье на хабре (https://habrahabr.ru/post/265387/). Основа для скрипта была взята из репозитория (https://github.com/jadiaz/MikroTik).

# Set the name of the router and its SSID
:local systemName «»

# Set the password you would like to use when logging on as ‘admin’.
:local adminPassword «»

# Time Servers (NTP)
:local ntpA «173.230.149.23»
:local ntpB «198.110.48.12»

# DHCP
:local dhcpServer «dhcp-local-server»
:local lanPoolName «dhcp-local-pool»
:local poolStart «192.168.20.100»
:local poolEnd «192.168.20.200»

# Addresses
:local lanAddress «192.168.20.1»
:local lanNetworkAddress «192.168.20.0»
:local lanNetworkBits «24»

# Interfaces
:local ether1 «ether1-wan»
:local ether2 «ether2-slave-lan»
:local ether3 «ether3-slave-lan»
:local ether4 «ether4-master-lan»

:local tap1 «tap1-gateway»
:local tap1Login «»
:local tap1Password «»

:local br1 «br1-local»

# wpa/wpa2 pre-shared key
:local wpaPreSharedKey «»

/ip upnp set enabled=no;

/interface bridge add name=$br1
/interface bridge port add interface=$ether4 bridge=$br1
/interface bridge port add interface=wlan1 bridge=$br1

/ip firewall filter <
add action=accept chain=input protocol=icmp
add action=accept chain=input connection-state=new dst-port=8291,22 in-interface=$br1 protocol=tcp src-address=»$lanNetworkAddress/$lanNetworkBits»
add action=accept chain=input connection-state=new dst-port=53,123 protocol=udp src-address=»$lanNetworkAddress/$lanNetworkBits»
add action=accept chain=input connection-state=established,related comment=»Allow established connections»

add action=accept chain=output connection-state=!invalid

add action=accept chain=forward connection-state=established,new in-interface=$br1 out-interface=$tap1 src-address=»$lanNetworkAddress/$lanNetworkBits»
add action=accept chain=forward connection-state=established,related in-interface=$tap1 out-interface=$br1

add action=drop chain=input
add action=drop chain=output
add action=drop chain=forward
>

/ip firewall nat <
add action=masquerade chain=srcnat out-interface=$tap1 src-address=»$lanNetworkAddress/$lanNetworkBits»;
>

:log info «Auto configuration ended.»;

Настройка и выполнение

* /system reset-configuration no-defaults=yes skip-backup=yes run-after-reset=

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *