Скрипт вывода списка подключенных к роутеру устройств

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Всех приветствую.

Подправил скрипт. Проверяйте.

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


# Script for building a network table
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.47
# updated 2020/09/14

# interface list
:global interfaceIndexArray 0;
:global interfaceArray {"";"";"";""};
foreach interfaceIndex in=[ /interface find running=yes; ] do={
    :local interfaceName         ([ /interface get $interfaceIndex name; ]);
    :local interfaceHost         ([ /system resource get board-name; ]);
    :local interfaceMAC          ([ /interface get $interfaceIndex mac-address; ]);
    :local interfaceComment      ([ /interface get $interfaceIndex comment; ]);
    :set ($interfaceArray->$interfaceIndexArray) {$interfaceName;$interfaceHost;$interfaceMAC;$interfaceComment};
    :set interfaceIndexArray ($interfaceIndexArray + 1);
}
:set interfaceIndexArray ($interfaceIndexArray - 1);

# interface bridge host list
:global bridgeHostIndexArray 0;
:global bridgeHostArray {"";"";"";"";"";""};
foreach bridgeHost in=[ /interface bridge host find; ] do={
    :do {
        :local hostInterface     ([ /interface bridge host get $bridgeHost on-interface; ]);
        :local hostMAC           ([ /interface bridge host get $bridgeHost mac-address; ]);
        :local hostBridge        ([ /interface bridge host get $bridgeHost bridge; ]);
        :local hostComment       ("");
        :local hostName          ("");
        :local hostIP            ("");
        if ([ /interface bridge host get $bridgeHost local; ] = true) do={ 
            :set hostName        ([ /system resource get board-name; ]);
            :set hostIP          ([ /ip address get [ find interface=$hostBridge ] address; ]);
        } else={
            :do {
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] address; ]);
                :set hostComment ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] comment; ]);
            } on-error={ 
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] address; ]);
            }
        }
        :set ($bridgeHostArray->$bridgeHostIndexArray) {$hostInterface;$hostName;$hostMAC;$hostIP;$hostBridge;$hostComment};
        :set bridgeHostIndexArray ($bridgeHostIndexArray + 1);
    } on-error={ }
}
:set bridgeHostIndexArray ($bridgeHostIndexArray - 1);

# ip address list
:global ipAddressIndexArray 0;
:global ipAddressArray {"";"";"";""};
foreach ipAddress in=([ /ip address find; ]) do={
    :local ipAddressInterface    ([ /ip address get $ipAddress interface; ]); 
    :local ipAddressIP           ([ /ip address get $ipAddress address; ]); 
    :local ipAddressNetwork      ([ /ip address get $ipAddress network; ]);
    :local ipAddressComment      ([ /ip address get $ipAddress comment; ]);
    :set ($ipAddressArray->$ipAddressIndexArray) {$ipAddressInterface;$ipAddressIP;$ipAddressNetwork;$ipAddressComment};
    :set ipAddressIndexArray ($ipAddressIndexArray + 1);
}
:set ipAddressIndexArray ($ipAddressIndexArray - 1);

# ip arp list
:global ipArpIndexArray 0;
:global ipArpArray {"";"";"";"";""}; 
foreach ipArp in=([ /ip arp find; ]) do={
    :local ipArpInterface        ([ /ip arp get $ipArp interface; ]); 
    :local ipArpMACAddress       ([ /ip arp get $ipArp mac-address; ]);
    :local ipArpIP               ([ /ip arp get $ipArp address; ]); 
    :local ipArpComment          ([ /ip arp get $ipArp comment; ]);
    :local ipArpName             ("");
    :do { 
        :set ipArpName           ([ /ip dhcp-client get [find interface=$ipArpInterface ] gateway ]); 
    } on-error={ }
    if ($ipArpName = $ipArpIP) do={ :set ipArpName ("GATEWAY"); }
    :local equalMACAddress (false);
    for i from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($ipArpMACAddress) in=($bridgeHostArray->$i)];
        if ([:tostr [$findDestination]] != "") do={ :set equalMACAddress (true); }
    }
    if ($equalMACAddress = false) do={
        :set ($ipArpArray->$ipArpIndexArray) {$ipArpInterface;$ipArpMACAddress;$ipArpIP;$ipArpComment;$ipArpName};
        :set ipArpIndexArray ($ipArpIndexArray + 1);
    }
}
:set ipArpIndexArray ($ipArpIndexArray - 1);

