переменные в скриптах mikrotik

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

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

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

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

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

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

Команда

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

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

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

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

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.4 ТИПЫ ДАННЫХ

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

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

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

1.5 ОПЕРАТОРЫ

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

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

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

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

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

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

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

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

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

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

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

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

1.6 ПЕРЕМЕННЫЕ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Писать скрипты для 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

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

Присвоение значения переменной в скрипте

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

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

Что-то запутался с переменным, есть кусок скрипта:

Сейчас он работает, но до этого переменная была local, в результате присваивание внутри условия было, а как только выходили за границы условия, то переменная currentIP как бы очищалась. Просто для меня local было что это в рамках одного модуля (скрипта), а получается что нет.

Не понял
local временная переменная которая создается на время выполнения скрипта и в конкретной сессии

global глобальная переменная значение в которой хранится до первой перезагрузки и доступна она из любого скрипта

Вот в том то и дело, что я тоже так думал.

Если делаю:
:local currentIP

Или я не правильно присваиваю или лыжи не едут.

Источник

Mikrotik скрипты. Введение.

Mikrotik router OS установлена на Mikrotik RouteBoard RB493AH, Mikrotik RouterBoard 1100, Mikrotik RouterBoard 433AH, Mikrotik RouterBoard RB/450g и с ее помощью решаются вопросы с маршрутизацией и организацией доступа в локальных вычислительных сетях.

Несмотря на все преимущества Router OS (простота настройки, надежность), при каких-то нестандартных ситуациях без вмешательства администратора не обойтись.

Но в Mikrotik Router OS есть способ решения и этих вопросов. В Mikrotik router OS можно писать собственные скрипты, которые смогут выполнять необходимые действия в зависимости от ситуации в отсутствии администратора.

Начнем с простого, с переменных. В Mikrotik router OS существует два вида переменных global и local:

глобальные – доступные из всех существующих сценариев пользователей, определенных глобальных ключевых слов;

Создаем локальную переменную в Mikrotik router OS.

переменные в скриптах mikrotik. create local. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-create local. картинка переменные в скриптах mikrotik. картинка create local. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.1. Создаем локальную переменную в Mikrotik router OS.

:local var;

local – тип переменной,

var – имя переменной.

Теперь создадим глобальную переменную.

переменные в скриптах mikrotik. create global. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-create global. картинка переменные в скриптах mikrotik. картинка create global. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.2. Создаем глобальную переменную в Mikrotik router OS.

Здесь тоже все просто:

:global var;

global – тип переменной,

var – имя переменной.

Переменные созданы, но у них нет значений, они пустые. Чтобы в этом убедиться, выведем их значение.

Выведем глобальную переменную.

переменные в скриптах mikrotik. put global. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-put global. картинка переменные в скриптах mikrotik. картинка put global. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.3. Вывод глобальной переменной в Mikrotik router OS.

put – выводит значение переменной,

gvar – имя переменной.

Как мы видим, вывелась пустая строка.

Сейчас попробуем вывести локальную переменную.

переменные в скриптах mikrotik. put local. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-put local. картинка переменные в скриптах mikrotik. картинка put local. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.4. Вывод локальной переменной в Mikrotik router OS.

Как видно, попытка вывода локальной переменной выдала ошибку, потому что, как нам известно, локальные переменные доступны только в той области, где они были созданы. То есть работа с локальными переменными должна выглядеть так:

Перейдем к присвоению значений переменным. Переменные могут быть как числовые, так и текстовые. Поэтому для примера создадим две переменных. Переменную $cifra с числовым значением и переменную $text с текстовым.

переменные в скриптах mikrotik. create two. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-create two. картинка переменные в скриптах mikrotik. картинка create two. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.5. Создаем две переменных со значениями в Mikrotik router OS.

Здесь создание переменных происходит так же, как и в примере выше, но с одним отличием – в кавычках указывается значение переменных.

