Статические клиенты и DHCP (скрипт)

Автоматизация при помощи встроенного скриптового языка и RouterOS API
wolodyawggu
Сообщения: 36
Зарегистрирован: 20 мар 2020, 13:16

Статические клиенты и DHCP (скрипт)

Сообщение wolodyawggu »

Здравствуйте, возможно ли как то запомнить Статических клиентов: Имеется 2 линии связи через DHCP Leases я могу менять способ подключения к интернету ( находятся в Adress List), НО статических клиентов я не могу контролировать. Возможно ли как то добавить клиентов в этот список (DHCP), то есть Запомнить в роутере IP-MAC-Adress List.
Пробовал скрипт который якобы должен их помещать туда из ARP в Leases, но что-то пошло не так и как был список полученный автоматически, так и остался. Скрипт прилагаю.

Код: Выделить всё

Наш скрипт выглядит следующим образом.
:local a; :local m; :for y from=0 to=7 do={:set a [/iparp get value-name=address number=$y]; :set m [/iparp get value-name=mac-address [find address=$a]]; :ipdhcp-server lease add address=$a mac-address=$m; };

Разберем скрипт по пунктам.
:locala; :localm; – создаем две локальные переменные, в которые будут помешены значения ІР и mac адреса.
:foryfrom=0 to=7 – цикл for будет осуществлять перебор записей из ARP таблицы. Вместо цифры 7 вы должны подставить, свое значение, то есть порядковый номер последней записи из вашей ARP таблицы.
seta [/iparpgetvalue-name=addressnumber=$y]; – получаем данные об ІР-адресе и заносим в переменную а.
setm [/iparpgetvalue-name=mac-address [findaddress=$a]] – получаем данные о мас адресе и заносим в переменную m.
ipdhcp-server lease add address=$a mac-address=$m; – добавляем записи в раздел lease подставляя значения ІР и mac адреса.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Здравствуйте.

Что-то в вашем скрипте много где не хватает пробелов, поэтому он и не работает.
wolodyawggu
Сообщения: 36
Зарегистрирован: 20 мар 2020, 13:16

Re: Статические клиенты и DHCP (скрипт)

Сообщение wolodyawggu »

Chupaka писал(а): 20 мар 2020, 16:31 Здравствуйте.

Что-то в вашем скрипте много где не хватает пробелов, поэтому он и не работает.
А где поконкретнее?
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Ну, например, "/iparp" — нет такой команды. А вот "/ip arp" — есть. ":ipdhcp-server" явно должен быть "/ip dhcp-server"'ом.
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