# build new list
:global newIndexArray 2;
:global newArray {"";"";"";"";"";"";""};
:set ($newArray->0) {"NUMBER";"INTERFACE";"HOST NAME";"MAC ADDRESS";"IP ADDRESS";"NETWORK";"COMMENT"};
:set ($newArray->1) {"";"";"";"";"";"";""};
for i from=0 to=$interfaceIndexArray do={
    for j from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($bridgeHostArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "" && ($bridgeHostArray->$j->4) != ($bridgeHostArray->$j->0)) do={
            if (($bridgeHostArray->$j->2) = ($interfaceArray->$i->2)) do={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($interfaceArray->$i->3)}; 
            } else={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($bridgeHostArray->$j->5)}; 
            }
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipArpIndexArray do={
        :local findDestination [:find key=($ipArpArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($ipArpArray->$j->0);($ipArpArray->$j->4);($ipArpArray->$j->1);($ipArpArray->$j->2);"";($ipArpArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipAddressIndexArray do={
        :local findDestination [:find key=($interfaceArray->$i->0) in=($ipAddressArray->$j)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($interfaceArray->$i->0);($interfaceArray->$i->1);($interfaceArray->$i->2);($ipAddressArray->$j->1);($ipAddressArray->$j->2);($interfaceArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
}
:set newIndexArray ($newIndexArray - 1);

# list output to terminal
for i from=0 to=$newIndexArray do={
    :set ($newArray->$i->0) ([:pick [:tostr [($newArray->$i->0 . "                         ")]] 0  6 ]);
    :set ($newArray->$i->1) ([:pick [:tostr [($newArray->$i->1 . "                         ")]] 0 21 ]);
    :set ($newArray->$i->2) ([:pick [:tostr [($newArray->$i->2 . "                         ")]] 0 25 ]);
    :set ($newArray->$i->3) ([:pick [:tostr [($newArray->$i->3 . "                         ")]] 0 19 ]);
    :set ($newArray->$i->4) ([:pick [:tostr [($newArray->$i->4 . "                         ")]] 0 20 ]);
    :set ($newArray->$i->5) ([:pick [:tostr [($newArray->$i->5 . "                         ")]] 0 17 ]);
    :set ($newArray->$i->6) ([:pick [:tostr [($newArray->$i->6 . "                         ")]] 0 35 ]);
    :put (($newArray->$i->0)." ".($newArray->$i->1)." ".($newArray->$i->2)." ".($newArray->$i->3)." ".($newArray->$i->4)." ".($newArray->$i->5)." ".($newArray->$i->6));
}

# clearing variables
:set interfaceIndexArray (:);
:set interfaceArray (:);
:set bridgeHostIndexArray (:);
:set bridgeHostArray (:);
:set ipAddressIndexArray (:);
:set ipAddressArray (:);
:set ipArpIndexArray (:);
:set ipArpArray (:);
:set newIndexArray (:);
:set newArray (:);

Замечания/улучшения приветствуются.


yarvelov
Сообщения: 92
Зарегистрирован: 15 июл 2018, 02:08

На моих железках вывод идентичен прошлой версии, что-то должно было измениться?


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день
yarvelov писал(а): 14 сен 2020, 08:32 На моих железках вывод идентичен прошлой версии, что-то должно было измениться?
Должны появиться устройства из ip arp, отсутствующие в ip dhcp.
У вас не появились?


yarvelov
Сообщения: 92
Зарегистрирован: 15 июл 2018, 02:08

drpioneer писал(а): 14 сен 2020, 08:43 Добрый день
yarvelov писал(а): 14 сен 2020, 08:32 На моих железках вывод идентичен прошлой версии, что-то должно было измениться?
Должны появиться устройства из ip arp, отсутствующие в ip dhcp.
У вас не появились?
Добрый день
Да, видно на бридже их, не на портах самих, так должно быть?


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую.
yarvelov писал(а): 14 сен 2020, 09:31 Да, видно на бридже их, не на портах самих, так должно быть?
Недочёт подправил. Проверяйте.

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


# Script for building a network table
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.47
# updated 2020/09/25

# interface list
:global interfaceIndexArray 0;
:global interfaceArray {"";"";"";""};
foreach interfaceIndex in=[ /interface find running=yes; ] do={
    :local interfaceName         ([ /interface get $interfaceIndex name; ]);
    :local interfaceHost         ([ /system resource get board-name; ]);
    :local interfaceMAC          ([ /interface get $interfaceIndex mac-address; ]);
    :local interfaceComment      ([ /interface get $interfaceIndex comment; ]);
    :set ($interfaceArray->$interfaceIndexArray) {$interfaceName;$interfaceHost;$interfaceMAC;$interfaceComment};
    :set interfaceIndexArray ($interfaceIndexArray + 1);
}
:set interfaceIndexArray ($interfaceIndexArray - 1);

# interface bridge host list
:global bridgeHostIndexArray 0;
:global bridgeHostArray {"";"";"";"";"";""};
foreach bridgeHost in=[ /interface bridge host find; ] do={
    :do {
        :local hostInterface     ([ /interface bridge host get $bridgeHost on-interface; ]);
        :local hostMAC           ([ /interface bridge host get $bridgeHost mac-address; ]);
        :local hostBridge        ([ /interface bridge host get $bridgeHost bridge; ]);
        :local hostComment       ("");
        :local hostName          ("");
        :local hostIP            ("");
        if ([ /interface bridge host get $bridgeHost local; ] = true) do={ 
            :set hostName        ([ /system resource get board-name; ]);
            :set hostIP          ([ /ip address get [ find interface=$hostBridge ] address; ]);
        } else={
            :do {
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] address; ]);
                :set hostComment ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] comment; ]);
            } on-error={ 
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] address; ]);
            }
        }
        :set ($bridgeHostArray->$bridgeHostIndexArray) {$hostInterface;$hostName;$hostMAC;$hostIP;$hostBridge;$hostComment};
        :set bridgeHostIndexArray ($bridgeHostIndexArray + 1);
    } on-error={ }
}
:set bridgeHostIndexArray ($bridgeHostIndexArray - 1);

# ip address list
:global ipAddressIndexArray 0;
:global ipAddressArray {"";"";"";""};
foreach ipAddress in=([ /ip address find; ]) do={
    :local ipAddressInterface    ([ /ip address get $ipAddress interface; ]); 
    :local ipAddressIP           ([ /ip address get $ipAddress address; ]); 
    :local ipAddressNetwork      ([ /ip address get $ipAddress network; ]);
    :local ipAddressComment      ([ /ip address get $ipAddress comment; ]);
    :set ($ipAddressArray->$ipAddressIndexArray) {$ipAddressInterface;$ipAddressIP;$ipAddressNetwork;$ipAddressComment};
    :set ipAddressIndexArray ($ipAddressIndexArray + 1);
}
:set ipAddressIndexArray ($ipAddressIndexArray - 1);

# ip arp list
:global ipArpIndexArray 0;
:global ipArpArray {"";"";"";"";""}; 
foreach ipArp in=([ /ip arp find; ]) do={
    :local ipArpInterface        ([ /ip arp get $ipArp interface; ]); 
    :local ipArpMACAddress       ([ /ip arp get $ipArp mac-address; ]);
    :local ipArpIP               ([ /ip arp get $ipArp address; ]); 
    :local ipArpComment          ([ /ip arp get $ipArp comment; ]);
    :local ipArpNetwork          ("");
    :do { 
        :set ipArpNetwork        ([ /ip dhcp-client get [find interface=$ipArpInterface ] gateway ]); 
    } on-error={ }
    if ($ipArpNetwork = $ipArpIP) do={ :set ipArpNetwork ("GATEWAY"); }
    :local equalMACAddress (false);
    for i from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($ipArpMACAddress) in=($bridgeHostArray->$i)];
        if ([:tostr [$findDestination]] != "") do={ :set equalMACAddress (true); }
    }
    if ($equalMACAddress = false) do={
        :do {
            if ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ] != "") do={
                :set ipArpNetwork ($ipArpInterface);
                :set ipArpInterface ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ]);
            }
        } on-error={ }
        :set ($ipArpArray->$ipArpIndexArray) {$ipArpInterface;$ipArpMACAddress;$ipArpIP;$ipArpComment;$ipArpNetwork};
        :set ipArpIndexArray ($ipArpIndexArray + 1);
    }
}
:set ipArpIndexArray ($ipArpIndexArray - 1);