Для переменной $cifra задали значение 222, для $text – asp24.com.ua – это доменное имя магазина, который продает сетевое оборудование (Mikrotik RouteBoard RB493AH, Mikrotik RouterBoard 1100, Mikrotik RouterBoard 433A) с коим и можно будет применить написанные скрипты.

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

переменные в скриптах mikrotik. put two. переменные в скриптах mikrotik фото. переменные в скриптах mikrotik-put two. картинка переменные в скриптах mikrotik. картинка put two. Это руководство является введением в мощный встроенный язык скриптов для RouterOS.

Рис.6. Выводим значение двух переменных в Mikrotik router OS.

Вот теперь выводятся значения переменных. Теперь можно совершать над ними какие-то действия.

Источник

Исследование переменных Mikrotik. Скрипт обновления Dynamic DNS записей FreeDNS.afraid.org

Я использую Mikrotik в качестве домашнего и офисного маршрутизатора, и в целом система очень нравится. RouterOS имеет широкие возможности, которые покрывают 90% моих задач, если чего-то недостает, то можно «дописать» функционал с помощью внутренних скриптов. Но когда начинаешь писать более-менее вменяемый скрипт или пытаешься понять и применить чужой рецепт, становятся заметны очертания подводной части айсберга, всплывают странные особенности языка.

Я провел небольшое исследование переменных в скриптах Mikrotik, рассмотрел под лупой объявление и инициализацию.
Получилась, на мой взгляд, достойная тема для написания статьи. Итак, приступим.

Что же нам говорит Manual:Scripting о переменных в скриптах? А говорит он нам, что переменные бывают двух областей видимости: локальные и глобальные, что объявляются они командами —

Предлагаю сразу сосредоточиться на global переменных, так как их легче исследовать за счет их лучшей «наблюдаемости», а большинство выводов, думаю, можно спокойно перенести и на local.

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

Manual:Scripting говорит нам, что есть около десятка типов, из которых мы рассмотрим только некоторые, важные для понимания переменных. Итак, явные и логичные типы: числовой num, строковый str и массив array. Далее упоминается тип (оно же — значение переменной) nil, про который написано, что он будет у переменной по умолчанию, если ей ничего не присвоено. Поверим.

Если поработать с командной консолью в WinBox, можно заметить, что есть еще одно странное ключевое слово nothing, которое непонятно что означает, какое-то «ничего».

Ну и где тут nil? Зато полно nothing.

Исследование nil

В общем, чтобы разобраться с этими особыми типами и значениями, применим системный подход, проанализируем выдачу однотипных запросов, но с разными наборами исходных данных. А исходными данными у нас будут в начале разные «странные» константы и выражения. В результате получается такая таблица:

Что это?:if ( = ) do= <:put TRUE>else=

:put [:typeof ]:put [:typeof [ ] ]:put [:len ]:put [:len [ ] ]
1Nothing в командной обертке[] / [:nothing] / или даже так [:][]TRUEnilnil00
2Пустая строка«»«» / <>TRUEstrexpected command name00
3Nothing внутри выражения(:nothing) / или даже так (:)[] / «» / <>FALSEnothingnil00
4Массив из nothing <:nothing>/

<> / «»TRUEarraynil11
5Элемент массива nothing(<:nothing>->0)[] / «» / <>FALSEnothingnil00

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

Строка 1: все варианты записи поля value синонимичны! В будущем я предлагаю использовать лаконичное []. Повторюсь, что квадратные скобки обозначают встраивание результата команды в общее выражение. Как видите, это один из способов «генерации» nil не в чистом виде, а как результат пустой команды в квадратных скобках, который как раз равен nil.

Строка 2:
Тут все просто. Пустая строка вполне очевидная вещь. Единственные момент, что она оказывается равна массиву из ничего, но предлагаю не обращать на это особого внимание. И нельзя использовать пустую строку как команду в квадратных скобках, это единственное место, где терминал не проглотил синтаксис по исходным данным таблицы, логично.

