Скрипт для RouterOS может быть немного запутанным, особенно когда дело касается извлечения данных из текстовых строк и работы с IP-адресами. Давайте разберем ваш запрос и исправим код так, чтобы он работал корректно для извлечения IP-адреса и добавления его в черный список.
В вашем исходном коде ошибка заключается в том, что вы пытаетесь использовать строку `[:pick $msg 0 [:find $msg "." [:find $msg " "]]]` для извлечения IP-адреса, что может не сработать из-за неправильных индексов. Вместо этого, мы можем использовать `:find` более продуманно, чтобы извлечь правильный IP.
Вот исправленный код:
```rsc
:foreach i in=[/log find message~"parsing packet failed, possible cause: wrong password"] do={
:local msg [/log get $i message];
# Ищем первую точку в сообщении
:local startIndex [:find $msg " "];
# Ищем вторую точку
:local secondDotIndex [:find $msg "." ($startIndex + 1)];
# Ищем третью точку
:local thirdDotIndex [:find $msg "." ($secondDotIndex + 1)];
# Ищем четвертую точку
:local fourthDotIndex [:find $msg "." ($thirdDotIndex + 1)];
# Извлекаем IP-адрес
:local ipAddress [:pick $msg 0 $fourthDotIndex];
# Добавляем IP-адрес в черный список
/ip firewall address-list add list=block_vpn_access address=$ipAddress;
}
```
Этот скрипт работает следующим образом:
1. Использует цикл `:foreach` для перебора всех записей в логах, содержащих нужное сообщение.
2. Извлекает сообщение логов.
3. Находит индексы каждой точки в IP-адресе.
4. Извлекает IP-адрес, используя полученные индексы.
5. Добавляет IP-адрес в адресный список `block_vpn_access`.
Обратите внимание, что в вашем случае, если IP-адрес может быть отформатирован по-разному или содержать дополнительные пробелы, возможно, потребуется улучшить алгоритм анализа строки. Но этот подход должен подойти для получения IP-адресов, если формат сообщения строго определен и не изменяется.