# build new list
:global newIndexArray 2;
:global newArray {"";"";"";"";"";"";""};
:set ($newArray->0) {"NUMBER";"INTERFACE";"HOST NAME";"MAC ADDRESS";"IP ADDRESS";"NETWORK";"COMMENT"};
:set ($newArray->1) {"";"";"";"";"";"";""};
for i from=0 to=$interfaceIndexArray do={
    for j from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($bridgeHostArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "" && ($bridgeHostArray->$j->4) != ($bridgeHostArray->$j->0)) do={
            if (($bridgeHostArray->$j->2) = ($interfaceArray->$i->2)) do={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($interfaceArray->$i->3)}; 
            } else={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($bridgeHostArray->$j->5)}; 
            }
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipArpIndexArray do={
        :local findDestination [:find key=($ipArpArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($ipArpArray->$j->0);"";($ipArpArray->$j->1);($ipArpArray->$j->2);($ipArpArray->$j->4);($ipArpArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipAddressIndexArray do={
        :local findDestination [:find key=($interfaceArray->$i->0) in=($ipAddressArray->$j)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($interfaceArray->$i->0);($interfaceArray->$i->1);($interfaceArray->$i->2);($ipAddressArray->$j->1);($ipAddressArray->$j->2);($interfaceArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
}
:set newIndexArray ($newIndexArray - 1);

# list output to terminal
for i from=0 to=$newIndexArray do={
    :set ($newArray->$i->0) ([:pick [:tostr [($newArray->$i->0 . "                         ")]] 0  6 ]);
    :set ($newArray->$i->1) ([:pick [:tostr [($newArray->$i->1 . "                         ")]] 0 21 ]);
    :set ($newArray->$i->2) ([:pick [:tostr [($newArray->$i->2 . "                         ")]] 0 25 ]);
    :set ($newArray->$i->3) ([:pick [:tostr [($newArray->$i->3 . "                         ")]] 0 19 ]);
    :set ($newArray->$i->4) ([:pick [:tostr [($newArray->$i->4 . "                         ")]] 0 20 ]);
    :set ($newArray->$i->5) ([:pick [:tostr [($newArray->$i->5 . "                         ")]] 0 17 ]);
    :set ($newArray->$i->6) ([:pick [:tostr [($newArray->$i->6 . "                         ")]] 0 35 ]);
    :put (($newArray->$i->0)." ".($newArray->$i->1)." ".($newArray->$i->2)." ".($newArray->$i->3)." ".($newArray->$i->4)." ".($newArray->$i->5)." ".($newArray->$i->6));
}

# clearing variables
:set interfaceIndexArray (:);
:set interfaceArray (:);
:set bridgeHostIndexArray (:);
:set bridgeHostArray (:);
:set ipAddressIndexArray (:);
:set ipAddressArray (:);
:set ipArpIndexArray (:);
:set ipArpArray (:);
:set newIndexArray (:);
:set newArray (:);

Ну и как всегда - замечания, улучшения только приветствуются.


yarvelov
Сообщения: 92
Зарегистрирован: 15 июл 2018, 02:08

drpioneer писал(а): 25 сен 2020, 02:34 Приветствую.
yarvelov писал(а): 14 сен 2020, 09:31 Да, видно на бридже их, не на портах самих, так должно быть?
Недочёт подправил. Проверяйте.

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


# Script for building a network table
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.47
# updated 2020/09/25

# interface list
:global interfaceIndexArray 0;
:global interfaceArray {"";"";"";""};
foreach interfaceIndex in=[ /interface find running=yes; ] do={
    :local interfaceName         ([ /interface get $interfaceIndex name; ]);
    :local interfaceHost         ([ /system resource get board-name; ]);
    :local interfaceMAC          ([ /interface get $interfaceIndex mac-address; ]);
    :local interfaceComment      ([ /interface get $interfaceIndex comment; ]);
    :set ($interfaceArray->$interfaceIndexArray) {$interfaceName;$interfaceHost;$interfaceMAC;$interfaceComment};
    :set interfaceIndexArray ($interfaceIndexArray + 1);
}
:set interfaceIndexArray ($interfaceIndexArray - 1);

# interface bridge host list
:global bridgeHostIndexArray 0;
:global bridgeHostArray {"";"";"";"";"";""};
foreach bridgeHost in=[ /interface bridge host find; ] do={
    :do {
        :local hostInterface     ([ /interface bridge host get $bridgeHost on-interface; ]);
        :local hostMAC           ([ /interface bridge host get $bridgeHost mac-address; ]);
        :local hostBridge        ([ /interface bridge host get $bridgeHost bridge; ]);
        :local hostComment       ("");
        :local hostName          ("");
        :local hostIP            ("");
        if ([ /interface bridge host get $bridgeHost local; ] = true) do={ 
            :set hostName        ([ /system resource get board-name; ]);
            :set hostIP          ([ /ip address get [ find interface=$hostBridge ] address; ]);
        } else={
            :do {
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] address; ]);
                :set hostComment ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] comment; ]);
            } on-error={ 
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] address; ]);
            }
        }
        :set ($bridgeHostArray->$bridgeHostIndexArray) {$hostInterface;$hostName;$hostMAC;$hostIP;$hostBridge;$hostComment};
        :set bridgeHostIndexArray ($bridgeHostIndexArray + 1);
    } on-error={ }
}
:set bridgeHostIndexArray ($bridgeHostIndexArray - 1);

# ip address list
:global ipAddressIndexArray 0;
:global ipAddressArray {"";"";"";""};
foreach ipAddress in=([ /ip address find; ]) do={
    :local ipAddressInterface    ([ /ip address get $ipAddress interface; ]); 
    :local ipAddressIP           ([ /ip address get $ipAddress address; ]); 
    :local ipAddressNetwork      ([ /ip address get $ipAddress network; ]);
    :local ipAddressComment      ([ /ip address get $ipAddress comment; ]);
    :set ($ipAddressArray->$ipAddressIndexArray) {$ipAddressInterface;$ipAddressIP;$ipAddressNetwork;$ipAddressComment};
    :set ipAddressIndexArray ($ipAddressIndexArray + 1);
}
:set ipAddressIndexArray ($ipAddressIndexArray - 1);

# ip arp list
:global ipArpIndexArray 0;
:global ipArpArray {"";"";"";"";""}; 
foreach ipArp in=([ /ip arp find; ]) do={
    :local ipArpInterface        ([ /ip arp get $ipArp interface; ]); 
    :local ipArpMACAddress       ([ /ip arp get $ipArp mac-address; ]);
    :local ipArpIP               ([ /ip arp get $ipArp address; ]); 
    :local ipArpComment          ([ /ip arp get $ipArp comment; ]);
    :local ipArpNetwork          ("");
    :do { 
        :set ipArpNetwork        ([ /ip dhcp-client get [find interface=$ipArpInterface ] gateway ]); 
    } on-error={ }
    if ($ipArpNetwork = $ipArpIP) do={ :set ipArpNetwork ("GATEWAY"); }
    :local equalMACAddress (false);
    for i from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($ipArpMACAddress) in=($bridgeHostArray->$i)];
        if ([:tostr [$findDestination]] != "") do={ :set equalMACAddress (true); }
    }
    if ($equalMACAddress = false) do={
        :do {
            if ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ] != "") do={
                :set ipArpNetwork ($ipArpInterface);
                :set ipArpInterface ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ]);
            }
        } on-error={ }
        :set ($ipArpArray->$ipArpIndexArray) {$ipArpInterface;$ipArpMACAddress;$ipArpIP;$ipArpComment;$ipArpNetwork};
        :set ipArpIndexArray ($ipArpIndexArray + 1);
    }
}
:set ipArpIndexArray ($ipArpIndexArray - 1);