Строка 3:
Круглые скобки несут в себе выражение, внутри можно тоже поместить nothing, и результат от такого выражения тоже будет nothing, по сути это почти чистый nothing. Видно, что тип результата выражения (:nothing) дает nothing, а тип от обертки из командных скобок [] дает nil, по аналогии со строкой 1. Вообще после повторного осмысления написанного, я понял что это спекуляция, т.к. внутрь () можно поместить что угодно, любой бессмысленный набор символов, главное, что результат (. ) дает nothing.

Строка 4:
Массив, который содержит ничего, на самом деле содержит 1 элемент. Тип, как и ожидалось, array, тип результата командной обертки также дает nil

Строка 5:
Добираемся до элемента массива из ничего, прослеживается полная аналогия выдачи со строкой 3. В общем такой элемент — это тоже чистое nothing.

Какие общие выводы можно сделать из этого странного brainfuck-а. nothing действительно существует, им можно оперировать, редкие выражения могут его возвращать, но команды в [] никогда не возвращают nothing, а только nil. Другой более важный вывод, что оператор длины значения или кол-ва элементов массива :len ведет себя очень стабильно и генерирует предсказуемый результат, поэтому его я могу однозначно рекомендовать для использования в скриптах, когда требуется проверка возвращаемых выражениями и командами значений. И что [] = [:nothing] = nil.

Таблица дает представление о том, что могут возвращать различные команды и выражения языка Mikrotik.

Исследование объявлений переменных

Теперь перейдем к более практическому объявлению переменных.

Что это?Объявление:put:if ( = ) do= <:put TRUE>else=

:put [:typeof ]:put [:typeof [ ] ]:put [:len ] оно же :put [:len [ ] ]/environment print
1Без присвоения:global var1$var1[] / (:)FALSE / TRUEnothingnil0var1=[:nothing]
2Присвоение, удаляющее переменную:global var2 (:nothing)$var2(:)TRUEnothingnil0
3Присвоение nil:global var3 []$var3[]TRUEnilnil0var3=[]
4Присвоение пустой строки:global var4 «»$var4«» / <>TRUE / TRUEstrstr0var4=»»
5 (3)Странный nil, аналог 3:global var5 [<>]$var5[<>] / []TRUE / TRUEnilnil0var5=[]
6Массив из nothing:global var6

$var6«» / <"">/ <>TRUE / TRUE / TRUEarrayarray1var6=
7 (6, 8)Массив из пустой строки:global var7

$var7«» / <"">/ <>TRUE / TRUE / TRUEarrayarray1var7=
8 (6, 7)Массив из nil:global var8

$var8«» / <"">/ <>TRUE / TRUE / TRUEarrayarray1var8=
Что это?Объявление:put:if ( = ) do= <:put TRUE>else=

:put [:typeof ]:put [:typeof [ ] ]:put [:len ] оно же :put [:len [ ] ]/environment print
9Присвоение числа:global var9 123$var9н./и.123н./п.numnum3var9=123
10Присвоение строки:global var10 «987»$var10н./и.987н./п.strstr3var10=»987″
11Массив из одного числа:global var11 <555>/ :global var11

$var11н./и.555н./п.arrayarray1var11=
12Массив разнородных элементов:global var12

$var12н./и.33;test123н./п.arrayarray2var12=
13Элемент массива-//-($var12->0)н./и.33н./п.numnum2-//-
14Элемент массива-//-($var12->1)н./и.test123н./п.strstr7-//-
15Массив c nothing элементом:global var13

$var13н./и.33;н./п.arrayarray2var13=
16Элемент массива-//-($var13->0)н./и.33н./п.numnum2-//-
17Элемент массива-//-($var13->1)н./и.н./п.nothingnil0-//-
18Массив c nil элементом:global var14

