sieć

 

mikrotik

 

ubiquiti

 

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"


Copyright seszu © 30.10.2010-2024.