Страница 1 из 1

Сменить dhcp-связку

Добавлено: 04 сен 2016, 13:58
Iskatel
Помогите, пожалуйста, образовалась задачка:
Есть сеть, все пользователи которой идентифицируются по MAC-адресу и есть dhcp-сервер на MikroTik, который раздаёт статические IP-адреса. Управляется MikroTik по ssh из системы билинга, так например для создания пользователя система биллинга отправит команду:

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

/ip dhcp-server lease add address=UIP mac-address=MAC

Соответственно UIP и MAC будут заменены на IP-адрес и MAC-адрес.
Но есть одно но, эта команда не сработает, если уже есть связки содержащие указанный MAC-адрес или IP-адрес.
Стало быть нужно перед этой командой выполнить ещё две, которые эти связки будут удалять:

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

/ip dhcp-server lease remove [find address=UIP]

и

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

/ip dhcp-server lease remove [find mac-address=MAC]

То есть задача выполнима при помощи скрипта, в котором эти три команды будут выполняться. А вот дальше никак не разберусь. Вот допустим биллинг передаст на Микротик команду запуска скрипта:

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

/system script run Change_IP_MAC UIP MAC

А дальше как? Нужно же чтобы переменные UIP и MAC правильно внутрь скрипта передались. В wiki написано, что это как-то через :global делается, но тут я ничего не понимаю.

Re: Сменить dhcp-связку

Добавлено: 04 сен 2016, 19:35
podarok66

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

:global UIP 10.10.10.1;
:global MAC 12:34:56:78:90:AB

Такими командами вы задаете глобальные переменные, которые сохраняются до перезагрузки оборудования. Есть еще локальные переменные, которые живут только пока выполняется локальная область, в которой они заданы.
http://wiki.mikrotik.com/wiki/Manual:Sc ... obal_scope

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 01:34
Iskatel
Понятно что нужны локальные переменные. А как сделать, чтобы они в моём случае в скрипт передавались

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 12:35
podarok66
Локальные переменные можно назначить только в самом скрипте. По моему вам скорее с глобальными работать надо. То есть объявить глобальную переменную и назначить ей нужное значение, если нужно изменить значение, используем команды:

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

:set UIP 10.10.10.2;
:set MAC 12:34:56:78:90:CD

В скрипте уже объявляем эту переменную (как бы просто заявляем, что мы с ними будем работать)

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

:global UIP;
:global MAC

и далее работаем с ними вполне себе спокойно в скрипте. Я как-то не очень понимаю, что там вы и чем собираетесь делать, но в целом все как-то так...
А вообще, может вам допилить биллинг, чтобы он с самого начала выдавал всю серию команд в фигурных скобках, тогда никаких переменных и никаких криптов? Выйдет что-то типа:

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

{
:local UIP 10.10.10.1;
:local MAC xx:xx:xx:xx:xx:xx;
/ip dhcp-server lease remove [find address=$UIP];
/ip dhcp-server lease remove [find mac-address=$MAC];
/ip dhcp-server lease add address=$UIP mac-address=$MAC
}

То есть вы искусственно создали локальную область, которая выполнится как одна команда... Или я неверно все понимаю?

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 16:20
Iskatel
podarok66 писал(а):А вообще, может вам допилить биллинг, чтобы он с самого начала выдавал всю серию команд в фигурных скобках, тогда никаких переменных и никаких криптов?

Сегодня попробовал сделать, чтобы биллинг передавал на микротик последовательность из трёх команд вместо одной как раз через фигурные скобки. Передаёт, но теряются как раз самые важные части кода: значения UIP и MAC. - не вышло. Я сейчас как раз параллельно общаюсь с техподдержкой биллинга ("Netup"), может что и выйдет, но вариант со скриптом тоже рассматриваю.

podarok66 писал(а):Локальные переменные можно назначить только в самом скрипте. По моему вам скорее с глобальными работать надо. То есть объявить глобальную переменную и назначить ей нужное значение

Получается, что передавать значения переменных как параметры через командную строку нельзя? То есть мне нужно опять же передать последовательность команд: две команды назначают глобальные переменные, одна запускает скрипт, а потом в конце скрипта эти переменные должны сбрасываться?

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 16:50
podarok66
Iskatel писал(а):Получается, что передавать значения переменных как параметры через командную строку нельзя?

Да можно передать, только вот локальная переменная живет только до конца исполнения команды. То есть вы даль команду в терминале, команда исполнилась и нет переменной. Скрипт есть локальная область, с точки зрения терминала это одна команда. Задали переменную в скрипте - до конца исполнения скрипта переменная живет. Потом нет. Понятно, что я говорю о локальных переменных.
Отсюда и разговор о глобальных переменных. Они своё значение сохраняют до перезагрузки.
Возможно, мы немного друг друга недопонимаем. Вы скажите, что для вас UIP и MAC. Я предполагал, что это некие значения, которые нужно подставить в переменные. Например UIP=10.10.10.1 - IP адрес какого-то клиента. MAC=хх:хх:хх:хх:хх:хх - это его МАС-адрес.

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 17:29
Iskatel
Всё верно, UIP и MAC - это IP и MAC адрес какого-то клиента и таких клиентов около тысячи. Эти данные хранятся биллинге и их нужно передавать в микротик в "ip - dhcp-server - leases", если в биллинге они изменятся, чтобы dhcp-сервер всегда выдавал клиенту правильный ip-адрес.
После завершения работы скрипта переменные не нужны. Более того как раз необходимо, чтобы они сбросились, чтобы их старые значения не нарушили работу следующего запущенного экземпляра скрипта.

Re: Сменить dhcp-связку

Добавлено: 05 сен 2016, 18:07
podarok66
Тогда приведенный мною скрипт должен отрабатывать правильно. Главное, чтобы биллинг значения 10.10.10.1 и xx:xx:xx:xx:xx:xx подменял на нужные вам. Проверьте еще раз, что там посылается...