# build new list
:global newIndexArray 2;
:global newArray {"";"";"";"";"";"";""};
:set ($newArray->0) {"NUMBER";"INTERFACE";"HOST NAME";"MAC ADDRESS";"IP ADDRESS";"NETWORK";"COMMENT"};
:set ($newArray->1) {"";"";"";"";"";"";""};
for i from=0 to=$interfaceIndexArray do={
    for j from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($bridgeHostArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "" && ($bridgeHostArray->$j->4) != ($bridgeHostArray->$j->0)) do={
            if (($bridgeHostArray->$j->2) = ($interfaceArray->$i->2)) do={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($interfaceArray->$i->3)}; 
            } else={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($bridgeHostArray->$j->5)}; 
            }
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipArpIndexArray do={
        :local findDestination [:find key=($ipArpArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($ipArpArray->$j->0);"";($ipArpArray->$j->1);($ipArpArray->$j->2);($ipArpArray->$j->4);($ipArpArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipAddressIndexArray do={
        :local findDestination [:find key=($interfaceArray->$i->0) in=($ipAddressArray->$j)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($interfaceArray->$i->0);($interfaceArray->$i->1);($interfaceArray->$i->2);($ipAddressArray->$j->1);($ipAddressArray->$j->2);($interfaceArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
}
:set newIndexArray ($newIndexArray - 1);

# list output to terminal
for i from=0 to=$newIndexArray do={
    :set ($newArray->$i->0) ([:pick [:tostr [($newArray->$i->0 . "                         ")]] 0  6 ]);
    :set ($newArray->$i->1) ([:pick [:tostr [($newArray->$i->1 . "                         ")]] 0 21 ]);
    :set ($newArray->$i->2) ([:pick [:tostr [($newArray->$i->2 . "                         ")]] 0 25 ]);
    :set ($newArray->$i->3) ([:pick [:tostr [($newArray->$i->3 . "                         ")]] 0 19 ]);
    :set ($newArray->$i->4) ([:pick [:tostr [($newArray->$i->4 . "                         ")]] 0 20 ]);
    :set ($newArray->$i->5) ([:pick [:tostr [($newArray->$i->5 . "                         ")]] 0 17 ]);
    :set ($newArray->$i->6) ([:pick [:tostr [($newArray->$i->6 . "                         ")]] 0 35 ]);
    :put (($newArray->$i->0)." ".($newArray->$i->1)." ".($newArray->$i->2)." ".($newArray->$i->3)." ".($newArray->$i->4)." ".($newArray->$i->5)." ".($newArray->$i->6));
}

# clearing variables
:set interfaceIndexArray (:);
:set interfaceArray (:);
:set bridgeHostIndexArray (:);
:set bridgeHostArray (:);
:set ipAddressIndexArray (:);
:set ipAddressArray (:);
:set ipArpIndexArray (:);
:set ipArpArray (:);
:set newIndexArray (:);
:set newArray (:);

Ну и как всегда - замечания, улучшения только приветствуются.
Добрый день! Похоже все теперь на местах)


sergs
Сообщения: 1
Зарегистрирован: 28 сен 2020, 09:04

Идея скрипта классная, жаль что у меня не работает, вот вывод:

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

NUMBER INTERFACE             HOST NAME                 MAC ADDRESS         IP ADDRESS           NETWORK           COMMENT                            
                                                                                                                                                     
1      ether1                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CB   192.168.0.251/24     bridge1           
2      ether2                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CC   192.168.0.251/24     bridge1                                    
3      ether3                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CD   192.168.0.251/24     bridge1                                    
4      ether5                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CF   192.168.0.251/24     bridge1                                    
5      ether7                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:D1   192.168.0.251/24     bridge1                                    
...                           
38     bridge1               CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CB   192.168.0.251/24     192.168.0.0     
Дело в том, что этот CRS работает как switch и не является шлюзом по умолчанию иip/arp пустой !

в данном случае лучше список MAC адресов и на каких они интерфейсах получать в bridge/hosts
затем командой tool ip-scan получить соответствие MACу IP и DNS имя!
остается сопоставить интерфейсы по мак адресам с остальной информацией и свести все в одну таблицу.


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Вот интересно, почему в комментах подключённых устройств всегда один и тот же коммент пишет? В частности в моём примере HT20

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

NUMBER INTERFACE             HOST NAME                 MAC ADDRESS         IP ADDRESS           NETWORK           COMMENT                         
                                                                                                                                           
1      ether2                                          00:13:19:3A:D0:80   172.27.39.1          GATEWAY           TV                         
2      ether2                RB951Ui-2HnD              C8:0A:A9:D5:2B:0A   172.27.35.27/21      172.27.32.0       Default config                     
3      ether5                RB951Ui-2HnD              D4:CA:6D:91:20:8B   192.168.100.10/24    bridge            In TVHost                         
4      Mikrotik                                        20:A6:0C:11:64:45   192.168.100.99       bridge            Guest-sep/23/2020-17:35:24         
5      Mikrotik              Honor_10_Lite-dc3a246b537 44:55:C4:1A:F3:EE   192.168.100.97       bridge            Guest-sep/26/2020-23:38:40         
6      bridge                                          F4:7B:5E:68:A9:AD   192.168.100.25                         HT20                         
7      bridge                                          C4:46:19:3B:41:52   192.168.100.34                         HT20                         
8      bridge                                          F8:3F:51:77:0B:1E   192.168.100.75                         HT20                         
9      bridge                                          00:03:AB:E5:15:32   192.168.100.77                         HT20                         
10     bridge                                          D4:CA:6D:90:41:64   192.168.100.33                         HT20                         
11     bridge                RB951Ui-2HnD              D4:CA:6D:CA:35:21   192.168.100.10/24    192.168.100.0                              
12     loopback              RB951Ui-2HnD              62:D7:B9:1F:F2:EB   10.255.255.2/32      10.255.255.2                               
13     ovpn-out-1195-DO      RB951Ui-2HnD              02:94:A4:CE:0F:21   10.12.0.6/32         10.12.0.5                                  
14     ovpn-out-DO           RB951Ui-2HnD              02:94:A4:CE:0F:21   10.9.0.3/32          10.9.0.1                                   
15     sstp-out1             RB951Ui-2HnD                                  10.10.10.2/32        10.10.10.1                


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

у меня кстати, тоже самое.. копирует коммент, причем сам коммент не соответствует ни одной из этих записей (это про второй коммент), а с первым все верно:
NUMBER INTERFACE HOST NAME MAC ADDRESS IP ADDRESS NETWORK COMMENT

1 ether1 гыук-pc FC:AA:14:7E:F5:F8 192.168.88.254 bridge1-local pc_new
2 ether2-efr B8:A3:86:4C:E3:C3 192.168.54.79 bridge2-efr andryuha
3 ether2-efr 00:04:96:4D:70:F8 192.168.54.1 bridge2-efr andryuha
4 ether2-efr 74:4D:28:49:C2:9D 192.168.54.21 bridge2-efr andryuha


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

podarok66 писал(а): 28 сен 2020, 20:31 почему в комментах подключённых устройств всегда один и тот же коммент пишет? В частности в моём примере HT20

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

6      bridge   F4:7B:5E:68:A9:AD   192.168.100.25    HT20
7      bridge   C4:46:19:3B:41:52   192.168.100.34    HT20
8      bridge   F8:3F:51:77:0B:1E   192.168.100.75    HT20
9      bridge   00:03:AB:E5:15:32   192.168.100.77    HT20
10     bridge   D4:CA:6D:90:41:64   192.168.100.33    HT20
Приветствую.
Добрался до скрипта. Нашёл ошибку, исправил. Проверяйте.

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


# Script for building a network table
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.47
# updated 2020/10/15

# interface list
:global interfaceIndexArray 0;
:global interfaceArray {"";"";"";""};
foreach interfaceIndex in=[ /interface find running=yes; ] do={
    :local interfaceName         ([ /interface get $interfaceIndex name; ]);
    :local interfaceHost         ([ /system resource get board-name; ]);
    :local interfaceMAC          ([ /interface get $interfaceIndex mac-address; ]);
    :local interfaceComment      ([ /interface get $interfaceIndex comment; ]);
    :set ($interfaceArray->$interfaceIndexArray) {$interfaceName;$interfaceHost;$interfaceMAC;$interfaceComment};
    :set interfaceIndexArray ($interfaceIndexArray + 1);
}
:set interfaceIndexArray ($interfaceIndexArray - 1);

# interface bridge host list
:global bridgeHostIndexArray 0;
:global bridgeHostArray {"";"";"";"";"";""};
foreach bridgeHost in=[ /interface bridge host find; ] do={
    :do {
        :local hostInterface     ([ /interface bridge host get $bridgeHost on-interface; ]);
        :local hostMAC           ([ /interface bridge host get $bridgeHost mac-address; ]);
        :local hostBridge        ([ /interface bridge host get $bridgeHost bridge; ]);
        :local hostComment       ("");
        :local hostName          ("");
        :local hostIP            ("");
        if ([ /interface bridge host get $bridgeHost local; ] = true) do={ 
            :set hostName        ([ /system resource get board-name; ]);
            :set hostIP          ([ /ip address get [ find interface=$hostBridge ] address; ]);
        } else={
            :do {
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] address; ]);
                :set hostComment ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] comment; ]);
            } on-error={ 
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] address; ]);
            }
        }
        :set ($bridgeHostArray->$bridgeHostIndexArray) {$hostInterface;$hostName;$hostMAC;$hostIP;$hostBridge;$hostComment};
        :set bridgeHostIndexArray ($bridgeHostIndexArray + 1);
    } on-error={ }
}
:set bridgeHostIndexArray ($bridgeHostIndexArray - 1);

