Библиотека функций для MikroTik RouterOS
Вот совсем не давно посетила меня одна мысль, а почему бы мне не сделать что то на подобии Edelweiss только для MikroTik’а? Раз уж JS Edelweiss я не описываю #ибоЛень так как достаточно большая она и времени затянет много, а тут можно начать так сказать с чистого листа и постепенно всё описать… Собственно начинаем!
Русскоязычный онлайн-курс по MikroTik от нашего коллеги Дмитрия Скромнова. Здесь можно изучить MikroTik и RouterOS самостоятельно по курсу «Настройка оборудования MikroTik». Курс основан на официальной программе MTCNA, но содержит больше информации. Это 162 видеоурока и большая практическая задача, разбитая на 45 лабораторных работ. Время на изучение неограниченно – все материалы передаются бессрочно и их можно пересматривать сколько нужно. Первые 25 уроков можно посмотреть бесплатно, оставив заявку на странице курса.
Суть задачи
В ряде скриптов у меня стали участвовать одни и те же функции, такие как работа со временем, озвучка действий и тд. Тут значит возникает идея, а почему бы не вынести их в :global ? Помучившись пару часов на тему единого массива с функциями, я пришёл к неутешительному выводу, что RouterOS так не умеет и жить всем функциям отдельными переменными. Смирившись с сей траблой я поставил пару экспериментов и начал собирать скрипт. Эту статью я буду пополнять по мере создания функций и уровню их полезности на мой взгляд. В случае если у кого-то возникнут предложения или коррективы по данному вопросу, буду рад участию. Далее следует набор функций, в формате «как есть».
Edelweiss на GitHub
Для того чтобы воспользоваться функциями библиотеки не только из консоли но и в других скриптах, необходимо добавить в эти скрипты глобальные переменные библиотеки. Как только переменные добавлены, функции становятся доступными для скрипта локально.
# Добавляем в том случае, если библиотека не стартует вместе с системой. /system script run "Edelweiss"; # Перечисляем нужные функции. Не стоит включать в каждый скрипт все функции сразу, # добавляем только те, которые будут реально использоваться. :global mlFrm; :global syNme; :global cuDte; :global beMel; :global deArp; :global deCon; :global foDte; :global ifSta; :global ifDis; :global ifRun; :global flDel; :global mkDir; :global flCre;
Часто используемые переменные
# Версия и дата её выхода. :global Edelweiss "vX.XX XX.XX.XX"; # Поле "от кого" для E-mail. :global mlFrm [/tool e-mail get from]; # Имя системы. :global syNme [/system identity get name]; # Текущие дата и время. :global cuDte do=
Звуковое оформление для скриптов
Функция отвечает за озвучку действий скриптов. На входе воспринимает три массива — частота звука (Frequency), длительность звука (Length) и длительность задержки между звуками (Delay). Данные указываются в герцах и миллисекундах.
Удаляем все ARP записи
Удаляем все соединения фаервола (аналогично предидущему)
Работа с датой и временем
Функция конвертирует дату и время формата Feb/25/2017 14:18:12 в два варианта, первый — это количество секунд со дня творения каледраля от рождества Христова и второй — вот такого вида 25-02-2017-18-43 для формирования удобоваримых имён файлов к примеру.
Состояние интерфейсов
Функция возвращает состояние активности интерфесов ( running ) заданного типа (Type). Есть два варианта использования. Первый — когда указывается номер конкретного интерфейса (Number), соответственно на выходе информация о нём. Второй — когда не указывается номер конкретного интерфейса, тогда на выходе результат всех интерфейсов этого типа. Если все активны, функция возвращает true , если хотя бы один не активен — false .
Включение/отключение интерфейсов по disabled статусу
Функция включает/отключает интерфейсы заданного типа (Type), все, либо конкретный по номеру (Number). Отслеживание состояния интерфейса происходит по статусу disabled . До изменения статуса интерфейса происходит ожидание (выполняется цикл). Переменная (Name) задаёт комментарий в лог-сообщени (имя скрипта использующего функцию).
# Применение: # $ifDis Name="Имя скрипта" Type="vrrp" Disabled="no" - Включаем все VRRP интерфейсы; # $ifDis Name="Имя скрипта" Type="pptp-out" Number=0 Disabled="no" - Включаем PPTP интерфейс номер 1; # $ifDis Name="Имя скрипта" Type="l2tp-out" Number=1 Disabled="yes" - Выключаем L2TP интерфейс номер 2; :global ifDis do=< set $Ia [/interface find type=$Type]; set $Sa ; set $Number [tonum $Number]; set $Nm [len $Ia]; do < if ([typeof $Number]="num") do=else= if ([/interface get number=($Ia->$Nm) disabled]=($Sa->$Disabled)) do= < [/interface set number=($Ia->$Nm) disabled=$Disabled]; do while ([/interface get number=($Ia->$Nm) disabled]=($Sa->$Disabled)); log info "$Name:: $Type interface $[/interface get number=($Ia->$Nm) name] disabled: $[/interface get number=($Ia->$Nm) disabled]"; beep frequency=1760 length=10ms; > > while ($Nm>0 && [typeof $Number]!="num"); >
Включение/отключение интерфейсов по running статусу
Функция включает/отключает интерфейсы заданного типа (Type), все, либо конкретный по номеру (Number). Отслеживание состояния интерфейса происходит по статусу running . До изменения статуса интерфейса происходит ожидание (выполняется цикл). Переменная (Name) задаёт комментарий в лог-сообщени (имя скрипта использующего функцию). Дополнительно для VRRP-интерфейсов учитывается состояние backup , при котором не выполняется включение интерфейса, так как если он находится в состояние backup то он уже включен.
# Применение: # $ifRun Name="Имя скрипта" Type="vrrp" Disabled="no" - Включаем все VRRP интерфейсы; # $ifRun Name="Имя скрипта" Type="pptp-out" Number=0 Disabled="no" - Включаем PPTP интерфейс номер 1; # $ifRun Name="Имя скрипта" Type="l2tp-out" Number=1 Disabled="yes" - Выключаем L2TP интерфейс номер 2; :global ifRun do=< set $Ia [/interface find type=$Type]; set $Sa ; set $Number [tonum $Number]; set $Nm [len $Ia]; do < if ([typeof $Number]="num") do=else= if ($Disabled="yes" || [/interface vrrp get number=($Ia->$Nm) backup]!=true) do= < if ([/interface get number=($Ia->$Nm) running]=($Sa->$Disabled)) do=< [/interface set number=($Ia->$Nm) disabled=$Disabled]; do while ([/interface get number=($Ia->$Nm) running]=($Sa->$Disabled)); log info "$Name:: $Type interface $[/interface get number=($Ia->$Nm) name] running: $[/interface get number=($Ia->$Nm) running]"; beep frequency=1760 length=10ms; > > > while ($Nm>0 && [typeof $Number]!="num"); >
Удаление старых файлов
Функция находит файлы по полному или частичному имени (File) путём выборки по файлам и удаляет все файлы старше указанного периода (History), указывается в секундах минутах часах или днях (s/m/h/d). Алгоритм прост: если сегодняшняя дата, минус дата создания файла, больше чем заданный период, то файл удаляется. Переменная (Name) задаёт комментарий в лог-сообщени (имя скрипта использующего функцию).
Создаёт папки в локальном хранилище при помощи FTP
Функция предназначена для создания директорий на файловом хранилище маршрутизатора. Данная функция отличается от опубликованной на официальном сайте MikroTik тем, что можно создать сразу несколько директорий, а имя пользователя и пароль задаются непосредственно при выполнении функции, а не создаются рандомно.
# Применение: # $mkDir Address="IP на котором работает FTP" User="Имя пользователя" Password="Пароль" Input="Имя создаваемой директории, строкой или массивом" Name="Имя скрипта" # Можно не указывать адрес, в этом случае будет использован первый из доступных IP на маршрутизаторе. # $mkDir User="Имя пользователя" Password="Пароль" Input="Имя создаваемой директории, строкой или массивом" Name="Имя скрипта" # $mkDir Address="172.16.0.1" User="user" Password="Passwd" Input=() Name="scriptName" :global mkDir do= < set $Nm [len $Input]; set $IP [/ip address get 1 address]; /system identity export file=id.rsc if ([typeof $Address]="nothing") do=do < if ([typeof $Input]="array") do=else= log info "$Name:: Start creating $Bn directory"; set $Pth ($Bn . "/1"); /tool fetch address=($Address) mode=ftp user=($User) password=($Password) src-path=id.rsc dst-path=($Pth) delay 3s; /file remove $Pth log info "$Name:: Done creating $Bn directory"; beep frequency=1975 length=10ms; delay 1s; > while ($Nm>0 && [typeof $Input]="array"); >
Сохраняет конфигурации
Функция создаёт файлы конфигураций (*.rsc) в указанной директории (Path) для заданных функций маршрутизатора (Input). Переменная (Name) задаёт комментарий в лог-сообщени (имя скрипта использующего функцию). Используется для создания раздельных или комплексных бекапов системы в виде скриптов. Переменную (Input) можно задать как строкой, для точечного бекапа, так и массивом, для создания индивидуальных бекапов для каждой из перечисленных в массиве функций системы.
# Применение: # $flCre Path="Диретория для записи" Input="Имя экспортируемого файла, строкой или массивом" Name="Имя скрипта" # $flCre Path="disk1/script/" Input="system script" Name=$scriptName # $flCre Path=$pathForConfigs Input=$configsArray Name=$scriptName # $flCre Path=$pathForConfigs Input=() Name="scriptName" :global flCre do= < set $Nm [len $Input]; do < if ([typeof $Input]="array") do=else= log info "$Name:: Start creating $Bn file"; execute "/$Bn export file=\"$Path$Bn\""; log info "$Name:: Done creating $Bn file"; beep frequency=1975 length=10ms; delay 100ms; > while ($Nm>0 && [typeof $Input]="array"); >
Сохраняет экспорт файлы на FTP
Функция создаёт файлы конфигураций (*.rsc) в указанной директории (Path) для заданных функций маршрутизатора (Input) на маршрутизаторе^ затем отправляет их на указанный FTP сервер. Переменная (Name) задаёт комментарий в лог-сообщени (имя скрипта использующего функцию). Используется для создания раздельных или комплексных бекапов системы в виде скриптов. Переменную (Input) можно задать как строкой, для точечного бекапа, так и массивом, для создания индивидуальных бекапов для каждой из перечисленных в массиве функций системы. В качестве отчёта функция создаёт TXT файл с датой последнего экспорта. Данная функция не хранит историю и не удаляет старые файлы на FTP сервере перезаписывая их.
Создаёт адрес листы для динамически созданных IP (dhcp-client, vpn, …)
Функция создаёт адрес листы для динамически созданных IP адресов. К таковым относятся полученные по DHCP адреса на всевозможных интерфейсах. Второй вариант использования предполагает поиск по фрагменту имени интерфейса и добавление его IP адреса в заданный адрес лист.
# Применение: # $alSet Find="Имя или фрагмент имени интерфейса(ов)" List="Название адрес листа" Name="Имя скрипта" # $alSet List="MyDynamicList" Name=$scriptName - Добавит все динамически созданные IP адреса в адрес лист "MyDynamicList" # $alSet Find="uplink" List="MyUplinkList" Name=$scriptName - Добавит адреса всех интерфейсов, имя которых содержит "uplink" в адрес лист "MyUplinkList" :global alSet do= < if ([typeof $Find]="nothing") do=< set $Ia [/ip address find dynamic]; >else=< set $Ia [/ip address find where actual-interface
Контроллер
Контроллер работы скриптов и функций. Выполняется каждые 5 секунд при наличии скриптов «Edelweiss» и «Control» а так же глобальных переменных «controlledScripts» и «controlledFunctions». Следит за работой скриптов и при аварии перезапускает их. Так же будет полезен как некий аналог штатного планировщика для работы функций построенных на базе Edelweiss.
Массив целей контроллера
Содержимое скрипта «Control». В данном примере Edelweiss будет каждые 5 секунд производить мониторинг работы скрипта «Failover» и выполнять функции «$alSet List=Dynamic» и «$alSet Find=uplink List=Uplink». Экранирование знака «$» обязательно, иначе он будет распознаваться как переменная до выполнения функции.
PS
Данна библиотека создана для упрощения использования скриптов в Router OS, их популяризации и расширения функциональности оборудования этого вендора в повседневной жизни. Все желающие присоединиться к разработке библиотеки могут присылать свои наработки и идеи мне на почту aleksov[a]set-pro.net
Узнать больше о том, как работают скрипты в MikroTik RouterOS можно у нашего коллеги Дмитрия Скромнова из русскоязычного онлайн-курса для самостоятельного изучения. Основанный на официальной программе MTCNA, зтот курс по MikroTik и RouterOS , содержит много полезной информации не вошедшей в MTCNA. Целых 162 видеоурока и большое практическое задание, разбитое на 45 лабораторных работ. Время на изучение неограниченно – все материалы передаются бессрочно и их можно пересматривать сколько нужно. Первые 25 уроков можно посмотреть бесплатно, оставив заявку на странице курса.
Библиотека функций для MikroTik RouterOS : 8 комментариевОчччень интересная мысль. Спасибо. Если не трудно, поправьте в статье в самом начале в списке объявляемых переменных вместо повторяющейся flDel последней должна быть flCre. И применение для переменной ifRun должно описывать действия с ней, а не с предыдущей ifDis. Спасибо вам огромное за то, что поделились в сети своими наработками.
Спасибо, поправил. Скоро будет ещё пара интересных функций в библиотеке.
Помучившись пару часов на тему единого массива с функциями, я пришёл к неутешительному выводу, что RouterOS так не умеет … Чей та не умеет. Умеет !
Добавить комментарий Отменить ответЭтот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.