Страница 1 из 1
Прошу Помощи
Добавлено: 01 ноя 2019, 13:39
ZeaZee
Доброго времени суток.
Прошу помощи в написании такого скрипта:
В помещении находится приблизительно 600+ устройств, абонентских, им нужно подключиться к Access Point на базе микротика 493 кажется, сейчас не на работе просто, впитать настройку с сервера и отключиться, освободив место для следующих. На точке стоит ограничение в 60 абонентов. Больше серв за раз не обработает все равно, так что смысл нет расширять, проверено.
По сему хочу написать скрипт, который извлекал бы mac-adress ИЗ регистр листа и помещал бы его в fire-wall правило. Может кто-нибудь помочь, хотя с обозначением переменной, которая бы извлекала мак устройства из листа, дальше я бы справился. Благодарю.
Может есть другой выход без скрипта. И да 600+ это еще лайтовенько, есть помещения где более 4000, но до них я надеюсь будет использоваться хотя бы 10.
Ах да, еще эти устройства работают ТОЛЬКО на определенной частоте, разнос по частотам не вариант.
Очень благодарен буду за помощь и выложу готовый скрипт, отшлифованный так сказать, так как есть тестовый стенд.
Re: Прошу Помощи
Добавлено: 01 ноя 2019, 19:24
Ca6ko
60 устройств на точку это многовато. При зарегистрированных 100 клиентов 70 процентов времени в эфире вещают их маяки. Поэтому скорости очень низкие.
Не рекомендуют подключать больше 30 работающих.
Вариант добавить несколько точек и под Capsman. Точки разнести в пространстве и понизить мощность до нужных значений. Устройства ведь по помещению разнесены?
Команды можете посмотреть в этой теме
viewtopic.php?f=14&t=8516
Re: Прошу Помощи
Добавлено: 03 ноя 2019, 08:45
podarok66
Ну сам скрипт писать мне явно не очень хочется, а вот приём получения адреса из списка ... Предположим, что у вас есть список из 600 МАС-адресов в текстовом формате. Обязательным условием является сам список - каждый МАС с новой строки, никаких других знаков не приемлем. Дальше определяем количество устройств, которое будет в одном такте, например 15. И погнали
Код: Выделить всё
# Берём содержимое файла
:local con [/file get [find name=1.txt] contents];
# Определяем такт работы
:for r from=0 to=599 step=15 do={
# Осуществляем выборку МАС-адресов
:for n from=(0+$r) to=(14+$r) do={
:put [:pick $con (19 * $n) ([:find $con "\r\n"] + (19 * $n))];
}}
Вместо :put можно начинать работать с получаемыми значениями. Как-то так...
Но работать он будет ой долго...
А-а-а-а, перечитал стартовый пост. Так вы из аксцесс-листа хотите извлечь МАС-адреса? Принцип тот же. Вам нужны всего несколько активных адресов. Делаем весь лист disabled=yes и запускаем скрипт
Код: Выделить всё
:for r from=0 to=599 step=15 do={
:for n from=(0+$r) to=(14+$r) do={
/interface wireless access-list set disabled=no numbers=$n
};
:delay 5;
/interface wireless access-list set [find disabled=no] disabled=yes;
:delay 5;
}
Но надо прикручивать проверку на неполный такт, а то он завершается на первой половине цикла .... Из-за этого на последнем цикле скрипт вылетает и последние МАСи остаются включенными. Я не придумал, как обойти эту ерунду. Может кто-то и подскажет, тогда можно будет слепить полноценное решение.
А так, меняйте паузы между тактами, прикручивайте выполнение любых задач, всё должно отработать.
Re: Прошу Помощи
Добавлено: 03 ноя 2019, 15:20
ZeaZee
podarok66 писал(а): ↑03 ноя 2019, 08:45
Ну сам скрипт писать мне явно не очень хочется, а вот приём получения адреса из списка ... Предположим, что у вас есть список из 600 МАС-адресов в текстовом формате. Обязательным условием является сам список - каждый МАС с новой строки, никаких других знаков не приемлем. Дальше определяем количество устройств, которое будет в одном такте, например 15. И погнали
Код: Выделить всё
# Берём содержимое файла
:local con [/file get [find name=1.txt] contents];
# Определяем такт работы
:for r from=0 to=599 step=15 do={
# Осуществляем выборку МАС-адресов
:for n from=(0+$r) to=(14+$r) do={
:put [:pick $con (19 * $n) ([:find $con "\r\n"] + (19 * $n))];
}}
Вместо :put можно начинать работать с получаемыми значениями. Как-то так...
Но работать он будет ой долго...
А-а-а-а, перечитал стартовый пост. Так вы из аксцесс-листа хотите извлечь МАС-адреса? Принцип тот же. Вам нужны всего несколько активных адресов. Делаем весь лист disabled=yes и запускаем скрипт
Код: Выделить всё
:for r from=0 to=599 step=15 do={
:for n from=(0+$r) to=(14+$r) do={
/interface wireless access-list set disabled=no numbers=$n
};
:delay 5;
/interface wireless access-list set [find disabled=no] disabled=yes;
:delay 5;
}
Но надо прикручивать проверку на неполный такт, а то он завершается на первой половине цикла .... Из-за этого на последнем цикле скрипт вылетает и последние МАСи остаются включенными. Я не придумал, как обойти эту ерунду. Может кто-то и подскажет, тогда можно будет слепить полноценное решение.
А так, меняйте паузы между тактами, прикручивайте выполнение любых задач, всё должно отработать.
Благодарю, но вы меня немного не поняли, у меня нет списка мак адресов, будь он у меня, все было бы проще. Его нужно извлечь из arp-таблицы подключенных устройств.
ВАЖНО не из аксес листа, а из регистрэйшен листа WI-FI. То есть устройства мне заранее не известные.
Re: Прошу Помощи
Добавлено: 03 ноя 2019, 15:41
ZeaZee
Ca6ko писал(а): ↑01 ноя 2019, 19:24
60 устройств на точку это многовато. При зарегистрированных 100 клиентов 70 процентов времени в эфире вещают их маяки. Поэтому скорости очень низкие.
Не рекомендуют подключать больше 30 работающих.
Вариант добавить несколько точек и под Capsman. Точки разнести в пространстве и понизить мощность до нужных значений. Устройства ведь по помещению разнесены?
Команды можете посмотреть в этой теме
viewtopic.php?f=14&t=8516
Cпасибо это интересно
Re: Прошу Помощи
Добавлено: 03 ноя 2019, 17:27
podarok66
ZeaZee писал(а): ↑03 ноя 2019, 15:20
Благодарю, но вы меня немного не поняли, у меня нет списка мак адресов, будь он у меня, все было бы проще. Его нужно извлечь из arp-таблицы подключенных устройств.
ВАЖНО не из аксес листа, а из регистрэйшен листа WI-FI. То есть устройства мне заранее не известные.
Да какая разница, откуда извлекать-то? Вот отдайте команду в терминале и посмотрите, что у вас выйдет...
Код: Выделить всё
:for y from=0 to=30 do={:put [/ip arp get number=$y mac-address ]}
Или так, тогда без ошибки выйдет в конце
Код: Выделить всё
:foreach in=[/ip arp find disabled=no] e do={:put [/ip arp get $e mac-address]}
Ну и порежьте результат, как вам надо. Мы же не в бюро заказов, направление есть, дальше самостоятельно.

