Gateway switching using Erlang for ISP active passive load-balancing

From Notes_Wiki
Revision as of 12:04, 5 July 2020 by Saurabh (talk | contribs) (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...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

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.



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