Похоже, скрипт зависал на переменной $user… не понимаю почему, так как в первый раз он работал корректно. Поэтому я преобразовал $user в строку и использовал её вместо переменной по всему скрипту. Теперь, кажется, всё работает. Дайте знать, если у вас тоже заработало! v3
# КОНФИГУРАЦИЯ --------------------------------------------\
# Адрес электронной почты для отправки
:local emailaddress "email@domain.com";
# Как долго пользователь остаётся в списке адресов
:local timeout 30d;
# Фильтр имён, обрабатывать только имена пользователей, которые начинаются с этой строки (регистр важен)
# Если хотите разрешить всем пользователям, оставьте двойные кавычки: :local nameFilter ("");
:local nameFilter ("AD","ad","Ad","aD");
# КОНЕЦ КОНФИГУРАЦИИ ----------------------------------------/
:local userStr [:tostr $user];
# Флаг соответствия
:local match 0;
# Проверить каждый элемент nameFilter
:foreach i in=$nameFilter do={
# если имя пользователя начинается с nameFilter, есть совпадение
if ([:find "$userStr" "$i"] = 0) do={
:set match 1;
}
}
if ($match = 1) do={
/log info "[HOTSPOT] - $userStr - вошёл в систему, соответствует фильтру имени";
# Установить переменные даты и времени
:local date [/system clock get date];
:local time [/system clock get time];
# Получить IP-адрес пользователя
:local ip [/ip hotspot active get [find user="$userStr"] address];
# Объявить несколько переменных
:local emailsubject;
:local emailbody;
# Если пользователя НЕТ в списке адресов
:if ([:len [/ip firewall address-list find list~"^$userStr - HSLOGIN"]] = 0) do={
/log info "[HOTSPOT] - $userStr - не найден в списке адресов";
# Добавить правила брандмауэра, которые добавят запись в динамический список адресов
/ip firewall filter add action=add-src-to-address-list address-list="$userStr - HSLOGIN,$date,$time" address-list-timeout=$timeout chain=pre-hs-input disabled=no src-address=$ip comment="$userStr - HSLOGIN";
/ip firewall filter add action=add-src-to-address-list address-list="$userStr - HSLOGIN,$date,$time" address-list-timeout=$timeout chain=forward disabled=no src-address=$ip comment="$userStr - HSLOGIN";
:local counter 0;
# Количество попыток добавления пользователя в список адресов, прежде чем сдаться
:local limit 60;
# Задержка между попытками
:local delaytime 5s;
# Цикл несколько раз, чтобы проверить, добавлен ли пользователь в список адресов
:while (counter < $limit) do={
:set counter ($counter + 1);
/log info "[HOTSPOT] - $userStr - проверяет, находится ли пользователь в списке адресов - попытка $counter из $limit";
# Ждать между проверками списка адресов
:delay $delaytime;
# если запись в списке адресов найдена, продолжить
:if ([:len [/ip firewall address-list find list~"^$userStr - HSLOGIN"]] = 1) do={
/log info "[HOTSPOT] - $userStr - пользователь добавлен в список адресов, отправка email";
# Установить переменные темы и тела email
:set emailsubject "Новый вход в систему Hotspot ($userStr)";
:set emailbody "Пользователь: $userStr\r\n$time, $date\r\nIP: $ip\r\nИстекает через: $timeout";
# увеличить счётчик
:set counter ($limit+10);
} else={
# если достигнут лимит попыток добавления, отправить email
:if ($counter = $limit) do={
/log info "[HOTSPOT] - $userStr - не удалось добавить пользователя в список адресов, отправка email";
# Установить переменные темы и тела email
:set emailsubject "Новый вход в систему Hotspot ОШИБКА ($userStr)";
:set emailbody "ОШИБКА: не удалось добавить в список адресов, требуется расследование.\r\n\r\nПользователь: $userStr\r\n$time, $date\r\nIP: $ip\r\n";
}
}
}
# удалить правила брандмауэра потом
/ip firewall filter remove [find comment="$userStr - HSLOGIN"];
# отправить email
/tool e-mail send to="$emailaddress" subject="$emailsubject" body="$emailbody";
# если пользователь УЖЕ есть в списке адресов
} else={
/log info "[HOTSPOT] - $userStr - уже есть в списке адресов";
}
# если пользователь не соответствует фильтру имени, зафиксировать информацию
} else={
/log info "[HOTSPOT] - $userStr - вошёл в систему, не соответствует фильтру имени";
}