change escokd to ranch
This commit is contained in:
parent
72553b4fea
commit
963b0b7da5
@ -24,12 +24,12 @@ create_table(Tab) when is_atom(Tab) ->
|
||||
{type, set}
|
||||
]).
|
||||
|
||||
-spec get_table_name(NetworkId :: integer()) -> TableName :: atom().
|
||||
get_table_name(NetworkId) when is_integer(NetworkId) ->
|
||||
list_to_atom("client_" ++ integer_to_list(NetworkId)).
|
||||
-spec get_table_name(NetworkId :: binary()) -> TableName :: atom().
|
||||
get_table_name(NetworkId) when is_binary(NetworkId) ->
|
||||
list_to_atom("client_" ++ binary_to_list(NetworkId)).
|
||||
|
||||
-spec get_clients(NetworkId :: integer()) -> [Client :: #client{}].
|
||||
get_clients(NetworkId) when is_integer(NetworkId) ->
|
||||
-spec get_clients(NetworkId :: binary()) -> [Client :: #client{}].
|
||||
get_clients(NetworkId) when is_binary(NetworkId) ->
|
||||
Tab = get_table_name(NetworkId),
|
||||
case mnesia:transaction(fun() -> mnesia:foldl(fun(R, Acc0) -> [R|Acc0] end, [], Tab) end) of
|
||||
{'atomic', Items} ->
|
||||
@ -38,8 +38,8 @@ get_clients(NetworkId) when is_integer(NetworkId) ->
|
||||
[]
|
||||
end.
|
||||
|
||||
-spec delete_clients(NetworkId :: integer()) -> ok | {error, Reason :: any()}.
|
||||
delete_clients(NetworkId) when is_integer(NetworkId) ->
|
||||
-spec delete_clients(NetworkId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
delete_clients(NetworkId) when is_binary(NetworkId) ->
|
||||
Tab = get_table_name(NetworkId),
|
||||
case mnesia:transaction(fun() -> mnesia:clear_table(Tab) end) of
|
||||
{'atomic', ok} ->
|
||||
@ -48,8 +48,8 @@ delete_clients(NetworkId) when is_integer(NetworkId) ->
|
||||
{error, Reason}
|
||||
end.
|
||||
|
||||
-spec delete_client(NetworkId :: integer(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
delete_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) ->
|
||||
-spec delete_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
delete_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) ->
|
||||
Tab = get_table_name(NetworkId),
|
||||
case mnesia:transaction(fun() -> mnesia:delete(Tab, ClientId, write) end) of
|
||||
{'atomic', ok} ->
|
||||
@ -58,8 +58,8 @@ delete_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientI
|
||||
{error, Reason}
|
||||
end.
|
||||
|
||||
-spec disable_client(NetworkId :: integer(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) ->
|
||||
-spec disable_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
disable_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) ->
|
||||
Tab = get_table_name(NetworkId),
|
||||
Fun = fun() ->
|
||||
case mnesia:read(Tab, ClientId, read) of
|
||||
@ -78,9 +78,9 @@ disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(Client
|
||||
end.
|
||||
|
||||
%% 分配ip地址的时候,以mac地址为唯一基准
|
||||
-spec alloc_ip(NetworkId :: integer(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer()) ->
|
||||
-spec alloc_ip(NetworkId :: binary(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer()) ->
|
||||
{ok, Ip :: integer()} | {error, Reason :: any()}.
|
||||
alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) when is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac) ->
|
||||
alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) when is_binary(NetworkId), is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac) ->
|
||||
case mnesia:transaction(fun() -> alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) end) of
|
||||
{'atomic', Res} ->
|
||||
{ok, Res};
|
||||
@ -120,7 +120,7 @@ alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) ->
|
||||
%%% helper functions
|
||||
%%%===================================================================
|
||||
|
||||
debug(NetworkId) when is_integer(NetworkId) ->
|
||||
debug(NetworkId) when is_binary(NetworkId) ->
|
||||
Tab = get_table_name(NetworkId),
|
||||
F = fun() ->
|
||||
Q = qlc:q([E || E <- mnesia:table(Tab)]),
|
||||
|
||||
@ -11,7 +11,6 @@
|
||||
ranch,
|
||||
poolboy,
|
||||
mysql,
|
||||
esockd,
|
||||
jiffy,
|
||||
hackney,
|
||||
gpb,
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
-export([get_all_networks/0, get_network/1]).
|
||||
-export([auth_token/3, node_online/3, node_offline/2, flow_report/5, network_forward_report/2]).
|
||||
|
||||
-spec get_all_networks() -> {ok, [NetworkId :: integer()]} | {error, Reason :: any()}.
|
||||
-spec get_all_networks() -> {ok, [NetworkId :: binary()]} | {error, Reason :: any()}.
|
||||
get_all_networks() ->
|
||||
case catch do_get("get_all_networks", []) of
|
||||
{ok, Resp} ->
|
||||
@ -31,9 +31,9 @@ get_all_networks() ->
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec get_network(Id :: integer()) -> {ok, Network :: map()} | {error, Reason :: any()}.
|
||||
get_network(Id) when is_integer(Id) ->
|
||||
case catch do_get("get_network", [{<<"id">>, integer_to_binary(Id)}]) of
|
||||
-spec get_network(Id :: binary()) -> {ok, Network :: map()} | {error, Reason :: any()}.
|
||||
get_network(Id) when is_binary(Id) ->
|
||||
case catch do_get("get_network", [{<<"id">>, Id}]) of
|
||||
{ok, Resp} ->
|
||||
case catch jiffy:decode(Resp, [return_maps]) of
|
||||
#{<<"result">> := Network} ->
|
||||
@ -61,8 +61,8 @@ auth_token(ClientId, Token, Version) when is_binary(ClientId), is_binary(Token),
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec node_online(ClientId :: binary(), NetworkId :: integer(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(NetworkId), is_binary(IpAddr) ->
|
||||
-spec node_online(ClientId :: binary(), NetworkId :: binary(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_binary(NetworkId), is_binary(IpAddr) ->
|
||||
case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"ip_addr">> => IpAddr, <<"status">> => 1}) of
|
||||
{ok, Resp} ->
|
||||
{ok, catch jiffy:decode(Resp, [return_maps])};
|
||||
@ -70,8 +70,8 @@ node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(Ne
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec node_offline(ClientId :: binary(), NetworkId :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId) ->
|
||||
-spec node_offline(ClientId :: binary(), NetworkId :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
node_offline(ClientId, NetworkId) when is_binary(ClientId), is_binary(NetworkId) ->
|
||||
case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"status">> => 0}) of
|
||||
{ok, Resp} ->
|
||||
{ok, catch jiffy:decode(Resp, [return_maps])};
|
||||
@ -79,10 +79,10 @@ node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec flow_report(ClientId :: binary(), NetworkId :: integer(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) ->
|
||||
-spec flow_report(ClientId :: binary(), NetworkId :: binary(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) ->
|
||||
{ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum)
|
||||
when is_binary(ClientId), is_integer(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) ->
|
||||
when is_binary(ClientId), is_binary(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) ->
|
||||
Params = #{
|
||||
<<"client_id">> => ClientId,
|
||||
<<"network_id">> => NetworkId,
|
||||
@ -97,9 +97,9 @@ flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum)
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec network_forward_report(NetworkId :: integer(), ForwardNum :: integer()) ->
|
||||
-spec network_forward_report(NetworkId :: binary(), ForwardNum :: integer()) ->
|
||||
{ok, Resp :: map()} | {error, Reason :: any()}.
|
||||
network_forward_report(NetworkId, ForwardNum) when is_integer(NetworkId), is_integer(ForwardNum) ->
|
||||
network_forward_report(NetworkId, ForwardNum) when is_binary(NetworkId), is_integer(ForwardNum) ->
|
||||
Params = #{
|
||||
<<"network_id">> => NetworkId,
|
||||
<<"forward_num">> => ForwardNum
|
||||
|
||||
@ -61,18 +61,15 @@ start_tcp_server() ->
|
||||
Backlog = proplists:get_value(backlog, Props, 1024),
|
||||
Port = proplists:get_value(port, Props),
|
||||
|
||||
TransOpts = [
|
||||
{tcp_options, [
|
||||
binary,
|
||||
{reuseaddr, true},
|
||||
{active, false},
|
||||
{packet, 2},
|
||||
TransOpts = #{
|
||||
num_acceptors => Acceptors,
|
||||
max_connections => MaxConnections,
|
||||
socket_opts => [
|
||||
{port, Port},
|
||||
{nodelay, false},
|
||||
{backlog, Backlog}
|
||||
]},
|
||||
{acceptors, Acceptors},
|
||||
{max_connections, MaxConnections}
|
||||
],
|
||||
{ok, _} = esockd:open('sdlan/tcp_server', Port, TransOpts, {sdlan_channel, start_link, []}),
|
||||
]
|
||||
},
|
||||
{ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []),
|
||||
|
||||
lager:debug("[sdlan_app] the tcp server start at: ~p", [Port]).
|
||||
@ -35,7 +35,7 @@
|
||||
-define(UPGRADE_FORCE, 2).
|
||||
|
||||
%% API
|
||||
-export([start_link/2]).
|
||||
-export([start_link/4]).
|
||||
-export([publish_command/4, send_event/3, stop/2, move_network/3]).
|
||||
|
||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
||||
@ -97,19 +97,15 @@ stop(Pid, Reason) when is_pid(Pid) ->
|
||||
%% esockd callback
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
start_link(Transport, Sock) ->
|
||||
{ok, proc_lib:spawn_link(?MODULE, init, [[Transport, Sock]])}.
|
||||
start_link(Ref, _Socket, Transport, Opts) ->
|
||||
{ok, proc_lib:spawn_link(?MODULE, init, [[Ref, Transport, Opts]])}.
|
||||
|
||||
init([Transport, Sock]) ->
|
||||
lager:debug("[sdlan_channel] get a new connection: ~p", [Sock]),
|
||||
case Transport:wait(Sock) of
|
||||
{ok, NewSock} ->
|
||||
Transport:setopts(Sock, [{active, true}]),
|
||||
erlang:start_timer(?PING_TICKER, self(), ping_ticker),
|
||||
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = NewSock});
|
||||
{error, Reason} ->
|
||||
{stop, Reason}
|
||||
end.
|
||||
init([Ref, Transport, _Opts = []]) ->
|
||||
{ok, Socket} = ranch:handshake(Ref),
|
||||
lager:debug("[sdlan_channel] get a new connection: ~p", [Socket]),
|
||||
Transport:setopts(Socket, [{active, true}, {packet, 2}]),
|
||||
erlang:start_timer(?PING_TICKER, self(), ping_ticker),
|
||||
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}).
|
||||
|
||||
handle_call(_Request, _From, State) ->
|
||||
{reply, ok, State}.
|
||||
|
||||
@ -46,7 +46,7 @@
|
||||
}).
|
||||
|
||||
-record(state, {
|
||||
network_id :: integer(),
|
||||
network_id :: binary(),
|
||||
name :: binary(),
|
||||
ipaddr :: binary(),
|
||||
mask_len :: integer(),
|
||||
@ -77,13 +77,13 @@
|
||||
test_event(Pid) ->
|
||||
gen_server:cast(Pid, test_event).
|
||||
|
||||
-spec get_pid(Id :: integer()) -> undefined | pid().
|
||||
get_pid(Id) when is_integer(Id) ->
|
||||
-spec get_pid(Id :: binary()) -> undefined | pid().
|
||||
get_pid(Id) when is_binary(Id) ->
|
||||
whereis(get_name(Id)).
|
||||
|
||||
-spec get_name(Id :: integer()) -> atom().
|
||||
get_name(Id) when is_integer(Id) ->
|
||||
list_to_atom("sdlan_network:" ++ integer_to_list(Id)).
|
||||
-spec get_name(Id :: binary()) -> atom().
|
||||
get_name(Id) when is_binary(Id) ->
|
||||
list_to_atom("sdlan_network:" ++ binary_to_list(Id)).
|
||||
|
||||
-spec reload(Pid :: pid()) -> ok | {error, Reason :: any()}.
|
||||
reload(Pid) when is_pid(Pid) ->
|
||||
@ -94,7 +94,7 @@ reload(Pid) when is_pid(Pid) ->
|
||||
assign_ip_addr(Pid, ChannelPid, ClientId, Mac, NetAddr) when is_pid(Pid), is_pid(ChannelPid), is_binary(ClientId), is_binary(Mac), is_integer(NetAddr) ->
|
||||
gen_server:call(Pid, {assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr}).
|
||||
|
||||
-spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: integer()}.
|
||||
-spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: binary()}.
|
||||
get_network_id(Pid) when is_pid(Pid) ->
|
||||
gen_server:call(Pid, get_network_id).
|
||||
|
||||
@ -140,9 +140,9 @@ get_used_map(undefined) ->
|
||||
#{}.
|
||||
|
||||
%% @doc Spawns the server and registers the local name (unique)
|
||||
-spec(start_link(Name :: atom(), Id :: integer()) ->
|
||||
-spec(start_link(Name :: atom(), Id :: binary()) ->
|
||||
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
|
||||
start_link(Name, Id) when is_atom(Name), is_integer(Id) ->
|
||||
start_link(Name, Id) when is_atom(Name), is_binary(Id) ->
|
||||
gen_server:start_link({local, Name}, ?MODULE, [Id], []).
|
||||
|
||||
%%%===================================================================
|
||||
@ -154,7 +154,7 @@ start_link(Name, Id) when is_atom(Name), is_integer(Id) ->
|
||||
-spec(init(Args :: term()) ->
|
||||
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
|
||||
{stop, Reason :: term()} | ignore).
|
||||
init([Id]) when is_integer(Id) ->
|
||||
init([Id]) ->
|
||||
erlang:process_flag(trap_exit, true),
|
||||
case sdlan_api:get_network(Id) of
|
||||
{ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> ->
|
||||
|
||||
@ -51,8 +51,8 @@ init([]) ->
|
||||
%%% Internal functions
|
||||
%%%===================================================================
|
||||
|
||||
-spec ensured_network_started(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
|
||||
ensured_network_started(Id) when is_integer(Id) ->
|
||||
-spec ensured_network_started(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
|
||||
ensured_network_started(Id) when is_binary(Id) ->
|
||||
case sdlan_network:get_pid(Id) of
|
||||
undefined ->
|
||||
case supervisor:start_child(?MODULE, child_spec(Id)) of
|
||||
@ -67,8 +67,8 @@ ensured_network_started(Id) when is_integer(Id) ->
|
||||
{ok, Pid}
|
||||
end.
|
||||
|
||||
-spec start_network(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
|
||||
start_network(Id) when is_integer(Id) ->
|
||||
-spec start_network(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
|
||||
start_network(Id) when is_binary(Id) ->
|
||||
case supervisor:start_child(?MODULE, child_spec(Id)) of
|
||||
{ok, Pid} when is_pid(Pid) ->
|
||||
{ok, Pid};
|
||||
@ -88,8 +88,8 @@ reallocate_bind_width() ->
|
||||
ChildPids = lists:map(fun({_Id, ChildPid, _Type, _Modules}) -> ChildPid end, supervisor:which_children(?MODULE)),
|
||||
set_network_bind(length(ChildPids)).
|
||||
|
||||
-spec delete_network(NetworkId :: integer()) -> ok | {error, Reason :: any()}.
|
||||
delete_network(NetworkId) when is_integer(NetworkId) ->
|
||||
-spec delete_network(NetworkId :: binary()) -> ok | {error, Reason :: any()}.
|
||||
delete_network(NetworkId) when is_binary(NetworkId) ->
|
||||
ChildId = sdlan_network:get_name(NetworkId),
|
||||
case supervisor:terminate_child(?MODULE, ChildId) of
|
||||
ok ->
|
||||
@ -98,8 +98,8 @@ delete_network(NetworkId) when is_integer(NetworkId) ->
|
||||
Error
|
||||
end.
|
||||
|
||||
-spec child_spec(Id :: integer()) -> map().
|
||||
child_spec(Id) when is_integer(Id) ->
|
||||
-spec child_spec(Id :: binary()) -> map().
|
||||
child_spec(Id) when is_binary(Id) ->
|
||||
Name = sdlan_network:get_name(Id),
|
||||
#{
|
||||
id => Name,
|
||||
|
||||
@ -3,9 +3,8 @@
|
||||
{poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}},
|
||||
{hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}},
|
||||
{sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}},
|
||||
{esockd, ".*", {git, "https://github.com/emqx/esockd.git", {tag, "v5.7.3"}}},
|
||||
{jiffy, ".*", {git, "https://github.com/davisp/jiffy.git", {tag, "1.1.1"}}},
|
||||
{cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.12.0"}}},
|
||||
{cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.14.2"}}},
|
||||
{mysql, ".*", {git, "https://github.com/mysql-otp/mysql-otp", {tag, "1.8.0"}}},
|
||||
{gpb, ".*", {git, "https://github.com/tomas-abrahamsson/gpb.git", {tag, "4.21.1"}}},
|
||||
{throttle, ".*", {git, "https://github.com/lambdaclass/throttle.git", {tag, "0.3.0"}}},
|
||||
|
||||
10
rebar.lock
10
rebar.lock
@ -2,16 +2,12 @@
|
||||
[{<<"certifi">>,{pkg,<<"certifi">>,<<"2.5.2">>},1},
|
||||
{<<"cowboy">>,
|
||||
{git,"https://github.com/ninenines/cowboy.git",
|
||||
{ref,"3ea8395eb8f53a57acb5d3c00b99c70296e7cdbd"}},
|
||||
{ref,"495e74ada88d0876d7e438d53f11af767a9cdcc4"}},
|
||||
0},
|
||||
{<<"cowlib">>,
|
||||
{git,"https://github.com/ninenines/cowlib",
|
||||
{ref,"1eb7f4293a652adcfe43b1835d22c58d8def839f"}},
|
||||
{ref,"aca0ad953417b29bab2c41eeb4c37c98606c848b"}},
|
||||
1},
|
||||
{<<"esockd">>,
|
||||
{git,"https://github.com/emqx/esockd.git",
|
||||
{ref,"d9ce4024cc42a65e9a05001997031e743442f955"}},
|
||||
0},
|
||||
{<<"fs">>,{pkg,<<"fs">>,<<"6.1.1">>},1},
|
||||
{<<"goldrush">>,{pkg,<<"goldrush">>,<<"0.1.9">>},1},
|
||||
{<<"gpb">>,
|
||||
@ -47,7 +43,7 @@
|
||||
0},
|
||||
{<<"ranch">>,
|
||||
{git,"https://github.com/ninenines/ranch",
|
||||
{ref,"a692f44567034dacf5efcaa24a24183788594eb7"}},
|
||||
{ref,"10b51304b26062e0dbfd5e74824324e9a911e269"}},
|
||||
1},
|
||||
{<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1},
|
||||
{<<"sync">>,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user