nymurbd.MikroTik-scripts/mod/bridge-port-vlan
Christian Hesse 9942918580 mod/bridge-port-vlan: re-enable interfaces with longer delay...
... and in one go to limit the overall runtime.

Looks like IPv6 addresses are not flushed if the link down does not last
long enough (~ 2 seconds on linux). This results on stale addresses
after switching the vlan, which breaks connectivity.
2022-06-02 11:14:36 +02:00

70 lines
3.1 KiB
Text

#!rsc by RouterOS
# RouterOS script: mod/bridge-port-vlan
# Copyright (c) 2013-2022 Christian Hesse <mail@eworm.de>
# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md
#
# manage VLANs on bridge ports
# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md
:global BridgePortVlan;
:global BridgePortVlan do={
:local ConfigTo [ :tostr $1 ];
:global IfThenElse;
:global LogPrintExit2;
:global ParseKeyValueStore;
:foreach BridgePort in=[ /interface/bridge/port/find where !(comment=[]) ] do={
:local BridgePortVal [ /interface/bridge/port/get $BridgePort ];
:local InterfaceReEnable [ :toarray "" ];
:foreach Config,Vlan in=[ $ParseKeyValueStore ($BridgePortVal->"comment") ] do={
:if ($Config = $ConfigTo) do={
:local DHCPClient [ /ip/dhcp-client/find where interface=$BridgePortVal->"interface" comment="toggle with bridge port" ];
:if ($Vlan = "dhcp-client") do={
:if ([ :len $DHCPClient ] != 1) do={
$LogPrintExit2 warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \
" dhcp client configuration for interface " . $BridgePortVal->"interface" . "!") true;
}
:local DHCPClientDisabled [ /ip/dhcp-client/get $DHCPClient disabled ];
:if ($BridgePortVal->"disabled" = false || $DHCPClientDisabled = true) do={
$LogPrintExit2 info $0 ("Disabling bridge port for interface " . $BridgePortVal->"interface" . ", enabling dhcp client.") false;
/interface/bridge/port/disable $BridgePort;
:delay 200ms;
/ip/dhcp-client/enable $DHCPClient;
}
} else={
:if ($Vlan != [ :tostr [ :tonum $Vlan ] ]) do={
:do {
:set $Vlan ([ /interface/bridge/vlan/get [ find where comment=$Vlan ] vlan-ids ]->0);
} on-error={
$LogPrintExit2 warning $0 ("Could not find VLAN '" . $Vlan . "' for interface " . $BridgePortVal->"interface" . "!") true;
}
}
:if ($BridgePortVal->"disabled" = true || $Vlan != $BridgePortVal->"pvid") do={
$LogPrintExit2 info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $ConfigTo . \
" vlan " . $Vlan . ", disabling dhcp client.") false;
:if ([ :len $DHCPClient ] = 1) do={
/ip/dhcp-client/disable $DHCPClient;
:delay 200ms;
}
/interface/ethernet/disable [ find where name=$BridgePortVal->"interface" ];
/interface/bridge/port/set disabled=no pvid=$Vlan $BridgePort;
:set InterfaceReEnable ($InterfaceReEnable, $BridgePortVal->"interface");
} else={
$LogPrintExit2 debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $ConfigTo . \
" vlan " . $Vlan . ".") false;
}
}
}
}
:if ([ :len $InterfaceReEnable ] > 0) do={
:delay 2s;
:foreach Interface in=$InterfaceReEnable do={
/interface/ethernet/enable [ find where name=$Interface ];
}
}
}
}