# ip address list
:global ipAddressIndexArray 0;
:global ipAddressArray {"";"";"";""};
foreach ipAddress in=([ /ip address find; ]) do={
    :local ipAddressInterface    ([ /ip address get $ipAddress interface; ]); 
    :local ipAddressIP           ([ /ip address get $ipAddress address; ]); 
    :local ipAddressNetwork      ([ /ip address get $ipAddress network; ]);
    :local ipAddressComment      ([ /ip address get $ipAddress comment; ]);
    :set ($ipAddressArray->$ipAddressIndexArray) {$ipAddressInterface;$ipAddressIP;$ipAddressNetwork;$ipAddressComment};
    :set ipAddressIndexArray ($ipAddressIndexArray + 1);
}
:set ipAddressIndexArray ($ipAddressIndexArray - 1);

# ip arp list
:global ipArpIndexArray 0;
:global ipArpArray {"";"";"";"";""}; 
foreach ipArp in=([ /ip arp find; ]) do={
    :local ipArpInterface        ([ /ip arp get $ipArp interface; ]); 
    :local ipArpMACAddress       ([ /ip arp get $ipArp mac-address; ]);
    :local ipArpIP               ([ /ip arp get $ipArp address; ]); 
    :local ipArpComment          ([ /ip arp get $ipArp comment; ]);
    :local ipArpNetwork          ("");
    :do { 
        :set ipArpNetwork        ([ /ip dhcp-client get [find interface=$ipArpInterface ] gateway ]); 
    } on-error={ }
    if ($ipArpNetwork = $ipArpIP) do={ :set ipArpNetwork ("GATEWAY"); }
    :local equalMACAddress (false);
    for i from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($ipArpMACAddress) in=($bridgeHostArray->$i)];
        if ([:tostr [$findDestination]] != "") do={ :set equalMACAddress (true); }
    }
    if ($equalMACAddress = false) do={
        :do {
            if ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ] != "") do={
                :set ipArpNetwork ($ipArpInterface);
                :set ipArpInterface ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ]);
            }
        } on-error={ }
        :set ($ipArpArray->$ipArpIndexArray) {$ipArpInterface;$ipArpMACAddress;$ipArpIP;$ipArpNetwork;$ipArpComment};
        :set ipArpIndexArray ($ipArpIndexArray + 1);
    }
}
:set ipArpIndexArray ($ipArpIndexArray - 1);