Re: Прошу Помощи
Добавлено: 03 ноя 2019, 17:42
ZeaZee
podarok66 писал(а): ↑03 ноя 2019, 17:27
ZeaZee писал(а): ↑03 ноя 2019, 15:20
Благодарю, но вы меня немного не поняли, у меня нет списка мак адресов, будь он у меня, все было бы проще. Его нужно извлечь из arp-таблицы подключенных устройств.
ВАЖНО не из аксес листа, а из регистрэйшен листа WI-FI. То есть устройства мне заранее не известные.
Да какая разница, откуда извлекать-то? Вот отдайте команду в терминале и посмотрите, что у вас выйдет...
Код: Выделить всё
:for y from=0 to=30 do={:put [/ip arp get number=$y mac-address ]}
Или так, тогда без ошибки выйдет в конце
Код: Выделить всё
:foreach in=[/ip arp find disabled=no] e do={:put [/ip arp get $e mac-address]}
Ну и порежьте результат, как вам надо. Мы же не в бюро заказов, направление есть, дальше самостоятельно.
Прошу прощения, но там и тона притензии не было, я начал отвечать не дочитав до конца, вы мне очень помогли, думаю справлюсь дальше, как доделаю скину скрипт с пояснениями.
Спасибо огромное, извините за недопонимание.
Re: Прошу Помощи
Добавлено: 03 ноя 2019, 17:52
podarok66
Да я вроде как и не обижался

У меня выходной, на улице ужас, родные кто в театре, кто в сети, вот я и занимаюсь не пойми чем. Но я пока не понял, как вы там совладаете с такими огромными таблицами. Вы скажите, сколько по времени занимает полная операция с одним устройством?
Кстати, с registration table я не могу проверить, у меня всё в доме через CAPsMAN управляется.

Если надо из него извлечь, то тут легко.
Вот кстати пришла в голову идея, часть устройств отключать от сети на время, пока меня нет дома. А определять, дома ли я, можно именно по этой таблице

(wifi в телефоне включен всегда)
Re: Прошу Помощи
Добавлено: 04 ноя 2019, 21:33
podarok66
Моё любопытство мне не давало спать

Я всё же хотел понять логику всего этого дела. Чтобы и выбирало МАС-адреса, и формировало пулы по заданному количеству адресов, и завершало скрипт нормально. Что в действительности будет делать скрипт, мне параллельно, а вот сама логика мне весь отдых испортила. ТС, мои поздравления, давно мне не было так интересно
Итак, попробую пояснить ход работы скрипта:
Код: Выделить всё
# Создаём переменную в виде массива, по моему мнению, очень подходяще для данного случая
global t [:toarray []];
# Наполняем массив. Тут важно понять, что неважно, откуда мы его наполним, главное понять сам принцип наполнения.
# Если действительно упёрлись в таблицу регистрации, то там строка будет типа /interface wireless registration-table find interface=bridge
# и вторая /interface wireless registration-table get $i mac-address . Мне просто не на чем было протестировать скрипт именно в этом месте
# поэтому брал оттуда, где у меня есть "жертвы" моих экспериментов
:foreach i in=[/ip arp find interface=bridge] do={
:local y [/ip arp get $i mac-address];
set t ($t, $y);
}
# Это отладочная команда, чтобы видеть, что информация у меня загружена в массив
#:put $t;
# Куча переменных. Начало отсчёта, у Микротиков начинается с нуля
:local nt 0;
# Количество элементов в массиве
:local ln [:len $t];
# Количество МАС-адресов в одном такте
:local stp 15;
# Номер последнего элемента массива
:local ky ($ln - 1);
# Количество тактов, в которых количество элементов будет $stp
:local ks ($ln / $stp);
# Количество элементов, обрабатываемых за $ks тактов
:local lnnew ($ks * $stp);
# Номер последнего элемента в $lnnew
:local ost ($lnnew - 1);
# начинаем обрабатывать, делим массив на такты и в каждом такте обрабатываем
:for nb from=$nt to=$ost step=$stp do={
:for gb from=$nt to=($stp - 1) do={
# Это именно то место, где должны быть команды, которые выполняются в отношении элементов массива,
# которые собраны в одном такте, например включить для них доступ.
:put ($t->$gb);
};
# Здесь команда для всего актуального такта, например :delay 100;
:put "Next";
# Если затем требуется ещё какие-то команды для каждого элемента, создаём аналогичный блок
# :for gb from=$nt to=($stp - 1) do={
# :put ($t->$gb);
# };
}
# Осталось обработать остатки массива. Принципы прописывания команд те же самые, включая сказанное о дополнительном блоке
:for nbost from=$lnnew to=$ky do={
:put ($t->nbost);
}
:put "It's stop";