Топикастер так и не отрапортовал, а скрипт действительно интересный.
Привел его в такой вид по подсказке выше, но он все равно не работает( Клиентов со статикой в leases как не было так и нет(

Код: Выделить всё

:local a; :local m; :for y from=0 to=7 do={:set a [/ip arp get value-name=address number=$y]; :set m [/ip arp get value-name=mac-address [find address=$a]]; :ip dhcp-server lease add address=$a mac-address=$m; };
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Вот это "from=0 to=7" как-то экстремально оптимистично. Впрочем, там есть и другие необычные места. Попробуйте так:

Код: Выделить всё

:local a;
:local m;
:foreach y in=[/ip arp find complete] do={
	:set a [/ip arp get $y address];
	:set m [/ip arp get $y mac-address];
	:if ([/ip dhcp-server lease print count-only where address=$a mac-address=$m] = 0) do={
		/ip dhcp-server lease add address=$a mac-address=$m;
	}
};
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

В первоначальном варианте я конечно же пробовал вместо 7 подставлять разные значения, вплоть до 254...
Ваш вариант к сожалению тоже не видит статику на стороне клиента. В таблице arp они есть.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

filmoto писал(а): 26 дек 2023, 15:28 В первоначальном варианте я конечно же пробовал вместо 7 подставлять разные значения, вплоть до 254...
Эти индексы имеют смысл лишь после команды print, а ею в скрипте и не пахнет.
filmoto писал(а): 26 дек 2023, 15:28 Ваш вариант к сожалению тоже не видит статику на стороне клиента. В таблице arp они есть.
Откройте Терминал, введите "{", вставьте скрипт, закройте "}" и жмите Enter - что говорит?
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

{:local a;
{... :local m;
{... :foreach y in=[/ip arp find] do={
{{... :set a [/ip arp get $y address];
{{... :set m [/ip arp get $y mac-address];
{{... :if ([/ip dhcp-server lease print count-only where address=$a mac-address=$m] = 0) do={
{{{...
caps-man console dude interface ipv6 mpls port queue routing special-login task user blink import password quit undo
certificate disk file ip log partitions ppp radius snmp system tool beep export jobname ping redo
{{{... /ip dhcp-server lease add address=$a mac-address=$m;
{{{... }
{{... };}
0
invalid value of mac-address, mac address required
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

Почему выводится меню winbox?
caps-man console dude interface ipv6 mpls port queue routing special-login task user blink import password quit undo
certificate disk file ip log partitions ppp radius snmp system tool beep export jobname ping redo
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Это, видимо, из-за двойного отступа табом - консоль думает, что автодополнение запросили. Проверил - на полёт оно не влияет. Попробуйте "[/ip arp find]" заменить на "[/ip arp find complete]" - возможно, у вас в ARP есть адреса в процессе резолвинга, поэтому у них ещё нет MAC'а - и из-за этого выпадает с исключением.

На всякий случай: версия RouterOS какая?
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

Версия 7.12.1

Терминал:
{:local a;
{... :local m;
{... :foreach y in=[/ip arp find complete] do={
{{... :set a [/ip arp get $y address];
{{... :set m [/ip arp get $y mac-address];
{{... :if ([/ip dhcp-server lease print count-only where address=$a mac-address=$m] = 0) do={
{{{...
caps-man console dude interface ipv6 mpls port queue routing special-login task user blink import password quit undo
certificate disk file ip log partitions ppp radius snmp system tool beep export jobname ping redo
{{{... /ip dhcp-server lease add address=$a mac-address=$m;
{{{... }
{{... };}
0
0
1
1
1
1
1
1
1
1
1
1
1
1

Меню winbox все равно выдает, но в таком виде сработал.
В leases показались записи со статикой на стороне хоста, а так же GW провайдера.
Заполнены поля только ip, mac, server показывает как all, status показывает waiting, остальные поля пустые.
Остальные поля возможно оживить? Host Name, Bridge Port, Status?
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

filmoto писал(а): 27 дек 2023, 12:11 В leases показались записи со статикой на стороне хоста, а так же GW провайдера.
Как и ожидалось. Всё, что есть в ARP-таблице :)
filmoto писал(а): 27 дек 2023, 12:11 Заполнены поля только ip, mac, server показывает как all, status показывает waiting, остальные поля пустые.
Остальные поля возможно оживить? Host Name, Bridge Port, Status?
Host Name не нахожу, вижу только Active Host Name. Это, и Bridge Port со Status вдобавок, про DHCP-аренду. Поскольку у хоста статикой настройки прописаны - первые два пустые, т.к. адрес не выдавался, а Status - waiting :) Пока не будет DHCP-запроса от клиента - ничего не изменится.
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

По остальным полям понял.
Я только хотел его в scheduler запихнуть и тут я заметил что скрипт только добавляет в leases хосты из arp , но когда эти хосты из arp исчезают при повторном запуске скрипта они все равно остаются в leases.
Убирать их из leases только руками?
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Если вы сможете сформулировать, что надо удалить — думаю, скриптом это описать тоже можно :)
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

- cкрипт из таблицы arp подтянул хосты со статикой
- хосты отключились, и по таймауту через 30 мин исчезли из таблицы arp, а новые хосты с другими ip подключились
- запускаю скрипт снова, и он снова подтягивает новые хосты из arp в leases, а старые хосты которые уже давно отключились до сих пор висят в leases
- Хотелось бы что бы отключившиеся хосты удалялись из leases
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Зачем вам вообще эти хосты в Leases? %) Вопрос полуриторический, но ответ всё же интересен.

В простейшем варианте можно, например, добавлять эти записи в Leases c комментарием ("from ARP"), а в начале скрипта эти записи все удалять - тогда по окончании работы там будут только свежие, актуальные.
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

У меня некоторые хосты в видеонаблюдении не могут получать ip по dhcp (только статикой), хотелось бы их видеть в leases как и остальные.
Конечно думал что будет видно и Active Host Name, Bridge Port,Status и Comment (теперь понятно что не получится), но если есть под носом хотя бы их ip и mac - тоже не плохо, а то часто приходится их искать.

From arp можно не писать - так как host name не отображается мне все равно придется руками их комментировать с именем
Да, нужно старые удалять а новые добавлять

А есть и сложный вариант???
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

filmoto писал(а): 28 дек 2023, 10:43 но если есть под носом хотя бы их ip и mac - тоже не плохо, а то часто приходится их искать.
Хм... Странные какие-то хосты, то появляются, то пропадают, и искать надо только тогда, когда они работают... Может, вам лучше какой-нибудь список вести отдельно, не на роутере?..
filmoto писал(а): 28 дек 2023, 10:43 From arp можно не писать - так как host name не отображается мне все равно придется руками их комментировать с именем
Да, нужно старые удалять а новые добавлять
Комментарий "From ARP" (или любой другой) нужен как раз для того, чтобы скрипт мог понять, какие записи добавил он, а какие были добавлены кем-то другим. Надо же знать, какие можно удалить :)
filmoto писал(а): 28 дек 2023, 10:43 А есть и сложный вариант???
Ну, например, не с полным удалением всех записей и пересозданием таблицы Leases из ARP, а, например, удалением только того, что в ARP не найдено. Чуть больше времени, чуть более громоздкий скрипт, чуть меньше записей в логе :)
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

Так, напишу побольше дабы внести ясность!
- Хосты то видеонаблюдения постоянно в сети,,, просто я скрипт проверил на предмет, если допустим придется сменить ip у ряда камер (например поменять их местами), то этот скрипт их снова не добавит с новыми ip из arp в leases, так как их маки уже добавлены в leases им же ранее, а по таймауту не активные ip удаляются только из arp и только через 30 мин., но не из leases.
- Список с маками у меня есть (цель скрипта не только в этом), но мне удобнее видеть их в winbox, чем лезть за ним в NAS + хосты из leases можно групировать в address-list для использования в filter, и прочее управление для них так же активно в свойствах.
- From arp я все равно буду переименовывать в host name для читабельности. Скрипт разве не может использовать другой атрибут, кроме как comment для сортировки? Например скрипт при добавлении хостов в графе Server указывает "all" вместо "dhcp", по этому атрибуту он будет понимать что он добавил в leases, а что добавлено dhcp server с make static?
- Скрипту не надо сначала удалять все из leases а потом это же подтягивать из arp, так как он удалит мне так же хосты с make static, а потом их же добавит но уже без атрибутов Active Host Name, Bridge Port, Status и прочего.
- В общем нужен алгоритм примерно такой:
) Скрипт при старте удаляет из leases только те ip которых уже нет в arp таблице и только те, которые сам добавлял, ориентируясь например по графе Server с атрибутом "all", и не трогал хосты с атрибутом "dhcp" хостов с "make static" добавленные DHCP-сервером, даже если они к примеру временно отвалились и вдруг исчезли из arp таблицы.
) Далее скрипт добавляет новые ip которых нет в leases, но которые появились в arp (жаль что скриптом не подтянется Host Name и Status новых ip), было бы вообще шикарно если подтянуть из других мест максимум атрибутов.

ПС: Собственно я случайно набрел на эту ветку и увидел описанный топикастером скрипт, который мне показался очень удобным для моих целей (некоторым управлением через свойства хостов в leases адресами камер, регистраторов и коммутаторов которые сидят на статике на
стороне клиента, которым по соображениям стабильности видео-сети не стоит быть зависимыми от dhcp роутера).
Скрипт мне правда, сразу показался слишком коротким и простым, даже с учетом того что в скиптах я не понимаю.
Я решил привести его в рабочее состояние по вашим замечаниям и подсказкам. Но в итоге представленный топикастером скрипт оказался полурабочим костылем (и то, только после ваших правок) и написаным кем то явно на "от"""бись" или просто в образовательных целях.
Начиная переписку я не знал что этот костыль не будет отвечать моим требованиям и под мои хотелки придется писать фактически новый и более сложный скрипт. Этот скрипт не настолько мне важен (но был бы весьма кстати), чтобы его написание целенаправленно заказывать, тем более что из-за моего возможно не полного понимание некоторых скрипто-логик, я скорее всего сразу не смог бы дать полностью исчерпывающее и законченное ТЗ.
Так что если у вас имеется спортивный интерес и время то давайте не спеша по возможности доведем его до рабочего состояния с подтягиванием максимума атрибутов указанных в leases.
Каким никаким спросом эта тема пользуется, видел похожие вопросы на форумах - но не видел рабочих решений.

ПС2: Я даже не представляю на сколько готовый скрипт будет грузить систему. Вдруг он окажется очень тяжелым и не целесообразен к использованию...
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

Ну, по поводу подтягивания атрибутов - всё перечисленное вами в read-only, вы даже при желании туда вбить ничего не можете...

А удаление можно реализовать, например, так:

Код: Выделить всё

:local a;
:foreach l in=[/ip dhcp-server lease find server=all] do={
	:set a [/ip dhcp-server lease get $l address];
	:if ([/ip arp print count-only where address=$a] = 0) do={
		/ip dhcp-server lease remove $l;
	}
};
В собранном итоговом скрипте, ессесно, не надо дублировать ":local".

Кстати, можно для таких leases создать отдельный сервер, чтобы понятнее было. На том же порту, просто указать ему в Relay какой-нибудь несуществующий адрес.
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

- Вы имеете в виду что графы в leases (Active Host Name, Bridge Port, Status) только для чтения и скрипт в низ не сможет поместить какую либо информацию?

- "В собранном итоговом скрипте, ессесно, не надо дублировать ":local"." - для меня эта фраза не очевидна.
Я повторюсь что не понимаю скрипты и собирать из кусков один не могу. Сделаю по незнанию лишний пробел - скрипт не сработает

Все хосты видеонаблюдения находятся на двух интерфейсах роутера в отдельном Bridge-Сам в отдельной подсети и DHCP-Server для них отдельный
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

filmoto писал(а): 29 дек 2023, 10:50 - Вы имеете в виду что графы в leases (Active Host Name, Bridge Port, Status) только для чтения и скрипт в низ не сможет поместить какую либо информацию?
Да, вот все свойства, которые можно задать:

Код: Выделить всё

> /ip/dhcp-server/lease/set 0 <TAB><TAB>
address                    dhcp-option             queue-type    
address-lists              dhcp-option-set         rate-limit    
allow-dual-stack-queue     disabled                routes        
always-broadcast           insert-queue-before     server        
block-access               lease-time              use-src-mac   
client-id                  mac-address             
comment                    parent-queue     
filmoto писал(а): 29 дек 2023, 10:50 - "В собранном итоговом скрипте, ессесно, не надо дублировать ":local"." - для меня эта фраза не очевидна.
Я повторюсь что не понимаю скрипты и собирать из кусков один не могу. Сделаю по незнанию лишний пробел - скрипт не сработает
Тут абсолютно независимые куски, так что просто один за другим их располагайте. А объявление переменных (:local) просто в самом начале сделайте по одному разу для каждой переменной.
filmoto писал(а): 29 дек 2023, 10:50 Все хосты видеонаблюдения находятся на двух интерфейсах роутера в отдельном Bridge-Сам в отдельной подсети и DHCP-Server для них отдельный
Ну, тут уж на вкус и цвет... Вам из ARP надо тянуть все записи или только на этом Bridge-Сам? Если только - то в команду /ip arp find достаточно добавить фильтр по интерфейсу
filmoto
Сообщения: 13
Зарегистрирован: 25 дек 2023, 21:41

Re: Статические клиенты и DHCP (скрипт)

Сообщение filmoto »

"Да, вот все свойства, которые можно задать:" - эти свойства хоста мне и так станут доступны когда хост появится в leases

- Вам сложно разместить скрипт целиком? Ощущение что скрипт пишу Я, а вы мне напоминаете как это сделать...
Для меня ваши фразы:
"А объявление переменных (:local) просто в самом начале сделайте по одному разу для каждой переменной." и
"то в команду /ip arp find достаточно добавить фильтр по интерфейсу"
не очевидны и по восприятию ни чем не отличается от этой -
"Синусоидальность дидукционного индуктора некоэмутируется с хромофорной эффузией аксирогентно-адиквантного фотонного триангулятора"

"Ну, тут уж на вкус и цвет..." - Вы мне сами предложили, я вам ответил что это уже реализовано и описал как.
Да, нужно тянуть только с Bridge-Cam
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Статические клиенты и DHCP (скрипт)

Сообщение Chupaka »

filmoto писал(а): 30 дек 2023, 09:43 "Да, вот все свойства, которые можно задать:" - эти свойства хоста мне и так станут доступны когда хост появится в leases
Если их не заполнить - то они будут пустыми. Либо я не понял, что вы имеете в виду. Я лишь сказал, что всякие Host Name вы заполнить самостоятельно НЕ можете.
filmoto писал(а): 30 дек 2023, 09:43 - Вам сложно разместить скрипт целиком? Ощущение что скрипт пишу Я, а вы мне напоминаете как это сделать...
Ну, вообще я так изначально и думал, что я лишь помогаю вам написать скрипт в своё свободное время :) Если у вас копирование запрещено - то вы так и скажите, тогда я помогу вам с копированием.
filmoto писал(а): 30 дек 2023, 09:43 Для меня ваши фразы:
"А объявление переменных (:local) просто в самом начале сделайте по одному разу для каждой переменной." и
"то в команду /ip arp find достаточно добавить фильтр по интерфейсу"
не очевидны и по восприятию ни чем не отличается от этой -
"Синусоидальность дидукционного индуктора некоэмутируется с хромофорной эффузией аксирогентно-адиквантного фотонного триангулятора"
Для меня обе фразы в целом понятны, хотя ваш пример и напоминает изначальный скрипт из этой темы как минимум по степени корявости и некорректности :) Если даже с пониманием объявления переменных у вас проблемы - возможно, вам проще нанять кого-то, кто вам подготовит решение "под ключ", раз вы не хотите разбираться даже в базовых вещах.
filmoto писал(а): 30 дек 2023, 09:43 Да, нужно тянуть только с Bridge-Cam
Вот, копирую, как и обещал:

Код: Выделить всё

:local a;
:local m;

:foreach l in=[/ip dhcp-server lease find where !server] do={
	:set a [/ip dhcp-server lease get $l address];
	:if ([/ip arp print count-only where address=$a] = 0) do={
		/ip dhcp-server lease remove $l;
	}
};

:foreach y in=[/ip arp find complete interface=Bridge-Cam] do={
	:set a [/ip arp get $y address];
	:set m [/ip arp get $y mac-address];
	:if ([/ip dhcp-server lease print count-only where address=$a mac-address=$m] = 0) do={
		/ip dhcp-server lease add address=$a mac-address=$m;
	}
};