# build new list
:global newIndexArray 2;
:global newArray {"";"";"";"";"";"";""};
:set ($newArray->0) {"NUMBER";"INTERFACE";"HOST NAME";"MAC ADDRESS";"IP ADDRESS";"NETWORK";"COMMENT"};
:set ($newArray->1) {"";"";"";"";"";"";""};
for i from=0 to=$interfaceIndexArray do={
    for j from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($bridgeHostArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "" && ($bridgeHostArray->$j->4) != ($bridgeHostArray->$j->0)) do={
            if (($bridgeHostArray->$j->2) = ($interfaceArray->$i->2)) do={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($interfaceArray->$i->3)}; 
            } else={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($bridgeHostArray->$j->5)}; 
            }
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipArpIndexArray do={
        :local findDestination [:find key=($ipArpArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($ipArpArray->$j->0);" >> IP/ARP <<";($ipArpArray->$j->1);($ipArpArray->$j->2);($ipArpArray->$j->3);($ipArpArray->$j->4)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipAddressIndexArray do={
        :local findDestination [:find key=($interfaceArray->$i->0) in=($ipAddressArray->$j)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($interfaceArray->$i->0);($interfaceArray->$i->1);($interfaceArray->$i->2);($ipAddressArray->$j->1);($ipAddressArray->$j->2);($interfaceArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
}
:set newIndexArray ($newIndexArray - 1);

# list output to terminal
for i from=0 to=$newIndexArray do={
    :set ($newArray->$i->0) ([:pick [:tostr [($newArray->$i->0 . "                         ")]] 0  6 ]);
    :set ($newArray->$i->1) ([:pick [:tostr [($newArray->$i->1 . "                         ")]] 0 21 ]);
    :set ($newArray->$i->2) ([:pick [:tostr [($newArray->$i->2 . "                         ")]] 0 25 ]);
    :set ($newArray->$i->3) ([:pick [:tostr [($newArray->$i->3 . "                         ")]] 0 19 ]);
    :set ($newArray->$i->4) ([:pick [:tostr [($newArray->$i->4 . "                         ")]] 0 20 ]);
    :set ($newArray->$i->5) ([:pick [:tostr [($newArray->$i->5 . "                         ")]] 0 17 ]);
    :set ($newArray->$i->6) ([:pick [:tostr [($newArray->$i->6 . "                         ")]] 0 35 ]);
    :put (($newArray->$i->0)." ".($newArray->$i->1)." ".($newArray->$i->2)." ".($newArray->$i->3)." ".($newArray->$i->4)." ".($newArray->$i->5)." ".($newArray->$i->6));
}

# clearing variables
:set interfaceIndexArray (:);
:set interfaceArray (:);
:set bridgeHostIndexArray (:);
:set bridgeHostArray (:);
:set ipAddressIndexArray (:);
:set ipAddressArray (:);
:set ipArpIndexArray (:);
:set ipArpArray (:);
:set newIndexArray (:);
:set newArray (:);

Замечания/улучшения приветствуются.


Ответить