:local BLdebug false;
# На всякий случай пингуем
ya.ru:local pingresultA [/ping
ya.ru count=2];
:if ($BLdebug = true) do={
:log info (" --------- START BAN SCRIPT");
:log warning ("
ya.ru пингуется (прошло $pingresultA из 2)");
}
# Если файл BlackList.txt существует
:if ([/file get [/file find name=BlackList.txt] size] > 0) do={
:if ($BLdebug = true) do={
:log info ("Файл BlackList.txt существует");
}
# Получаем содержимое файла в переменную
:local content [/file get [/file find name="BlackList.txt"] contents];
:if ($BLdebug = true) do={
:log info ("В файле:\n$content");
}
# Получаем длину переменной
:local contentLen [:len $content];
:local lineEnd 0;
:local line "";
:local lastEnd 0;
:do {
# Находим первый перевод строки
:set lineEnd [:find $content "\n" $lastEnd];
# Получаем текст с последнего перевода строки до нового перевода строки (без символа перевода строки)
:set line [:pick $content $lastEnd ($lineEnd -1)];
# Запоминаем последнюю позицию перевода строки
:set lastEnd ($lineEnd +1);
:if ($BLdebug = true) do={
:log info ("Прочли строку: $line");
}
# Если строка не закомментирована
:if ([:pick $line 0 1] != "#") do={
:if ($BLdebug = true) do={
:log info ("Строка не закоментирована: $line");
}
:local entry [:pick $line 0 $lineEnd]
# Если строка не пустая вгоняем содержимое в массив
:if ([:len $entry] > 0) do={
:if ($BLdebug = true) do={
:log info ("Строка не пустая: $entry");
}
:local tmpArray [:toarray $entry];
:put $tmpArray;
:local comment ([:pick $tmpArray 0]);
:local prfx [:pick $comment 0 1];
# Если первый символ не *
:if ($prfx != "*") do={
:if ($BLdebug = true) do={
:log info ("Без *");
}
# Алгоритм №1
:set pingresultA [/ping $comment count=2];
:if ($BLdebug = true) do={
:if ($pingresultA > 0) do={
/log error "$comment пингуется ($pingresultA из 2)";
} else={
/log warning "$comment НЕ ПИНГУЕТСЯ";
}
}
# Для каждого IP хоста из кэша DNS
:foreach i in=[/ip dns cache all print as-value where name=$comment && type="A"] do={
# Если IP нет в адреслистах
:local tmpAddress ($i->"data");
:if ([/ip firewall address-list find where address=$tmpAddress] = "") do={
:local tmpName ($i->"name");
:if ($BLdebug = true) do={
/log info "$tmpAddress найден в DNS кэше и сопоставляется с $tmpName";
}
# Вносим IP в адреслист, имя сайта указываем как комментарий
:if ($BLdebug = true) do={
:log info ("BlockSites added entry: $tmpName $tmpAddress");
}
/ip firewall address-list add address=$tmpAddress list=[:pick $tmpArray 1] comment=$tmpName;
}
# Задержка для снижения нагрузки на CPU
delay delay-time=10ms;
}