|
gdy zamiera ruch na interfejsie - off/on
21-12-2014 19:00:00 Odwiedziny: 3440
Skrypt powstał z powodu problemów oprogramowania MikroTika. Napotkałem parę razy taka sytuacje, że interfejs radiowy, nie wiadomo z jakich powodów - zamierał. Był podłączony, ale ruchu żadnego. Dlatego napisałem skrypt który sprawdza czy idzie jakiś ruch na interfejsie, a jak jest go brak to interfejs zostaje wyłączał i włącza, a gdy nie daje to jakiegokolwiek rezultatu to restartuje Mikrotika.
## skrypt
############################################################################################
/system script add name=froze_traffic policy=read,reboot,write source={
# FrozeTraffic v0.03 [21-12-2014]
# Przeznaczony dla MikroTik v4.xx, v5.xx, v6.xx
# Sprawdza czy zamarl ruch na interfejsie
# wylacza/wlacza interfejsy
# restartuje routerborda
# Strona domowa: http://kazuko.pl
:local interface [:toarray ("dosyl","ether1")];
:local wykryjInterface false;
:local ileDisEnable 2;
:local ileReboot 30;
:local pokazWLogach true;
# interface - nazwy interfejsów
# wykryjInterface - automatycznie wykrywa interfejsy ethernet, wireless jakie są w mikrotiku
# ileDisEnable - po ilu razach braku ruchu ma wyłączyć i właczyć interfejs
# ileReboot - po ilu razach braku ruchu ma uruchomic ponownie routerborda
# pokazWLogach - czy ma pisać w logach co robi
:if ($wykryjInterface = true) do={
:foreach i in=[/interface wireless find] do={
:set interface ($interface, [/interface wireless get $i name]);
}
:foreach i in=[/interface ethernet find] do={
:set interface ($interface, [/interface ethernet get $i name]);
}
}
:global arrayFroze;
:local arrayFrozeOld $arrayFroze;
:set arrayFroze;
:for i from=0 to=([:len $interface]-1) do={
:local rx [/interface get [:pick $interface $i] value-name=rx-byte];
:local tx [/interface get [:pick $interface $i] value-name=tx-byte];
:local licznikFroze [:pick $arrayFrozeOld $i];
:local inter [:pick $interface $i];
:if ($rx != 0 and $tx != 0 and $licznikFroze != 0) do={
:if ($pokazWLogach = true) do={
:log warning "Poszedl ruch na interfejsie $inter";
}
:set arrayFroze ($arrayFroze, 0);
} else={
:if ($rx = 0 and $tx = 0) do={
:set licznikFroze (1+$licznikFroze);
:set arrayFroze ($arrayFroze, $licznikFroze);
:if ($pokazWLogach = true) do={
:log error "Zero ruchu na interfejsie $inter po raz $licznikFroze";
}
:if ($ileDisEnable = $licznikFroze) do={
/interface disable [:pick $interface $i];
:if ($pokazWLogach = true) do={
:log error "Wylaczono interfejs $inter";
}
:delay 3;
/interface enable [:pick $interface $i];
:if ($pokazWLogach = true) do={
:log error "Wlaczono interfejs $inter";
}
} else={
:if ($ileReboot = $licznikFroze or $ileReboot < $licznikFroze) do={
:if ($pokazWLogach = true) do={ :log error "Restart"; }
/system reboot
}
}
} else={
:set arrayFroze ($arrayFroze, 0);
}
}
}
}
#### Dodaje wykonywanie powyzszego skryptu co 1 minute.
############################################################################################
/system scheduler
add name="run froze_traffic" interval=00:01:00 on-event="/system script run froze_traffic\r\n"
|
|
|