новая функция FuncActIface

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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

# Функция определения активного шлюза (маршрута в Мир)
# not for ROS7 !
# by Sertik version 03/11/2020
# update 22/09/2022
# если активных маршрутов нет возвращает "not found"
# если нет активных маршрутов, через которые пингуется $pingAdr возвращает "not reachable"
# при наличии активного маршрута, достигающего пингом $pingAdr возвращает gateway, а
# в global ActiveRoutingMark дополнительно возвращает метку (routing-mark) активного маршрута (если он не меченный, метка пуста)

:global FuncActIface do={
   :if ([:len $0]!=0) do={
:local GatewayStatus; :local activeGateway; :local Gdistance; :local activeInterface; :local RoutingMark;
:local ActIfacePing; :global ActiveRoutingMark;
:local ACdistance; :local ACGetway; :local ACRMark;
:local counter; :local Keep 0;
:local pingAdr 8.8.8.8;
:local pingCount 5;
:local PingActNum 3;

/ip route
   :foreach counter in=[find dst-address=0.0.0.0/0] do={
     :if ([get $counter active] = true) do={
       :set $activeGateway [get $counter gateway];
       :set $Gdistance [get $counter distance];
       :set $RoutingMark [get $counter routing-mark];
          :if ($activeGateway!=nothing) do={
             :if ([:len $RoutingMark]!=0) do={
               :set $GatewayStatus [ :tostr [ /ip route get \
               [ find gateway=$activeGateway dst-address=0.0.0.0/0 \
                distance=$Gdistance routing-mark=$RoutingMark] gateway-status]];
              } else={
               :set $GatewayStatus [ :tostr [ /ip route get \
               [ find gateway=$activeGateway dst-address=0.0.0.0/0 \
               distance=$Gdistance] gateway-status]];}

             :if ([:find $GatewayStatus "via"] > 0) do={
               :set $activeInterface [ :pick $GatewayStatus \
               ([ :len [ :pick $GatewayStatus 0 [ :find $GatewayStatus "via" ] ] ] + [:len "via"] +2 ) \
               [ :len $GatewayStatus ]];
              } else={ 
               :set $activeInterface [ :pick $GatewayStatus 0 ([:find $GatewayStatus "reachable"]-1)];
               :if ([:len [:pick $GatewayStatus [:find $GatewayStatus "reachable"] [:len $GatewayStatus]]]>[:len "reachable"]) do={
               :set $activeInterface [:pick $GatewayStatus ([:find $GatewayStatus "reachable"]+[:len "reachable"]+1) [:len $GatewayStatus]]}}
             :if ([:len $RoutingMark]=0) do={
             :set $ActIfacePing [/ping $pingAdr interface=$activeInterface count=$pingCount];
              } else={
             :set $ActIfacePing [/ping $pingAdr interface=$activeInterface count=$pingCount routing=$RoutingMark]}
             :if ($ActIfacePing>=$PingActNum) do={
               :if ($Keep=0) do={
                :set $ACGetway $activeInterface;
                :set $ACdistance $Gdistance; :set $ACRMark $RoutingMark;
                :set $ActiveRoutingMark $RoutingMark; :set $Keep ($Keep+1)}
             :if (($Keep>0) && ($Gdistance<=$ACdistance)) do={
                :set $ACGetway $activeInterface; :set $ACdistance $Gdistance;
                :set $ACRMark $RoutingMark; :set $ActiveRoutingMark $RoutingMark;
                :set $Keep ($Keep+1)}
            } else={:set $activeInterface "not reacheable";}
       } else={:set $activeInterface "not found";}
    }
   }
  :if ($Keep!=0) do={:return $ACGetway} else={:return $activeInterface}
 }
}

# :log info [$FuncActIface]
Последний раз редактировалось Sertik 23 сен 2022, 14:27, всего редактировалось 1 раз.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить