Задать вопрос
seventh
@seventh
сисадмин

Как в скрипте Микротика определить первый октет IP?

Здравствуйте, уважаемые.
Mikrotik подключается по PPPoE, получает честный динамический адрес. Но нам не нравится его поведение, когда адрес начинается на 213 - из этой сети он почему-то не доступен снаружи. Поэтому задача написать скрипт, который будет определять первый октет IP и если он равен 213 класть PPPoE соединение и снова поднимать его через 30 сек.
Общий процесс понятен, за исключением как раз главного - как выделить этот первый октет в скрипте из адреса? Тупо чуть доработал другой скрипт, помогите, пожалуйста, допилить. Особенно в самой непонятной мне части про парсинг.

:global newIP [/ip address get [find interface="PPPoE"] address];
# parse the current IP result
:local resultLen [:len $newIP]
:local startLoc 0
:local endLoc [:find $newIP "/" -1]
:global currentIP [:pick $newIP $startLoc $endLoc]

:if ($currentIP = 213) do={
/interface pppoe-client disable PPPoE
:delay 30
/interface pppoe-client enable PPPoE
}
  • Вопрос задан
  • 2966 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
l0ser140
@l0ser140
Для этого же маски сети есть.

:global newIP [/ip address get [find interface="PPPoE"] address];

:if ($newIP in 213.0.0.0/8) do={
/interface pppoe-client disable PPPoE
:delay 30
/interface pppoe-client enable PPPoE
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@EugeneT
:local endLoc [:find $newIP "/" -1]

Точку же ищем, нет?
:local endLoc [:find $newIP "." -1]
Ответ написан
@moneron89
Сертифицированный тренер Mikrotik
Уже несколько вариантов решения представлены. Ещё вариант решения одной строкой:
:local "current-ip" [:pick [/ip address get [find interface =PPPoE] address ] 0 3]
:if ($currentIP = 213) do={
/interface pppoe-client disable PPPoE
:delay 30
/interface pppoe-client enable PPPoE
}

Не вижу необходимости в глобальной переменной.
И не забудьте в scheduler задачу добавить.
Ответ написан
Комментировать
LESHIY_ODESSA
@LESHIY_ODESSA
Тогда так :

:global "out-interface" "pppoe"
:local "current-ip" [/ip address get [find interface=$"out-interface"] address]
:local "result" [:find $current-ip "." -1]
:if ($result = 213) do={
/interface pppoe-client disable $"out-interface"
:delay 30
/interface pppoe-client enable $"out-interface"
}


1. У вас непонятная точка запятая (;) в конце строчки с global
2. RouterOS это тот же Linux, а значит PPPoE и pppoe для него это два разных интерфейса.
3. Некоторые скрипты могут сразу не отработать, поставьте максимальные права .
/system scheduler
add disabled=no interval=1m name=myscript on-event="/system script run myscript" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api start-time=startup
Ответ написан
Комментировать
JoeRee
@JoeRee
Связист
Включил похожий скрипт, но с обратной логикой - на личный форум есть доступ извне только тогда, когда IP начинается на 212:
:local newIP [:pick [/ip address get [find interface ="RT"] address ] 0 3]
:if ($newIP != 212) do={
/interface pppoe-client disable RT
:delay 5
/interface pppoe-client enable RT
}

В шедулере стоит запуск каждые 10 мин.
Скрипт работает, но, иногда, провайдер присваивает IP повторно нерабочий.
Приходится ждать эти 10 мин. до следующего запуска.
Как зациклить скрипт до получения правильного IP?
Или в шедулере поставить проверку каждую минуту? В этом случае забьется ли память микротика частым большим логом?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы