Всем привет! В CAPsMAN можно вывести список всех зарегистрированных клиентов на всех CAP интерфейсах. Видны MAC-адрес клиента и интерфейс. Но то, чего не видно — это DHCP-имя клиента и к какой точке доступа он подключён. Я написал скрипт, который выводит именно эту информацию. Вот что вы получите:
MAC IP Клиент Точка доступа Сигнал TX скорость RX скорость Время работы Байт Пакетов Интерфейс
FF:FF:FF:11:3E:9C 192.168.12.251 Client01 AccessPoint01 -53 117Mbps 12Mbps 5d01:54:54 68431014,22847922 286257,200633 cap14
FF:FF:FF:11:76:9A 192.168.12.250 Client02 AccessPoint03 -75 16Mbps 12Mbps 1d10:54:53 68123014,54347922 286257,200633 cap12
Вот мой скрипт:
:global fill do={
# эта функция заполняет строку символом до заданной длины — чтобы сделать табличный вывод значений
# 3 параметра: #1 строка для заполнения
# #2 длина, до которой заполняется (или обрезается)
# #3 символ для заполнения (или разделитель, если обрезаем)
# если длина строки больше или равна длине параметра минус 1, строка обрезается до length-1 и в конце добавляется символ-разделитель
:local STR $1;
:local LEN $2;
:local CHAR $3;
:if ([:len $STR] >= $LEN) do={
# строка обрезается
:set STR ([:pick $STR 0 ($LEN-1)].$CHAR);
} else {
# строка дополняется до длины
:for i from=1 to=($LEN-[:len $STR]) step=1 do={
:set STR ("$STR" . $CHAR);
}
}
:return $STR;
}
:put ([$fill "MAC" 19 " "].[$fill "IP" 17 " "].[$fill "Client" 12 " "].[$fill "AP" 16 " "].[$fill "Signal" 7 " "].[$fill "TX Rate" 11 " "].[$fill "RX Rate" 11 " "].[$fill "Uptime" 14 " "].[$fill "Bytes" 20 " "].[$fill "Packets" 20 " "]."Interface");
:foreach i in=[/caps-man registration-table find .id] do={
:local locMAC [/caps-man registration-table get $i mac-address];
:local locInt [/caps-man registration-table get $i interface];
:local locSignal [/caps-man registration-table get $i rx-signal];
:local loctxRate [/caps-man registration-table get $i tx-rate];
# сокращаем до значимого: "173.3Mbps-20MHz/2S/SGI" --> "173.3Mbps"
:if ([:find $loctxRate "-" -1] > 0) do={ :set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]];}
:local locrxRate [/caps-man registration-table get $i rx-rate];
:if ([:find $locrxRate "-" -1] > 0) do={ :set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]];}
:local locUptime [/caps-man registration-table get $i uptime];
:set locUptime [:pick $locUptime 0 [:find $locUptime "." -1]];
:local locBytes [/caps-man registration-table get $i bytes];
:local locPack [/caps-man registration-table get $i packets];
:local locRadMAC [/caps-man interface get [/caps-man interface find name=$locInt] radio-mac];
:local locCAP [/caps-man radio get [/caps-man radio find radio-mac=$locRadMAC] remote-cap-identity];
:local locIP [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] address];
:local locName [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] host-name];
:put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 16 " "].[$fill $locSignal 7 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 20 " "].[$fill $locPack 20 " "]."$locInt");
}
С уважением,
Bernhard
MAC IP Клиент Точка доступа Сигнал TX скорость RX скорость Время работы Байт Пакетов Интерфейс
FF:FF:FF:11:3E:9C 192.168.12.251 Client01 AccessPoint01 -53 117Mbps 12Mbps 5d01:54:54 68431014,22847922 286257,200633 cap14
FF:FF:FF:11:76:9A 192.168.12.250 Client02 AccessPoint03 -75 16Mbps 12Mbps 1d10:54:53 68123014,54347922 286257,200633 cap12
Вот мой скрипт:
:global fill do={
# эта функция заполняет строку символом до заданной длины — чтобы сделать табличный вывод значений
# 3 параметра: #1 строка для заполнения
# #2 длина, до которой заполняется (или обрезается)
# #3 символ для заполнения (или разделитель, если обрезаем)
# если длина строки больше или равна длине параметра минус 1, строка обрезается до length-1 и в конце добавляется символ-разделитель
:local STR $1;
:local LEN $2;
:local CHAR $3;
:if ([:len $STR] >= $LEN) do={
# строка обрезается
:set STR ([:pick $STR 0 ($LEN-1)].$CHAR);
} else {
# строка дополняется до длины
:for i from=1 to=($LEN-[:len $STR]) step=1 do={
:set STR ("$STR" . $CHAR);
}
}
:return $STR;
}
:put ([$fill "MAC" 19 " "].[$fill "IP" 17 " "].[$fill "Client" 12 " "].[$fill "AP" 16 " "].[$fill "Signal" 7 " "].[$fill "TX Rate" 11 " "].[$fill "RX Rate" 11 " "].[$fill "Uptime" 14 " "].[$fill "Bytes" 20 " "].[$fill "Packets" 20 " "]."Interface");
:foreach i in=[/caps-man registration-table find .id] do={
:local locMAC [/caps-man registration-table get $i mac-address];
:local locInt [/caps-man registration-table get $i interface];
:local locSignal [/caps-man registration-table get $i rx-signal];
:local loctxRate [/caps-man registration-table get $i tx-rate];
# сокращаем до значимого: "173.3Mbps-20MHz/2S/SGI" --> "173.3Mbps"
:if ([:find $loctxRate "-" -1] > 0) do={ :set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]];}
:local locrxRate [/caps-man registration-table get $i rx-rate];
:if ([:find $locrxRate "-" -1] > 0) do={ :set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]];}
:local locUptime [/caps-man registration-table get $i uptime];
:set locUptime [:pick $locUptime 0 [:find $locUptime "." -1]];
:local locBytes [/caps-man registration-table get $i bytes];
:local locPack [/caps-man registration-table get $i packets];
:local locRadMAC [/caps-man interface get [/caps-man interface find name=$locInt] radio-mac];
:local locCAP [/caps-man radio get [/caps-man radio find radio-mac=$locRadMAC] remote-cap-identity];
:local locIP [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] address];
:local locName [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] host-name];
:put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 16 " "].[$fill $locSignal 7 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 20 " "].[$fill $locPack 20 " "]."$locInt");
}
С уважением,
Bernhard
