Мы уже рассматривали ранее пример скрипта уменьшения скорости для Mikrotik Router OS. Но тогда мы разбирали такой вариант, в котором все названия шейпера различаются только цифрами в конце имени.
Рис.1. Mikrotik Router OS, список правил шейпера с похожими названиями.
В этом случае при помощи цикла for мы можем создать все имена шейпера, добавляя к слову queue цифры.
Рис.2. Mikrotik Router OS, список правил шейпера с разными названиями.
А что делать, когда у правил шейпера абсолютно разные названия и они не имеют ничего общего друг с другом? В этом случае мы сможем пройтись по правилам шейпера в цикле for, используя порядковый номер правила.
Приступим к написанию скрипта.
Скрипт выглядит следующим образом:
:local alltraf;
:local totaltraf;
:local namerule;
:local upload;
:local download;
:local allrules ([/queue simple print count-only] -1);
:for y from=0 to=$allrules do={:set alltraf [/que s get number=$y byte]; :set namerule [/que s get number=$y name]; :set upload [:pick $alltraf 0 ([:find $alltraf "/"]-1)]; :set download [:pick $alltraf ([:find $alltraf "/"]+1) [:len $alltraf]]; :set totaltraf (($upload + $download) / 1048576); :put $totaltraf; :if ($totaltraf >= 5000 ) do={ /queue simple set [find name="$namerule"] max-limit="5M/5M"}}
Разбираем скрипт.
Объявляем переменные, которые понадобяться для работы скрипта:
:local namerule; - название шейпера, с которым взаимодействует скрипт в данный момент;
:local alltraf; - извлеченные данные о трафике в правиле;
:local upload; - исходящий трафик;
:local download; - входящий трафик;
:local totaltraf; - общий трафик.
При помощи print count-only подсчитываем количество правил шейпера. Потом отнимаем единицу (поскольку отсчёт начинается с нуля) и заносим в переменную allrules:
:local allrules ([/queue simple print count-only] -1);
Выполняем цикл for, который будет перебирать правила от нуля до значения указанного в переменной $allrules.
:for y from=0 to=$allrules do={}
Заносим информацию об общем трафике в переменную alltraf:
:set alltraf [/que s get number=$y byte];
Рис.3. Извлечённые данные о трафике.
Заносим в переменную namerule имя правила, с которым в данный момент работает скрипт:
:set namerule [/que s get number=$y name];
С помощью функции pick извлекаем исходящий и входящий трафик и заносим эти данные в переменные upload и download:
:set upload [:pick $alltraf 0 ([:find $alltraf "/"]-1)]; :set download [:pick $alltraf ([:find $alltraf "/"]+1) [:len $alltraf]];
Складываем данные о входящем и исходящем трафике и переводим их в мегабайты:
:set totaltraf (($upload + $download) / 1048576)
Выполняем проверку: если общий трафик в данном правиле превышает 5000, то уменьшаем значение скорости до 5 Мбит/c.
:if ($totaltraf >= 5000 ) do={ /queue simple set [find name="$namerule"] max-limit="5M/5M"}}
Евгений Рудченко специально для ASP24.



