Difference between revisions of "Gateway switching using Erlang for ISP active passive load-balancing"

From Notes_Wiki
(Created page with "<yambe:breadcrumb self="Gateway switching using Erlang for ISP active passive load-balancing">Useful erlang scripts|Useful erlang scripts</yambe:breadcrumb> =Gateway switching...")
 
m
 
Line 1: Line 1:
<yambe:breadcrumb self="Gateway switching using Erlang for ISP active passive load-balancing">Useful erlang scripts|Useful erlang scripts</yambe:breadcrumb>
[[Main_Page|Home]] > [[Erlang]] > [[Useful erlang scripts]] > [[Gateway switching using Erlang for ISP active passive load-balancing]]
=Gateway switching using Erlang for ISP active passive load-balancing=


Use gateway.erl with following contents:
Use gateway.erl with following contents:
Line 76: Line 75:




<yambe:breadcrumb self="Gateway switching using Erlang for ISP active passive load-balancing">Useful erlang scripts|Useful erlang scripts</yambe:breadcrumb>
[[Main_Page|Home]] > [[Erlang]] > [[Useful erlang scripts]] > [[Gateway switching using Erlang for ISP active passive load-balancing]]

Latest revision as of 13:44, 7 April 2022

Home > Erlang > Useful erlang scripts > Gateway switching using Erlang for ISP active passive load-balancing

Use gateway.erl with following contents:

-module(gateway).
-compile(export_all).

start() ->
  main(["4.2.2.2", "192.168.4.1", "192.168.5.1"]),
  receive after infinity -> stop end.

main(Args) ->
        io:format("Script called with ~p arguments ~n", [Args]),
	if 
		length(Args) < 3 ->
			io:format("Required IP, Gateway1, Gateway2~n");
		true ->
			[Ping_ip, Gateway1, Gateway2] = Args,
			shift_to_gateway2(Ping_ip, Gateway1, Gateway2)
	end.

is_ip_alive(IP1) ->
	Cmd1=lists:flatten(io_lib:format("ping -c 10 -q ~s", [IP1])),
	Ping_lines1=string:tokens(os:cmd(Cmd1), "\n"),
	Stats_line1 = lists:nth(3, Ping_lines1),
	Received1 = lists:nth(2, string:tokens(Stats_line1, ",")),
	Received_count1=list_to_integer(hd(string:tokens(Received1, " "))),
	%%io:format("Count is ~p~n", [Received_count1]),
       	Received_count1.	



shift_to_gateway2(Ping_ip, Gateway1, Gateway2) ->
	receive
        after 60000 -> ok
        end,
	Ping_count1=is_ip_alive(Ping_ip),
	if
		Ping_count1 > 0 ->
			io:format("~p ~p Everything fine with Gateway1, continuing ~n", [date(), time()]),
			shift_to_gateway2(Ping_ip, Gateway1, Gateway2);
		true ->
			os:cmd("ip route del default"),
			Cmd1 = lists:flatten(io_lib:format("ip route add default via ~s", [Gateway2])),
		        os:cmd(Cmd1),
			shift_to_gateway1(Ping_ip, Gateway1, Gateway2)
	end.


shift_to_gateway1(Ping_ip, Gateway1, Gateway2) ->
	receive
        after 60000 -> ok
        end,
	Ping_count1=is_ip_alive(Ping_ip),
	if
		Ping_count1 > 0 ->
			io:format("~p ~p Everything fine with Gateway2, continuing ~n", [date(), time()]),
			shift_to_gateway1(Ping_ip, Gateway1, Gateway2);
		true ->
			os:cmd("ip route del default"),
			Cmd1 = lists:flatten(io_lib:format("ip route add default via ~s", [Gateway1])),
		        os:cmd(Cmd1),
			shift_to_gateway2(Ping_ip, Gateway1, Gateway2)
	end.


Then call it externally on machine start up using:

 erl -noshell -s gateway start -s init stop </dev/null  >> /root/gateway.out 2>&1 &

This way as per hardcoded values in start() function the program with try to ping IP "4.2.2.2". If the ping fails it will keep switching the gateway between 192.168.4.1 and 192.168.5.1.



Home > Erlang > Useful erlang scripts > Gateway switching using Erlang for ISP active passive load-balancing