Хорошая идея. Может и кому-то понадобится это интересное решение. Есть 50 абонентов подключенные через простые не управляемые swich-и. В роли сервера у нас Микротик. Всем раздается статический пул dhcp адресов, соответсвенно фиксированными мак адресами. Возникает проблема, когда кто то по неосторожности путает порты wan с lan на роутере. Так вот, немного уйдем от темы. При личных наблюдениях данной проблемы я заметил такой нюанс, что 99,9% роутеров всех производителей мак адреса wan и lan портов отличаются последние две, а от начала до последних двух символов совпадают. И я решил написать скрипт, который будет уведомлять о том, кто именно спутал порты.
вешаем на локальный интерфейс микротика dhcp-client, чтоб изнутри наш локальный интерфейс получал несанциональный ип по ошибке пользователя.
/ip dhcp-client add interface="Local" use-peer-dns="no" add-default-route="no" script="
и поехали..
:local tturlASH "https://api.telegram.org/botхххххххх:хххххххххх/sendmessage\?chat_id=хххххх&text=";
:local ttmessage "obnarujen DHCP ip na lokalke";
:local a;
:local dhcpgw;
:local arpall;
:local fmac;
:local macfound;
:local b;
:local g;
:local h;
:local i;
:local c;
:foreach a in=[/ip dhcp-client find interface=Local] do={:set dhcpgw [/ip dhcp-client get $a gateway];/ping $dhcpgw count=5};
:foreach arpall in=[/ip arp find where address=$dhcpgw] do={:set fmac [/ip arp get $arpall mac-address];:set fmac [:pick $fmac 0 ([:len $fmac]-2)]};
:foreach macfound in=[/ip dhcp-server lease find mac-address~"$fmac"] do={
/ip dhcp-server lease set $macfound comment="dhcpfound";
:foreach b in=[/ip dhcp-server lease find comment="dhcpfound"] do={
:set g [/ip dhcp-server lease get $b address];
:foreach h in=[/ip firewall address-list find address="$g"] do={
:if ($h != "") do={
:set i [/ip firewall address-list get $h comment];
/tool fetch url="$tturlASH $ttmessage %0A%0ADHCP SERVER IP ---> $dhcpgw %0A%0AADDRESS LIST ---> $i%0A%0ACLIENT IP ---> $g" keep-result=no;
} else={
:log warning message="ip not address list";
}
}
}
} else={:log warning message="not find mac-address in leases..."};
подробнее о функциях -->
ищем все что есть в Local, заносим в переменную dhcpgw шлюз незванного ип, далее пингуем, чтоб было гарантированно что он динамически отобразится в арп.
:foreach a in=[/ip dhcp-client find interface=Local] do={:set dhcpgw [/ip dhcp-client get $a gateway];/ping $dhcpgw count=5};
далее узнаем узнаем мак адрес и обрезаем последние два символа.
:foreach arpall in=[/ip arp find where address=$dhcpgw] do={:set fmac [/ip arp get $arpall mac-address];:set fmac [:pick $fmac 0 ([:len $fmac]-2)]};
далее ищем совпадения в lease с параметром ~ так как у нас обрезаны последние два символа.
в найденный результат заносим комент - dhcpfound, и извлекаем оттудо ип адрес уже пользовареля. Что и требовалось доказать!
:foreach macfound in=[/ip dhcp-server lease find mac-address~"$fmac"] do={
/ip dhcp-server lease set $macfound comment="dhcpfound";
:set g [/ip dhcp-server lease get $b address];
но так быстро...
далее скрипт должен найти совпадение в address-list по найденному ип, чтоб найти комент записи в котором указаны инициалы пользователя, для подготовки отчета на телеграм.
помогите исправить ошибки которые я допустил. у меня не работают комады else={ ,
и еще не могу понять как правильно сравнивать данные внутри переменных .
например с посредством :if ($h != "") я хотел бы указать то, что а вдруг мак адрес найден , а вот пользователь в адрес листе не найден, и то что если он не найден, не надо продолжать рабору скрипта, а надо с посредсвом else={ поменять подход и поиски в другом направлении, так как неккоторые пользоварели лежат в queue