$var14н./и.1012;н./п.arrayarray2var14=
19Элемент массива-//-($var14->1)н./и.н./п.nilnil0-//-

н./и. — не используется; н./п. — не применимо

Построчные комментарии к таблице:

1. Переменная создана, но ей ничего не присвоено. Переменная как бы содержит nothing.
2. Если переменной присвоить такое выражение, то это приведет к удалению глобальной переменной из переменных окружения.
3. Стандартный способ создания пустых переменных. Переменная содержит nil.
4. Присвоение пустой строки. Тут все очевидно.
5. Получается, что такое выражение аналогично [] простому присвоению nil, как в 3. Думаю, это потому, что внутри [] несуществующая команда и результат этой команды дает nil
6, 7, 8. Присвоение фигурных скобок делает из переменной массив, хоть и пустой. Обратите внимание, что записи имеют одинаковые результаты в таблице, но это не касается свойств элементов этих массивов. Свойства элементов массивов рассмотрены ниже.
9, 10. Простые типы данных. Все довольно очевидно.
11. Массив из одного элемента, обратите внимание, что <555;>по результатам равно <555>
12, 13, 14. В массив могут входить элементы разных типов данных. Исследование свойств элементов массива дает предсказуемые результаты.
15, 16, 17. Один из элементов массива nothing. Элементы массива обладают теми же свойствами, что и просто переменные и константы данных типов и значений. Прослеживается аналогия с пунктом 2.
18, 19. Прослеживается аналогия с пунктом 3.

Исследование, на мой взгляд, получилось немного спорным, но я очень надеюсь, оно внесет больше порядка в ваше понимание Mikrotik, чем хаоса. В качестве дополнительной компенсации публикую скрипт для работы с динамическим DNS замечательного сервиса FreeDNS.afraid.org.

Скрипт для FreeDNS.afraid.org

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

За основу я взял скрипт от LESHIYODESSA. Мне не очень понравился его алгоритм, в котором использовался файл для хранения текущих адресов записей Dynamic DNS и производился его периодический парсинг, кроме того, скрипт не поддерживает обновление разных записей, для этого предлагается размножить скрипт, но это не снимает проблему обновления записи по заданному IP-адресу. Поэтому фактически я написал свой собственный скрипт, в котором заменил работу с файлами на более надежный механизм периодического обновления (с часовым интервалом) и форсированное обновление по изменению отслеживаемых IP-адресов интерфейсов, полученных по DHCP, независимое для нескольких записей.

Объявляем массивы имен субдоменов FreeDNS.afraid.org и их хешей, имен WAN-инетфейсов, у которых мы будем отслеживать IP-адреса. А также задаем кол-во записей (Quant) по размеру массива либо вручную:

Объявляем вспомогательные переменные:

SkipCounters — массив счетчиков проверок отслеживаемых интерфейсов
LastIPs — массив IP-адресов, которые уже были отправлены в FreeDNS.

Массив счетчиков позволит обновлять Dynamic DNS записи независимо друг от друга.

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

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

Ни и собственно сам алгоритм отслеживания-обновления.

Получаем текущий IP-адрес из dhcp-client. Дальше самое интересное.

Команда [/ip dhcp-client get [find where interface=($WANInterfaces->$i)] address] в общем случае может вернуть что угодно кроме строки, содержащей IP-адрес, поэтому она в норме обновит значение переменной CurrentIP. Возвращаемым значением может быть либо строка с IP, либо nil, или будет ошибка выполнения и команда не обновит CurrentIP. Поэтому я строкой выше ввожу явное объявление :local CurrentIP «». И после выполнения команды в CurrentIP будет либо «», либо nil, либо IP-адрес.

На что еще стоит обратить внимание. В URL запроса на обновление присутствует параметр «&address=».$CurrentIP, этот параметр позволяет явно указать IP-адрес для субдомена вместо автоматического (по интерфейсу с которого ушел запрос).

Источник

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

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