Compare commits
No commits in common. "2394db892c4bc4a2bee044d93f85bba3667ba70c" and "a17453022dbcdd40e3dcbe87e4454ebcae186eee" have entirely different histories.
2394db892c
...
a17453022d
@ -41,7 +41,7 @@ insert(#dns_query{name = Qname, type = QType, class = QClass},
|
|||||||
true ->
|
true ->
|
||||||
TTL = lists:min(TTLs),
|
TTL = lists:min(TTLs),
|
||||||
ExpireAt = os:system_time(second) + TTL,
|
ExpireAt = os:system_time(second) + TTL,
|
||||||
logger:debug("min ttl is: ~p, expire_at: ~p", [TTL, ExpireAt]),
|
lager:debug("min ttl is: ~p, expire_at: ~p", [TTL, ExpireAt]),
|
||||||
Key = {Qname, QType, QClass},
|
Key = {Qname, QType, QClass},
|
||||||
Cache = #dns_cache{
|
Cache = #dns_cache{
|
||||||
key = Key,
|
key = Key,
|
||||||
|
|||||||
@ -82,10 +82,10 @@ handle_cast({handle_ip_packet, Sock, SrcIp, SrcPort, IpPacket}, State) ->
|
|||||||
RespIpPacket = build_ip_packet(ReqDAddr, ReqSAddr, ReqDPort, ReqSPort, DnsResp),
|
RespIpPacket = build_ip_packet(ReqDAddr, ReqSAddr, ReqDPort, ReqSPort, DnsResp),
|
||||||
gen_udp:send(Sock, SrcIp, SrcPort, RespIpPacket);
|
gen_udp:send(Sock, SrcIp, SrcPort, RespIpPacket);
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:notice("[dns_handler] resolver get error: ~p", [Reason])
|
lager:notice("[dns_handler] resolver get error: ~p", [Reason])
|
||||||
end;
|
end;
|
||||||
false ->
|
false ->
|
||||||
logger:notice("[dns_handler] resolver invalid protocol: ~p", [Protocol])
|
lager:notice("[dns_handler] resolver invalid protocol: ~p", [Protocol])
|
||||||
end,
|
end,
|
||||||
{stop, normal, State}.
|
{stop, normal, State}.
|
||||||
|
|
||||||
@ -146,45 +146,45 @@ resolver0(Packet, QueryMsg = #dns_message{qc = 1, questions = [Question = #dns_q
|
|||||||
authority = [],
|
authority = [],
|
||||||
additional = []
|
additional = []
|
||||||
},
|
},
|
||||||
logger:debug("[dns_handler] punchnet inbuilt qnanme: ~p, ip: ~p", [QName, Ip]),
|
lager:debug("[dns_handler] punchnet inbuilt qnanme: ~p, ip: ~p", [QName, Ip]),
|
||||||
{ok, dns:encode_message(RespMsg)};
|
{ok, dns:encode_message(RespMsg)};
|
||||||
error ->
|
error ->
|
||||||
%% 是否命中内部的域名后缀
|
%% 是否命中内部的域名后缀
|
||||||
EmptyDnsResp = dns:encode_message(build_nxdomain_response(QueryMsg)),
|
EmptyDnsResp = dns:encode_message(build_nxdomain_response(QueryMsg)),
|
||||||
case sdlan_domain_regedit:maybe_domain(QName) of
|
case sdlan_domain_regedit:maybe_domain(QName) of
|
||||||
true ->
|
true ->
|
||||||
logger:debug("[dns_handler] punchnet inbuilt qnanme: ~p, nxdomain", [QName]),
|
lager:debug("[dns_handler] punchnet inbuilt qnanme: ~p, nxdomain", [QName]),
|
||||||
{ok, EmptyDnsResp};
|
{ok, EmptyDnsResp};
|
||||||
false ->
|
false ->
|
||||||
case dns_cache:lookup(Question) of
|
case dns_cache:lookup(Question) of
|
||||||
{hit, Cache} ->
|
{hit, Cache} ->
|
||||||
logger:debug("[dns_handler] qname: ~p, hit cache answers: ~p", [QName, Cache#dns_cache.answers]),
|
lager:debug("[dns_handler] qname: ~p, hit cache answers: ~p", [QName, Cache#dns_cache.answers]),
|
||||||
RespMsg = build_response(QueryMsg, Cache),
|
RespMsg = build_response(QueryMsg, Cache),
|
||||||
{ok, dns:encode_message(RespMsg)};
|
{ok, dns:encode_message(RespMsg)};
|
||||||
miss ->
|
miss ->
|
||||||
Ref = make_ref(),
|
Ref = make_ref(),
|
||||||
forward_to_upstream(Ref, Packet, QueryMsg),
|
forward_to_upstream(Ref, Packet, QueryMsg),
|
||||||
logger:debug("[dns_handler] cache is miss, forward_to_upstream"),
|
lager:debug("[dns_handler] cache is miss, forward_to_upstream"),
|
||||||
receive
|
receive
|
||||||
{dns_resolver_reply, Ref, Resp} ->
|
{dns_resolver_reply, Ref, Resp} ->
|
||||||
case dns:decode_message(Resp) of
|
case dns:decode_message(Resp) of
|
||||||
RespMsg = #dns_message{answers = Answers} ->
|
RespMsg = #dns_message{answers = Answers} ->
|
||||||
logger:debug("[dns_handler] get a response answers: ~p", [Answers]),
|
lager:debug("[dns_handler] get a response answers: ~p", [Answers]),
|
||||||
dns_cache:insert(Question, RespMsg),
|
dns_cache:insert(Question, RespMsg),
|
||||||
{ok, Resp};
|
{ok, Resp};
|
||||||
Error ->
|
Error ->
|
||||||
logger:debug("[dns_handler] parse reply get error: ~p", [Error]),
|
lager:debug("[dns_handler] parse reply get error: ~p", [Error]),
|
||||||
{ok, EmptyDnsResp}
|
{ok, EmptyDnsResp}
|
||||||
end
|
end
|
||||||
after 5000 ->
|
after 5000 ->
|
||||||
logger:debug("[dns_handler] forward_to_upstream timeout"),
|
lager:debug("[dns_handler] forward_to_upstream timeout"),
|
||||||
{ok, EmptyDnsResp}
|
{ok, EmptyDnsResp}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
resolver0(_, Error) ->
|
resolver0(_, Error) ->
|
||||||
logger:warning("[dns_handler] decode dns_query get error: ~p", [Error]),
|
lager:warning("[dns_handler] decode dns_query get error: ~p", [Error]),
|
||||||
{error, Error}.
|
{error, Error}.
|
||||||
|
|
||||||
-spec forward_to_upstream(Ref :: reference(), Request :: binary(), QueryMsg :: #dns_message{}) -> no_return().
|
-spec forward_to_upstream(Ref :: reference(), Request :: binary(), QueryMsg :: #dns_message{}) -> no_return().
|
||||||
|
|||||||
@ -81,7 +81,7 @@ handle_cast({forward, ReceiverPid, Ref, Request, #dns_message{id = TxId, questio
|
|||||||
lists:foreach(fun({DnsIp, DnsPort}) ->
|
lists:foreach(fun({DnsIp, DnsPort}) ->
|
||||||
ok = gen_udp:send(Socket, DnsIp, DnsPort, Request),
|
ok = gen_udp:send(Socket, DnsIp, DnsPort, Request),
|
||||||
Key = {Idx, TxId, DnsIp, DnsPort, QName, QType, QClass},
|
Key = {Idx, TxId, DnsIp, DnsPort, QName, QType, QClass},
|
||||||
logger:debug("[dns_resolver] key: ~p, send to: ~p, packet: ~p", [Key, {DnsIp, DnsPort}, Request]),
|
lager:debug("[dns_resolver] key: ~p, send to: ~p, packet: ~p", [Key, {DnsIp, DnsPort}, Request]),
|
||||||
dns_pending_wheel:insert(Key, {Ref, ReceiverPid})
|
dns_pending_wheel:insert(Key, {Ref, ReceiverPid})
|
||||||
end, DnsServers),
|
end, DnsServers),
|
||||||
|
|
||||||
|
|||||||
@ -7,18 +7,18 @@ start_link(Port) when is_integer(Port) ->
|
|||||||
init(Port) ->
|
init(Port) ->
|
||||||
dns_cache:init(),
|
dns_cache:init(),
|
||||||
{ok, Sock} = gen_udp:open(Port, [binary, {active, true}]),
|
{ok, Sock} = gen_udp:open(Port, [binary, {active, true}]),
|
||||||
logger:debug("[dns_server] DNS Forwarder started on UDP port ~p~n", [Port]),
|
lager:debug("[dns_server] DNS Forwarder started on UDP port ~p~n", [Port]),
|
||||||
loop(Sock).
|
loop(Sock).
|
||||||
|
|
||||||
loop(Sock) ->
|
loop(Sock) ->
|
||||||
receive
|
receive
|
||||||
{udp, Sock, Ip, Port, Packet} ->
|
{udp, Sock, Ip, Port, Packet} ->
|
||||||
logger:debug("[dns_server] ip: ~p, get a packet: ~p", [{Ip, Port}, Packet]),
|
lager:debug("[dns_server] ip: ~p, get a packet: ~p", [{Ip, Port}, Packet]),
|
||||||
case dns_handler_sup:start_handler() of
|
case dns_handler_sup:start_handler() of
|
||||||
{ok, HandlerPid} ->
|
{ok, HandlerPid} ->
|
||||||
dns_handler:handle_ip_packet(HandlerPid, Sock, Ip, Port, Packet);
|
dns_handler:handle_ip_packet(HandlerPid, Sock, Ip, Port, Packet);
|
||||||
Error ->
|
Error ->
|
||||||
logger:debug("[dns_server] start handler get error: ~p", [Error])
|
lager:debug("[dns_server] start handler get error: ~p", [Error])
|
||||||
end,
|
end,
|
||||||
loop(Sock)
|
loop(Sock)
|
||||||
end.
|
end.
|
||||||
@ -126,6 +126,6 @@ test() ->
|
|||||||
|
|
||||||
X = udp_checksum(SAddr, DAddr, SPort, DPort, UDPPayload),
|
X = udp_checksum(SAddr, DAddr, SPort, DPort, UDPPayload),
|
||||||
|
|
||||||
logger:debug("ip_sum: ~p, =: ~p, udp: ~p, checkSum: ~p, =: ~p", [IpSum, ip_checksum(IPPacket), UDP, CheckSum, X]),
|
lager:debug("ip_sum: ~p, =: ~p, udp: ~p, checkSum: ~p, =: ~p", [IpSum, ip_checksum(IPPacket), UDP, CheckSum, X]),
|
||||||
|
|
||||||
dns:decode_message(UDPPayload).
|
dns:decode_message(UDPPayload).
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
%% 重新加载对应的主机信息
|
%% 重新加载对应的主机信息
|
||||||
handle_request("POST", "/test/auth_token", _, PostParams) ->
|
handle_request("POST", "/test/auth_token", _, PostParams) ->
|
||||||
logger:debug("[test_handler] get post params: ~p", [PostParams]),
|
lager:debug("[test_handler] get post params: ~p", [PostParams]),
|
||||||
[Id | _] = network_bo:get_all_networks(),
|
[Id | _] = network_bo:get_all_networks(),
|
||||||
Data = #{
|
Data = #{
|
||||||
<<"network_id">> => Id
|
<<"network_id">> => Id
|
||||||
|
|||||||
@ -21,7 +21,7 @@ init(Req0, Opts = [Mod|_]) ->
|
|||||||
|
|
||||||
try Mod:handle_request(Method, Path, GetParams, PostParams) of
|
try Mod:handle_request(Method, Path, GetParams, PostParams) of
|
||||||
{ok, StatusCode, Resp} ->
|
{ok, StatusCode, Resp} ->
|
||||||
%logger:debug("[http_protocol] request path: ~p, get_params: ~p, post_params: ~p, response: ~ts",
|
%lager:debug("[http_protocol] request path: ~p, get_params: ~p, post_params: ~p, response: ~ts",
|
||||||
% [Path, GetParams, PostParams, Resp]),
|
% [Path, GetParams, PostParams, Resp]),
|
||||||
AcceptEncoding = cowboy_req:header(<<"accept-encoding">>, Req1, <<>>),
|
AcceptEncoding = cowboy_req:header(<<"accept-encoding">>, Req1, <<>>),
|
||||||
Req2 = case iolist_size(Resp) >= 1024 andalso supported_gzip(AcceptEncoding) of
|
Req2 = case iolist_size(Resp) >= 1024 andalso supported_gzip(AcceptEncoding) of
|
||||||
@ -44,7 +44,7 @@ init(Req0, Opts = [Mod|_]) ->
|
|||||||
}, Error, Req1),
|
}, Error, Req1),
|
||||||
{ok, Req2, Opts};
|
{ok, Req2, Opts};
|
||||||
_:Error:Stack ->
|
_:Error:Stack ->
|
||||||
logger:warning("[http_handler] get error: ~p, stack: ~p", [Error, Stack]),
|
lager:warning("[http_handler] get error: ~p, stack: ~p", [Error, Stack]),
|
||||||
Req2 = cowboy_req:reply(500, #{
|
Req2 = cowboy_req:reply(500, #{
|
||||||
<<"Content-Type">> => <<"text/html;charset=utf-8">>
|
<<"Content-Type">> => <<"text/html;charset=utf-8">>
|
||||||
}, <<"Internal Server Error">>, Req1),
|
}, <<"Internal Server Error">>, Req1),
|
||||||
|
|||||||
@ -17,7 +17,7 @@ handle_request("POST", "/network/create", _, #{<<"id">> := NetworkId}) when Netw
|
|||||||
{ok, Pid} when is_pid(Pid) ->
|
{ok, Pid} when is_pid(Pid) ->
|
||||||
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("[network_handler] create network: ~p, get error: ~p", [NetworkId, Reason]),
|
lager:debug("[network_handler] create network: ~p, get error: ~p", [NetworkId, Reason]),
|
||||||
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ handle_request("POST", "/network/reload", _, #{<<"id">> := NetworkId}) when Netw
|
|||||||
sdlan_network_sup:reallocate_bind_width(),
|
sdlan_network_sup:reallocate_bind_width(),
|
||||||
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("[network_handler] start network: ~p, get error: ~p", [NetworkId, Reason]),
|
lager:debug("[network_handler] start network: ~p, get error: ~p", [NetworkId, Reason]),
|
||||||
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
||||||
end;
|
end;
|
||||||
NetworkPid when is_pid(NetworkPid) ->
|
NetworkPid when is_pid(NetworkPid) ->
|
||||||
@ -37,7 +37,7 @@ handle_request("POST", "/network/reload", _, #{<<"id">> := NetworkId}) when Netw
|
|||||||
ok ->
|
ok ->
|
||||||
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("[network_handler] reload network: ~p, get error: ~p", [NetworkId, Reason]),
|
lager:debug("[network_handler] reload network: ~p, get error: ~p", [NetworkId, Reason]),
|
||||||
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
@ -51,7 +51,7 @@ handle_request("POST", "/network/delete", _, #{<<"id">> := NetworkId}) when Netw
|
|||||||
ok ->
|
ok ->
|
||||||
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("[network_handler] delete network: ~p, get error: ~p", [NetworkId, Reason]),
|
lager:debug("[network_handler] delete network: ~p, get error: ~p", [NetworkId, Reason]),
|
||||||
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
{ok, 200, sdlan_util:json_error(-1, <<"error">>)}
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|||||||
@ -49,7 +49,7 @@ handle_request("POST", "/node/move", _, #{<<"client_id">> := ClientId, <<"from_n
|
|||||||
Ref = sdlan_channel:move_network(ChannelPid, self(), ToPid, HostName),
|
Ref = sdlan_channel:move_network(ChannelPid, self(), ToPid, HostName),
|
||||||
receive
|
receive
|
||||||
{command_reply, Ref, {error, Reason}} ->
|
{command_reply, Ref, {error, Reason}} ->
|
||||||
logger:warning("[node_handler] client_id: ~p, move network from: ~p, to: ~p, get error: ~p", [ClientId, FromPid, ToPid, Reason]),
|
lager:warning("[node_handler] client_id: ~p, move network from: ~p, to: ~p, get error: ~p", [ClientId, FromPid, ToPid, Reason]),
|
||||||
{ok, 200, sdlan_util:json_error(-1, <<"move failed">>)};
|
{ok, 200, sdlan_util:json_error(-1, <<"move failed">>)};
|
||||||
{command_reply, Ref, #sdl_command_ack{status = true}} ->
|
{command_reply, Ref, #sdl_command_ack{status = true}} ->
|
||||||
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
{ok, 200, sdlan_util:json_data(<<"success">>)};
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
%% 重新加载对应的主机信息
|
%% 重新加载对应的主机信息
|
||||||
handle_request("POST", "/test/auth_token", _, PostParams) ->
|
handle_request("POST", "/test/auth_token", _, PostParams) ->
|
||||||
logger:debug("[test_handler] get post params: ~p", [PostParams]),
|
lager:debug("[test_handler] get post params: ~p", [PostParams]),
|
||||||
Data = #{
|
Data = #{
|
||||||
<<"network_id">> => 8,
|
<<"network_id">> => 8,
|
||||||
<<"upgrade_type">> => 0,
|
<<"upgrade_type">> => 0,
|
||||||
@ -28,7 +28,7 @@ handle_request("POST", "/test/auth_token", _, PostParams) ->
|
|||||||
{ok, 200, sdlan_util:json_data(Data)};
|
{ok, 200, sdlan_util:json_data(Data)};
|
||||||
|
|
||||||
handle_request("POST", "/test/upgrade", _, PostParams) ->
|
handle_request("POST", "/test/upgrade", _, PostParams) ->
|
||||||
logger:debug("[test_handler] get post params: ~p", [PostParams]),
|
lager:debug("[test_handler] get post params: ~p", [PostParams]),
|
||||||
Data = #{
|
Data = #{
|
||||||
<<"upgrade_type">> => 1,
|
<<"upgrade_type">> => 1,
|
||||||
<<"upgrade_prompt">> => <<"prompt需要升级"/utf8>>,
|
<<"upgrade_prompt">> => <<"prompt需要升级"/utf8>>,
|
||||||
|
|||||||
@ -156,7 +156,7 @@ debug(NetworkId) when is_integer(NetworkId) ->
|
|||||||
end,
|
end,
|
||||||
case mnesia:transaction(F) of
|
case mnesia:transaction(F) of
|
||||||
{'atomic', Records} ->
|
{'atomic', Records} ->
|
||||||
lists:foreach(fun(C) -> logger:debug("client: ~p", [C]) end, Records);
|
lists:foreach(fun(C) -> lager:debug("client: ~p", [C]) end, Records);
|
||||||
{'aborted', Reason} ->
|
{'aborted', Reason} ->
|
||||||
logger:warning("read clients get error: ~p", [Reason])
|
lager:warning("read clients get error: ~p", [Reason])
|
||||||
end.
|
end.
|
||||||
@ -16,49 +16,49 @@
|
|||||||
%% 从数据库中查找一行记录
|
%% 从数据库中查找一行记录
|
||||||
-spec get_row(ConnPid :: pid(), Sql::binary()) -> {ok, Record::map()} | undefined.
|
-spec get_row(ConnPid :: pid(), Sql::binary()) -> {ok, Record::map()} | undefined.
|
||||||
get_row(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
|
get_row(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
|
||||||
logger:debug("[mysql_client] get_row sql is: ~p", [Sql]),
|
lager:debug("[mysql_client] get_row sql is: ~p", [Sql]),
|
||||||
case mysql:query(ConnPid, Sql) of
|
case mysql:query(ConnPid, Sql) of
|
||||||
{ok, Names, [Row | _]} ->
|
{ok, Names, [Row | _]} ->
|
||||||
{ok, maps:from_list(lists:zip(Names, Row))};
|
{ok, maps:from_list(lists:zip(Names, Row))};
|
||||||
{ok, _, []} ->
|
{ok, _, []} ->
|
||||||
undefined;
|
undefined;
|
||||||
Error ->
|
Error ->
|
||||||
logger:warning("[mysql_client] get error: ~p", [Error]),
|
lager:warning("[mysql_client] get error: ~p", [Error]),
|
||||||
undefined
|
undefined
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec get_row(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Record::map()} | undefined.
|
-spec get_row(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Record::map()} | undefined.
|
||||||
get_row(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
|
get_row(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
|
||||||
logger:debug("[mysql_client] get_row sql is: ~p, params: ~p", [Sql, Params]),
|
lager:debug("[mysql_client] get_row sql is: ~p, params: ~p", [Sql, Params]),
|
||||||
case mysql:query(ConnPid, Sql, Params) of
|
case mysql:query(ConnPid, Sql, Params) of
|
||||||
{ok, Names, [Row | _]} ->
|
{ok, Names, [Row | _]} ->
|
||||||
{ok, maps:from_list(lists:zip(Names, Row))};
|
{ok, maps:from_list(lists:zip(Names, Row))};
|
||||||
{ok, _, []} ->
|
{ok, _, []} ->
|
||||||
undefined;
|
undefined;
|
||||||
Error ->
|
Error ->
|
||||||
logger:warning("[mysql_client] get error: ~p", [Error]),
|
lager:warning("[mysql_client] get error: ~p", [Error]),
|
||||||
undefined
|
undefined
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec get_all(ConnPid :: pid(), Sql::binary()) -> {ok, Rows::list()} | {error, Reason :: any()}.
|
-spec get_all(ConnPid :: pid(), Sql::binary()) -> {ok, Rows::list()} | {error, Reason :: any()}.
|
||||||
get_all(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
|
get_all(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
|
||||||
logger:debug("[mysql_client] get_all sql is: ~p", [Sql]),
|
lager:debug("[mysql_client] get_all sql is: ~p", [Sql]),
|
||||||
case mysql:query(ConnPid, Sql) of
|
case mysql:query(ConnPid, Sql) of
|
||||||
{ok, Names, Rows} ->
|
{ok, Names, Rows} ->
|
||||||
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
|
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:warning("[mysql_client] get error: ~p", [Reason]),
|
lager:warning("[mysql_client] get error: ~p", [Reason]),
|
||||||
{error, Reason}
|
{error, Reason}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec get_all(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Rows::list()} | {error, Reason::any()}.
|
-spec get_all(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Rows::list()} | {error, Reason::any()}.
|
||||||
get_all(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
|
get_all(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
|
||||||
logger:debug("[mysql_client] get_all sql is: ~p, params: ~p", [Sql, Params]),
|
lager:debug("[mysql_client] get_all sql is: ~p, params: ~p", [Sql, Params]),
|
||||||
case mysql:query(ConnPid, Sql, Params) of
|
case mysql:query(ConnPid, Sql, Params) of
|
||||||
{ok, Names, Rows} ->
|
{ok, Names, Rows} ->
|
||||||
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
|
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:warning("[mysql_client] get error: ~p", [Reason]),
|
lager:warning("[mysql_client] get error: ~p", [Reason]),
|
||||||
{error, Reason}
|
{error, Reason}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ insert(ConnPid, Table, Fields, FetchInsertId) when is_pid(ConnPid), is_binary(Ta
|
|||||||
ValuesPlaceholder = iolist_to_binary(lists:join(<<", ">>, Placeholders)),
|
ValuesPlaceholder = iolist_to_binary(lists:join(<<", ">>, Placeholders)),
|
||||||
|
|
||||||
Sql = <<"INSERT INTO ", Table/binary, "(", FieldSql/binary, ") VALUES(", ValuesPlaceholder/binary, ")">>,
|
Sql = <<"INSERT INTO ", Table/binary, "(", FieldSql/binary, ") VALUES(", ValuesPlaceholder/binary, ")">>,
|
||||||
logger:debug("[mysql_client] insert sql is: ~p, params: ~p", [Sql, Values]),
|
lager:debug("[mysql_client] insert sql is: ~p, params: ~p", [Sql, Values]),
|
||||||
case mysql:query(ConnPid, Sql, Values) of
|
case mysql:query(ConnPid, Sql, Values) of
|
||||||
ok ->
|
ok ->
|
||||||
case FetchInsertId of
|
case FetchInsertId of
|
||||||
@ -90,7 +90,7 @@ insert(ConnPid, Table, Fields, FetchInsertId) when is_pid(ConnPid), is_binary(Ta
|
|||||||
|
|
||||||
-spec update_by(ConnPid :: pid(), UpdateSql :: binary()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
|
-spec update_by(ConnPid :: pid(), UpdateSql :: binary()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
|
||||||
update_by(ConnPid, UpdateSql) when is_pid(ConnPid), is_binary(UpdateSql) ->
|
update_by(ConnPid, UpdateSql) when is_pid(ConnPid), is_binary(UpdateSql) ->
|
||||||
logger:debug("[mysql_client] updateBySql sql: ~p", [UpdateSql]),
|
lager:debug("[mysql_client] updateBySql sql: ~p", [UpdateSql]),
|
||||||
case mysql:query(ConnPid, UpdateSql) of
|
case mysql:query(ConnPid, UpdateSql) of
|
||||||
ok ->
|
ok ->
|
||||||
AffectedRows = mysql:affected_rows(ConnPid),
|
AffectedRows = mysql:affected_rows(ConnPid),
|
||||||
@ -101,7 +101,7 @@ update_by(ConnPid, UpdateSql) when is_pid(ConnPid), is_binary(UpdateSql) ->
|
|||||||
|
|
||||||
-spec update_by(ConnPid :: pid(), UpdateSql :: binary(), Params :: list()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
|
-spec update_by(ConnPid :: pid(), UpdateSql :: binary(), Params :: list()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
|
||||||
update_by(ConnPid, UpdateSql, Params) when is_pid(ConnPid), is_binary(UpdateSql) ->
|
update_by(ConnPid, UpdateSql, Params) when is_pid(ConnPid), is_binary(UpdateSql) ->
|
||||||
logger:debug("[mysql_client] updateBySql sql: ~p, params: ~p", [UpdateSql, Params]),
|
lager:debug("[mysql_client] updateBySql sql: ~p, params: ~p", [UpdateSql, Params]),
|
||||||
case mysql:query(ConnPid, UpdateSql, Params) of
|
case mysql:query(ConnPid, UpdateSql, Params) of
|
||||||
ok ->
|
ok ->
|
||||||
AffectedRows = mysql:affected_rows(ConnPid),
|
AffectedRows = mysql:affected_rows(ConnPid),
|
||||||
@ -126,13 +126,13 @@ update(ConnPid, Table, Fields, WhereFields) when is_pid(ConnPid), is_binary(Tabl
|
|||||||
Params = SetVals ++ WhereVals,
|
Params = SetVals ++ WhereVals,
|
||||||
|
|
||||||
Sql = <<"UPDATE ", Table/binary, " SET ", SetSql/binary, " WHERE ", WhereSql/binary>>,
|
Sql = <<"UPDATE ", Table/binary, " SET ", SetSql/binary, " WHERE ", WhereSql/binary>>,
|
||||||
logger:debug("[mysql_client] update sql is: ~p, params: ~p", [Sql, Params]),
|
lager:debug("[mysql_client] update sql is: ~p, params: ~p", [Sql, Params]),
|
||||||
case mysql:query(ConnPid, Sql, Params) of
|
case mysql:query(ConnPid, Sql, Params) of
|
||||||
ok ->
|
ok ->
|
||||||
AffectedRows = mysql:affected_rows(ConnPid),
|
AffectedRows = mysql:affected_rows(ConnPid),
|
||||||
{ok, AffectedRows};
|
{ok, AffectedRows};
|
||||||
Error ->
|
Error ->
|
||||||
logger:error("[mysql_client] update sql: ~p, params: ~p, get a error: ~p", [Sql, Params, Error]),
|
lager:error("[mysql_client] update sql: ~p, params: ~p, get a error: ~p", [Sql, Params, Error]),
|
||||||
Error
|
Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
{applications,
|
{applications,
|
||||||
[
|
[
|
||||||
sync,
|
sync,
|
||||||
|
lager,
|
||||||
cowboy,
|
cowboy,
|
||||||
ranch,
|
ranch,
|
||||||
poolboy,
|
poolboy,
|
||||||
|
|||||||
@ -57,7 +57,7 @@ start_http_server() ->
|
|||||||
|
|
||||||
{ok, Pid} = cowboy:start_clear(http_listener, TransOpts, #{env => #{dispatch => Dispatcher}}),
|
{ok, Pid} = cowboy:start_clear(http_listener, TransOpts, #{env => #{dispatch => Dispatcher}}),
|
||||||
|
|
||||||
logger:debug("[iot_app] the http server start at: ~p, pid is: ~p", [Port, Pid]).
|
lager:debug("[iot_app] the http server start at: ~p, pid is: ~p", [Port, Pid]).
|
||||||
|
|
||||||
%% 启动tcp服务
|
%% 启动tcp服务
|
||||||
start_tcp_server() ->
|
start_tcp_server() ->
|
||||||
@ -78,4 +78,4 @@ start_tcp_server() ->
|
|||||||
},
|
},
|
||||||
{ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []),
|
{ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []),
|
||||||
|
|
||||||
logger:debug("[sdlan_app] the tcp server start at: ~p", [Port]).
|
lager:debug("[sdlan_app] the tcp server start at: ~p", [Port]).
|
||||||
@ -104,7 +104,7 @@ start_link(Ref, _Socket, Transport, Opts) ->
|
|||||||
|
|
||||||
init([Ref, Transport, _Opts = []]) ->
|
init([Ref, Transport, _Opts = []]) ->
|
||||||
{ok, Socket} = ranch:handshake(Ref),
|
{ok, Socket} = ranch:handshake(Ref),
|
||||||
logger:debug("[sdlan_channel] get a new connection: ~p", [Socket]),
|
lager:debug("[sdlan_channel] get a new connection: ~p", [Socket]),
|
||||||
Transport:setopts(Socket, [{active, true}, {packet, 2}]),
|
Transport:setopts(Socket, [{active, true}, {packet, 2}]),
|
||||||
erlang:start_timer(?PING_TICKER, self(), ping_ticker),
|
erlang:start_timer(?PING_TICKER, self(), ping_ticker),
|
||||||
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}).
|
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}).
|
||||||
@ -120,23 +120,23 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}, S
|
|||||||
#sdl_register_super{version = Version, client_id = ClientId, dev_addr = #sdl_dev_addr{mac = Mac}, network_code = NetworkCode, token = Token, pub_key = PubKey} = sdlan_pb:decode_msg(Body, sdl_register_super),
|
#sdl_register_super{version = Version, client_id = ClientId, dev_addr = #sdl_dev_addr{mac = Mac}, network_code = NetworkCode, token = Token, pub_key = PubKey} = sdlan_pb:decode_msg(Body, sdl_register_super),
|
||||||
|
|
||||||
%% 参数检查
|
%% 参数检查
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, public_key: ~p, token: ~p, network_code: ~p", [ClientId, PubKey, Token, NetworkCode]),
|
lager:debug("[sdlan_channel] client_id: ~p, public_key: ~p, token: ~p, network_code: ~p", [ClientId, PubKey, Token, NetworkCode]),
|
||||||
true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>),
|
true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>),
|
||||||
%% Mac地址不能是广播地址
|
%% Mac地址不能是广播地址
|
||||||
true = not (sdlan_util:is_multicast_mac(Mac) orelse sdlan_util:is_broadcast_mac(Mac)),
|
true = not (sdlan_util:is_multicast_mac(Mac) orelse sdlan_util:is_broadcast_mac(Mac)),
|
||||||
|
|
||||||
AuthResult = if
|
AuthResult = if
|
||||||
Token /= <<>> ->
|
Token /= <<>> ->
|
||||||
logger:debug("[sdlan_channel] auth token: ~p", [Token]),
|
lager:debug("[sdlan_channel] auth token: ~p", [Token]),
|
||||||
sdlan_api:auth_token(ClientId, Token, Version);
|
sdlan_api:auth_token(ClientId, Token, Version);
|
||||||
NetworkCode /= <<>> ->
|
NetworkCode /= <<>> ->
|
||||||
logger:debug("[sdlan_channel] auth network code: ~p", [NetworkCode]),
|
lager:debug("[sdlan_channel] auth network code: ~p", [NetworkCode]),
|
||||||
sdlan_api:auth_network_code(ClientId, NetworkCode, Version)
|
sdlan_api:auth_network_code(ClientId, NetworkCode, Version)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
case AuthResult of
|
case AuthResult of
|
||||||
{ok, #{<<"result">> := #{<<"network_id">> := NetworkId, <<"upgrade_type">> := UpgradeType, <<"upgrade_prompt">> := UpgradePrompt, <<"upgrade_address">> := UpgradeAddress}}} when is_integer(NetworkId) ->
|
{ok, #{<<"result">> := #{<<"network_id">> := NetworkId, <<"upgrade_type">> := UpgradeType, <<"upgrade_prompt">> := UpgradePrompt, <<"upgrade_address">> := UpgradeAddress}}} when is_integer(NetworkId) ->
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, mac: ~p, token: ~p, version: ~p, registerd, alloc network_id: ~p", [ClientId, sdlan_util:format_mac(Mac), Token, Version, NetworkId]),
|
lager:debug("[sdlan_channel] client_id: ~p, mac: ~p, token: ~p, version: ~p, registerd, alloc network_id: ~p", [ClientId, sdlan_util:format_mac(Mac), Token, Version, NetworkId]),
|
||||||
%% 建立到network的对应关系
|
%% 建立到network的对应关系
|
||||||
case sdlan_network:get_pid(NetworkId) of
|
case sdlan_network:get_pid(NetworkId) of
|
||||||
NetworkPid when is_pid(NetworkPid) ->
|
NetworkPid when is_pid(NetworkPid) ->
|
||||||
@ -162,52 +162,52 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}, S
|
|||||||
%% 发送确认信息
|
%% 发送确认信息
|
||||||
Reply = <<PacketId:32, ?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>,
|
Reply = <<PacketId:32, ?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>,
|
||||||
Transport:send(Sock, Reply),
|
Transport:send(Sock, Reply),
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, mac: ~p, alloc ip: ~p, register will send ack, aes_key: ~p, enc_aes_key: ~p",
|
lager:debug("[sdlan_channel] client_id: ~p, mac: ~p, alloc ip: ~p, register will send ack, aes_key: ~p, enc_aes_key: ~p",
|
||||||
[ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr), AesKey, EncodedAesKey]),
|
[ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr), AesKey, EncodedAesKey]),
|
||||||
|
|
||||||
%% 设置节点的在线状态
|
%% 设置节点的在线状态
|
||||||
Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
|
Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, set none online, result is: ~p", [ClientId, Result]),
|
lager:debug("[sdlan_channel] client_id: ~p, set none online, result is: ~p", [ClientId, Result]),
|
||||||
case UpgradeType =:= ?UPGRADE_FORCE of
|
case UpgradeType =:= ?UPGRADE_FORCE of
|
||||||
true ->
|
true ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, need upgrade force!", [ClientId]),
|
lager:warning("[sdlan_channel] client_id: ~p, need upgrade force!", [ClientId]),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
false ->
|
false ->
|
||||||
{noreply, State#state{client_id = ClientId, mac = Mac, assign_ip = NetAddr, network_pid = NetworkPid, pub_key = PubKey, is_registered = true}}
|
{noreply, State#state{client_id = ClientId, mac = Mac, assign_ip = NetAddr, network_pid = NetworkPid, pub_key = PubKey, is_registered = true}}
|
||||||
end;
|
end;
|
||||||
{error, no_ip} ->
|
{error, no_ip} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: no_ip", [ClientId, Token]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: no_ip", [ClientId, Token]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NO_IP, <<"No Ip address">>)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NO_IP, <<"No Ip address">>)),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
{error, host_name_used} ->
|
{error, host_name_used} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: host_name_used", [ClientId, Token]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: host_name_used", [ClientId, Token]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
{error, client_disabled} ->
|
{error, client_disabled} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: client_disabled", [ClientId, Token]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: client_disabled", [ClientId, Token]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)),
|
||||||
{stop, normal, State}
|
{stop, normal, State}
|
||||||
catch _:Error:Stack ->
|
catch _:Error:Stack ->
|
||||||
logger:warning("[sdlan_channel] get error: ~p, stack: ~p", [Error, Stack])
|
lager:warning("[sdlan_channel] get error: ~p, stack: ~p", [Error, Stack])
|
||||||
end;
|
end;
|
||||||
undefined ->
|
undefined ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: network not found", [ClientId, Token]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: network not found", [ClientId, Token]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)),
|
||||||
|
|
||||||
{stop, normal, State}
|
{stop, normal, State}
|
||||||
end;
|
end;
|
||||||
{ok, #{<<"error">> := #{<<"code">> := 1, <<"message">> := Message}}} ->
|
{ok, #{<<"error">> := #{<<"code">> := 1, <<"message">> := Message}}} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~ts, error_code: 1", [ClientId, Token, Message]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~ts, error_code: 1", [ClientId, Token, Message]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INVALID_TOKEN, Message)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INVALID_TOKEN, Message)),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
{ok, #{<<"error">> := #{<<"code">> := 2, <<"message">> := Message}}} ->
|
{ok, #{<<"error">> := #{<<"code">> := 2, <<"message">> := Message}}} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p, error_code: 2", [ClientId, Token, Message]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p, error_code: 2", [ClientId, Token, Message]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, Message)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, Message)),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p", [ClientId, Token, Reason]),
|
lager:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p", [ClientId, Token, Reason]),
|
||||||
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)),
|
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)),
|
||||||
{stop, normal, State}
|
{stop, normal, State}
|
||||||
end;
|
end;
|
||||||
@ -216,13 +216,13 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, State
|
|||||||
#sdl_query_info{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info),
|
#sdl_query_info{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info),
|
||||||
case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of
|
case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of
|
||||||
error ->
|
error ->
|
||||||
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found",
|
lager:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found",
|
||||||
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
|
|
||||||
Transport:send(Sock, <<PacketId:32, ?PACKET_EMPTY>>),
|
Transport:send(Sock, <<PacketId:32, ?PACKET_EMPTY>>),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
{ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} ->
|
{ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} ->
|
||||||
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p",
|
lager:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p",
|
||||||
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]),
|
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]),
|
||||||
|
|
||||||
PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{
|
PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{
|
||||||
@ -239,7 +239,7 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, State
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
handle_info({tcp, _Sock, <<0:32, ?PACKET_PING>>}, State = #state{transport = Transport, socket = Sock, ping_counter = PingCounter}) ->
|
handle_info({tcp, _Sock, <<0:32, ?PACKET_PING>>}, State = #state{transport = Transport, socket = Sock, ping_counter = PingCounter}) ->
|
||||||
%logger:debug("[sdlan_channel] client_id: ~p, get ping", [ClientId]),
|
%lager:debug("[sdlan_channel] client_id: ~p, get ping", [ClientId]),
|
||||||
Transport:send(Sock, <<0:32, ?PACKET_PONG>>),
|
Transport:send(Sock, <<0:32, ?PACKET_PONG>>),
|
||||||
{noreply, State#state{ping_counter = PingCounter + 1}};
|
{noreply, State#state{ping_counter = PingCounter + 1}};
|
||||||
|
|
||||||
@ -250,7 +250,7 @@ handle_info({timeout, _, ping_ticker}, State = #state{client_id = ClientId, ping
|
|||||||
true ->
|
true ->
|
||||||
{noreply, State#state{ping_counter = 0}};
|
{noreply, State#state{ping_counter = 0}};
|
||||||
false ->
|
false ->
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, ping losted", [ClientId]),
|
lager:debug("[sdlan_channel] client_id: ~p, ping losted", [ClientId]),
|
||||||
{stop, normal, State#state{ping_counter = 0}}
|
{stop, normal, State#state{ping_counter = 0}}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
|
|||||||
State = #state{transport = Transport, socket = Sock, client_id = ClientId, mac = Mac, pub_key = PubKey, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
|
State = #state{transport = Transport, socket = Sock, client_id = ClientId, mac = Mac, pub_key = PubKey, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
|
||||||
|
|
||||||
%% 建立到network的对应关系
|
%% 建立到network的对应关系
|
||||||
case sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac) of
|
case sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac, 0, HostName) of
|
||||||
{ok, Domain, NetAddr, NetBitLen, AesKey} ->
|
{ok, Domain, NetAddr, NetBitLen, AesKey} ->
|
||||||
RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey),
|
RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey),
|
||||||
EncodedAesKey = rsa_encode(AesKey, RsaPubKey),
|
EncodedAesKey = rsa_encode(AesKey, RsaPubKey),
|
||||||
@ -281,10 +281,10 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
|
|||||||
%% 设置节点的在线状态
|
%% 设置节点的在线状态
|
||||||
sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
|
sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
|
||||||
|
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, move_network will send command: ~p", [ClientId, Command]),
|
lager:debug("[sdlan_channel] client_id: ~p, move_network will send command: ~p", [ClientId, Command]),
|
||||||
{noreply, State#state{packet_id = PacketId + 1, assign_ip = NetAddr, network_pid = NetworkPid, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
|
{noreply, State#state{packet_id = PacketId + 1, assign_ip = NetAddr, network_pid = NetworkPid, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, move_network get error: ~p", [ClientId, Reason]),
|
lager:debug("[sdlan_channel] client_id: ~p, move_network get error: ~p", [ClientId, Reason]),
|
||||||
Transport:send(Sock, register_nak_reply(0, ?NAK_NO_IP, <<"No Ip address">>)),
|
Transport:send(Sock, register_nak_reply(0, ?NAK_NO_IP, <<"No Ip address">>)),
|
||||||
ReceiverPid ! {command_reply, Ref, {error, <<"assign_ip error, no ip free">>}},
|
ReceiverPid ! {command_reply, Ref, {error, <<"assign_ip error, no ip free">>}},
|
||||||
{noreply, State}
|
{noreply, State}
|
||||||
@ -292,7 +292,7 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
|
|||||||
|
|
||||||
%% 发送指令信息
|
%% 发送指令信息
|
||||||
handle_info({send_event, EventType, Event}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, is_registered = true}) ->
|
handle_info({send_event, EventType, Event}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, is_registered = true}) ->
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, will send eventType: ~p, event: ~p", [ClientId, EventType, Event]),
|
lager:debug("[sdlan_channel] client_id: ~p, will send eventType: ~p, event: ~p", [ClientId, EventType, Event]),
|
||||||
Transport:send(Sock, <<0:32, ?PACKET_EVENT, EventType, Event/binary>>),
|
Transport:send(Sock, <<0:32, ?PACKET_EVENT, EventType, Event/binary>>),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
@ -301,18 +301,18 @@ handle_info({tcp, _Sock, <<0:32, ?PACKET_FLOW_TRACER, Body/binary>>}, State = #s
|
|||||||
#sdl_flows{forward_num = ForwardNum, p2p_num = P2PNum, inbound_num = InboundNum} = sdlan_pb:decode_msg(Body, sdl_flows),
|
#sdl_flows{forward_num = ForwardNum, p2p_num = P2PNum, inbound_num = InboundNum} = sdlan_pb:decode_msg(Body, sdl_flows),
|
||||||
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
|
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
|
||||||
ReportResult = sdlan_api:flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum),
|
ReportResult = sdlan_api:flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum),
|
||||||
logger:debug("[sdlan_channel] flow_tracer, forward: ~p, p2p: ~p, inbound: ~p, result: ~p", [ClientId, ForwardNum, P2PNum, InboundNum, ReportResult]),
|
lager:debug("[sdlan_channel] flow_tracer, forward: ~p, p2p: ~p, inbound: ~p, result: ~p", [ClientId, ForwardNum, P2PNum, InboundNum, ReportResult]),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
%% 取消注册
|
%% 取消注册
|
||||||
handle_info({tcp, _Sock, <<0:32, ?PACKET_UNREGISTER>>}, State = #state{client_id = ClientId, network_pid = NetworkPid, is_registered = true}) when is_pid(NetworkPid) ->
|
handle_info({tcp, _Sock, <<0:32, ?PACKET_UNREGISTER>>}, State = #state{client_id = ClientId, network_pid = NetworkPid, is_registered = true}) when is_pid(NetworkPid) ->
|
||||||
logger:warning("[sdlan_channel] unregister client_id: ~p", [ClientId]),
|
lager:warning("[sdlan_channel] unregister client_id: ~p", [ClientId]),
|
||||||
% sdlan_network:unregister(NetworkPid, ClientId),
|
% sdlan_network:unregister(NetworkPid, ClientId),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
%% 发送指令信息
|
%% 发送指令信息
|
||||||
handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
|
handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, will publish: ~p, message: ~p", [ClientId, CommandType, Msg]),
|
lager:warning("[sdlan_channel] client_id: ~p, will publish: ~p, message: ~p", [ClientId, CommandType, Msg]),
|
||||||
Transport:send(Sock, <<PacketId:32, ?PACKET_COMMAND, CommandType, Msg/binary>>),
|
Transport:send(Sock, <<PacketId:32, ?PACKET_COMMAND, CommandType, Msg/binary>>),
|
||||||
{noreply, State#state{packet_id = PacketId + 1, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
|
{noreply, State#state{packet_id = PacketId + 1, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
|
||||||
|
|
||||||
@ -320,27 +320,27 @@ handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #stat
|
|||||||
handle_info({tcp, _Sock, <<PacketId:32, ?PACKET_COMMAND_ACK, Body/binary>>}, State = #state{client_id = ClientId, inflight = Inflight}) when PacketId > 0 ->
|
handle_info({tcp, _Sock, <<PacketId:32, ?PACKET_COMMAND_ACK, Body/binary>>}, State = #state{client_id = ClientId, inflight = Inflight}) when PacketId > 0 ->
|
||||||
CommandAck = #sdl_command_ack{} = sdlan_pb:decode_msg(Body, sdl_command_ack),
|
CommandAck = #sdl_command_ack{} = sdlan_pb:decode_msg(Body, sdl_command_ack),
|
||||||
|
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, get publish response message: ~p, packet_id: ~p", [ClientId, CommandAck, PacketId]),
|
lager:debug("[sdlan_channel] client_id: ~p, get publish response message: ~p, packet_id: ~p", [ClientId, CommandAck, PacketId]),
|
||||||
case maps:take(PacketId, Inflight) of
|
case maps:take(PacketId, Inflight) of
|
||||||
error ->
|
error ->
|
||||||
logger:warning("[sdlan_channel] get unknown publish response message: ~p, packet_id: ~p", [CommandAck, PacketId]),
|
lager:warning("[sdlan_channel] get unknown publish response message: ~p, packet_id: ~p", [CommandAck, PacketId]),
|
||||||
{ok, State};
|
{ok, State};
|
||||||
{{ReceiverPid, Ref}, NInflight} ->
|
{{ReceiverPid, Ref}, NInflight} ->
|
||||||
case is_pid(ReceiverPid) andalso is_process_alive(ReceiverPid) of
|
case is_pid(ReceiverPid) andalso is_process_alive(ReceiverPid) of
|
||||||
true ->
|
true ->
|
||||||
ReceiverPid ! {command_reply, Ref, CommandAck};
|
ReceiverPid ! {command_reply, Ref, CommandAck};
|
||||||
false ->
|
false ->
|
||||||
logger:warning("[sdlan_channel] get publish response message: ~p, packet_id: ~p, but receiver_pid is deaded", [CommandAck, PacketId])
|
lager:warning("[sdlan_channel] get publish response message: ~p, packet_id: ~p, but receiver_pid is deaded", [CommandAck, PacketId])
|
||||||
end,
|
end,
|
||||||
{noreply, State#state{inflight = NInflight}}
|
{noreply, State#state{inflight = NInflight}}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
handle_info({tcp_error, Sock, Reason}, State = #state{socket = Sock, client_id = ClientId}) ->
|
handle_info({tcp_error, Sock, Reason}, State = #state{socket = Sock, client_id = ClientId}) ->
|
||||||
logger:notice("[sdlan_channel] client_id: ~p, tcp_error: ~p", [ClientId, Reason]),
|
lager:notice("[sdlan_channel] client_id: ~p, tcp_error: ~p", [ClientId, Reason]),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
handle_info({tcp_closed, Sock}, State = #state{socket = Sock, client_id = ClientId}) ->
|
handle_info({tcp_closed, Sock}, State = #state{socket = Sock, client_id = ClientId}) ->
|
||||||
logger:notice("[sdlan_channel] client_id: ~p, tcp_closed", [ClientId]),
|
lager:notice("[sdlan_channel] client_id: ~p, tcp_closed", [ClientId]),
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
%% 关闭当前通道
|
%% 关闭当前通道
|
||||||
@ -348,7 +348,7 @@ handle_info({stop, Reason}, State) ->
|
|||||||
{stop, Reason, State};
|
{stop, Reason, State};
|
||||||
|
|
||||||
handle_info(Info, State) ->
|
handle_info(Info, State) ->
|
||||||
logger:warning("[sdlan_channel] get a unknown message: ~p, channel will closed", [Info]),
|
lager:warning("[sdlan_channel] get a unknown message: ~p, channel will closed", [Info]),
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) ->
|
terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) ->
|
||||||
@ -356,11 +356,11 @@ terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) ->
|
|||||||
true ->
|
true ->
|
||||||
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
|
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
|
||||||
Result = sdlan_api:node_offline(ClientId, NetworkId),
|
Result = sdlan_api:node_offline(ClientId, NetworkId),
|
||||||
logger:debug("[sdlan_channel] client_id: ~p, set none offline, result is: ~p", [ClientId, Result]);
|
lager:debug("[sdlan_channel] client_id: ~p, set none offline, result is: ~p", [ClientId, Result]);
|
||||||
false ->
|
false ->
|
||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
logger:warning("[sdlan_channel] client_id: ~p, stop with reason: ~p", [ClientId, Reason]),
|
lager:warning("[sdlan_channel] client_id: ~p, stop with reason: ~p", [ClientId, Reason]),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
code_change(_OldVsn, State, _Extra) ->
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
test() ->
|
test() ->
|
||||||
Key = <<"abcdabcdabcdabcd">>,
|
Key = <<"abcdabcdabcdabcd">>,
|
||||||
X = aes_encrypt(Key, Key, <<"hello world">>),
|
X = aes_encrypt(Key, Key, <<"hello world">>),
|
||||||
logger:debug("x is: ~p, raw: ~p", [X, aes_decrypt(Key, Key, X)]),
|
lager:debug("x is: ~p, raw: ~p", [X, aes_decrypt(Key, Key, X)]),
|
||||||
|
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|||||||
@ -181,7 +181,7 @@ init([Id]) when is_integer(Id) ->
|
|||||||
|
|
||||||
{ok, #state{network_id = Id, name = Name, domain = Domain, ipaddr = IpAddr, owner_id = OwnerId, mask_len = MaskLen, aes_key = AesKey, throttle_key = ThrottleKey}};
|
{ok, #state{network_id = Id, name = Name, domain = Domain, ipaddr = IpAddr, owner_id = OwnerId, mask_len = MaskLen, aes_key = AesKey, throttle_key = ThrottleKey}};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]),
|
lager:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]),
|
||||||
ignore
|
ignore
|
||||||
end.
|
end.
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ handle_call({assign_ip_addr, ChannelPid, ClientId, Mac}, _From,
|
|||||||
case sdlan_api:assign_ip_address(NetworkId, ClientId, Mac) of
|
case sdlan_api:assign_ip_address(NetworkId, ClientId, Mac) of
|
||||||
{ok, #{<<"ip">> := Ip, <<"host_name">> := HostName}} ->
|
{ok, #{<<"ip">> := Ip, <<"host_name">> := HostName}} ->
|
||||||
%% 分配ip地址的时候,以mac地址为唯一基准
|
%% 分配ip地址的时候,以mac地址为唯一基准
|
||||||
logger:debug("[sdlan_network] alloc_ip, network_id: ~p, client_id: ~p, mac: ~p, net_addr: ~p",
|
lager:debug("[sdlan_network] alloc_ip, network_id: ~p, client_id: ~p, mac: ~p, net_addr: ~p",
|
||||||
[NetworkId, ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(Ip)]),
|
[NetworkId, ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(Ip)]),
|
||||||
%% 关闭之前的channel
|
%% 关闭之前的channel
|
||||||
maybe_close_channel(maps:get(Mac, Endpoints, undefined)),
|
maybe_close_channel(maps:get(Mac, Endpoints, undefined)),
|
||||||
@ -334,22 +334,22 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
|
|||||||
case limiting_check(ThrottleKey) of
|
case limiting_check(ThrottleKey) of
|
||||||
pass ->
|
pass ->
|
||||||
%% client和stun之间必须有心跳机制保持nat映射可用,并且通过服务转发的udp包肯定可以到达对端的nat
|
%% client和stun之间必须有心跳机制保持nat映射可用,并且通过服务转发的udp包肯定可以到达对端的nat
|
||||||
logger:debug("[sdlan_network] forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p",
|
lager:debug("[sdlan_network] forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]),
|
||||||
|
|
||||||
gen_udp:send(Sock, Ip, Port, Packet),
|
gen_udp:send(Sock, Ip, Port, Packet),
|
||||||
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
|
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
|
||||||
denied ->
|
denied ->
|
||||||
logger:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard",
|
lager:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
{noreply, State}
|
{noreply, State}
|
||||||
end;
|
end;
|
||||||
{ok, _} ->
|
{ok, _} ->
|
||||||
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found",
|
lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
error ->
|
error ->
|
||||||
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found",
|
lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
{noreply, State}
|
{noreply, State}
|
||||||
end;
|
end;
|
||||||
@ -372,24 +372,24 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
|
|||||||
end, [SrcMac], Endpoints),
|
end, [SrcMac], Endpoints),
|
||||||
|
|
||||||
%% client和stun之间必须有心跳机制保持nat映射可用,并且通过服务转发的udp包肯定可以到达对端的nat
|
%% client和stun之间必须有心跳机制保持nat映射可用,并且通过服务转发的udp包肯定可以到达对端的nat
|
||||||
logger:debug("[sdlan_network] broadcast data networkd_id: ~p, src_mac: ~p, dst_mac: ~p",
|
lager:debug("[sdlan_network] broadcast data networkd_id: ~p, src_mac: ~p, dst_mac: ~p",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
|
|
||||||
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
|
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
|
||||||
false ->
|
false ->
|
||||||
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 1",
|
lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 1",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
{noreply, State}
|
{noreply, State}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
handle_cast({forward, _Sock, SrcMac, DstMac, _Packet}, State = #state{network_id = NetworkId}) ->
|
handle_cast({forward, _Sock, SrcMac, DstMac, _Packet}, State = #state{network_id = NetworkId}) ->
|
||||||
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 2",
|
lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 2",
|
||||||
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
%% 删除ip的占用并关闭channel
|
%% 删除ip的占用并关闭channel
|
||||||
handle_cast({unregister, _ClientId, Mac}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
handle_cast({unregister, _ClientId, Mac}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
||||||
logger:debug("[sdlan_network] networkd_id: ~p, unregister Mac: ~p", [NetworkId, sdlan_util:format_mac(Mac)]),
|
lager:debug("[sdlan_network] networkd_id: ~p, unregister Mac: ~p", [NetworkId, sdlan_util:format_mac(Mac)]),
|
||||||
case maps:take(Mac, Endpoints) of
|
case maps:take(Mac, Endpoints) of
|
||||||
error ->
|
error ->
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
@ -439,7 +439,7 @@ handle_info({timeout, _, flow_report_ticker}, State = #state{network_id = Networ
|
|||||||
{noreply, State#state{forward_bytes = 0}};
|
{noreply, State#state{forward_bytes = 0}};
|
||||||
|
|
||||||
handle_info({'EXIT', _Pid, shutdown}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
handle_info({'EXIT', _Pid, shutdown}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
||||||
logger:warning("[sdlan_network] network: ~p, get shutdown message", [NetworkId]),
|
lager:warning("[sdlan_network] network: ~p, get shutdown message", [NetworkId]),
|
||||||
|
|
||||||
NetworkShutdownEvent = sdlan_pb:encode_msg(#sdl_network_shutdown_event {
|
NetworkShutdownEvent = sdlan_pb:encode_msg(#sdl_network_shutdown_event {
|
||||||
message = <<"Network shutdown">>
|
message = <<"Network shutdown">>
|
||||||
@ -457,7 +457,7 @@ handle_info({'EXIT', _Pid, shutdown}, State = #state{network_id = NetworkId, end
|
|||||||
{stop, shutdown, State};
|
{stop, shutdown, State};
|
||||||
%% Channel进程退出, hole里面的数据也需要清理
|
%% Channel进程退出, hole里面的数据也需要清理
|
||||||
handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
||||||
logger:notice("[sdlan_network] network_id: ~p, channel_pid: ~p, close with reason: ~p", [NetworkId, ChannelPid, Reason]),
|
lager:notice("[sdlan_network] network_id: ~p, channel_pid: ~p, close with reason: ~p", [NetworkId, ChannelPid, Reason]),
|
||||||
NUsedMap = maps:filter(fun(_, #endpoint{channel_pid = ChannelPid0}) -> ChannelPid =/= ChannelPid0 end, Endpoints),
|
NUsedMap = maps:filter(fun(_, #endpoint{channel_pid = ChannelPid0}) -> ChannelPid =/= ChannelPid0 end, Endpoints),
|
||||||
{noreply, State#state{endpoints = NUsedMap}}.
|
{noreply, State#state{endpoints = NUsedMap}}.
|
||||||
|
|
||||||
@ -469,7 +469,7 @@ handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network
|
|||||||
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
|
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
|
||||||
State :: #state{}) -> term()).
|
State :: #state{}) -> term()).
|
||||||
terminate(Reason, #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
terminate(Reason, #state{network_id = NetworkId, endpoints = Endpoints}) ->
|
||||||
logger:debug("[sdlan_network] network: ~p, will terminate with reason: ~p", [NetworkId, Reason]),
|
lager:debug("[sdlan_network] network: ~p, will terminate with reason: ~p", [NetworkId, Reason]),
|
||||||
|
|
||||||
NetworkShutdownEvent = sdlan_pb:encode_msg(#sdl_network_shutdown_event {
|
NetworkShutdownEvent = sdlan_pb:encode_msg(#sdl_network_shutdown_event {
|
||||||
message = <<"Network shutdown">>
|
message = <<"Network shutdown">>
|
||||||
|
|||||||
@ -104,10 +104,10 @@ handle_info({timeout, _, release_ticker}, State = #state{network_map = ChannelMa
|
|||||||
Acc
|
Acc
|
||||||
end
|
end
|
||||||
end, 0, maps:keys(ChannelMap)),
|
end, 0, maps:keys(ChannelMap)),
|
||||||
% logger:debug("[sdlan_network_coordinator] can release count is: ~p", [AccReleaseCount]),
|
% lager:debug("[sdlan_network_coordinator] can release count is: ~p", [AccReleaseCount]),
|
||||||
{noreply, State#state{release_count = AccReleaseCount}};
|
{noreply, State#state{release_count = AccReleaseCount}};
|
||||||
handle_info({'DOWN', _, process, NetworkPid, Reason}, State = #state{network_map = NetworkMap}) ->
|
handle_info({'DOWN', _, process, NetworkPid, Reason}, State = #state{network_map = NetworkMap}) ->
|
||||||
logger:debug("[sdlan_network_coordinator] network_pid close with reason: ~p", [Reason]),
|
lager:debug("[sdlan_network_coordinator] network_pid close with reason: ~p", [Reason]),
|
||||||
{noreply, State#state{network_map = maps:remove(NetworkPid, NetworkMap)}}.
|
{noreply, State#state{network_map = maps:remove(NetworkPid, NetworkMap)}}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
|
|||||||
@ -58,7 +58,7 @@ init([Port]) ->
|
|||||||
|
|
||||||
{ok, Socket} = gen_udp:open(Port, [binary, {active, true}, {recbuf, 5 * 1024 * 1024}, {sndbuf, 5 * 1024 * 1024}]),
|
{ok, Socket} = gen_udp:open(Port, [binary, {active, true}, {recbuf, 5 * 1024 * 1024}, {sndbuf, 5 * 1024 * 1024}]),
|
||||||
inet_udp:controlling_process(Socket, self()),
|
inet_udp:controlling_process(Socket, self()),
|
||||||
logger:debug("[sdlan_stun] start at port: ~p", [Port]),
|
lager:debug("[sdlan_stun] start at port: ~p", [Port]),
|
||||||
|
|
||||||
case application:get_env(sdlan, stun_assist) of
|
case application:get_env(sdlan, stun_assist) of
|
||||||
undefined ->
|
undefined ->
|
||||||
@ -105,7 +105,7 @@ handle_info({udp, Sock, Ip, Port, <<?PACKET_STUN_REQUEST:8, Body/binary>>}, Stat
|
|||||||
|
|
||||||
case sdlan_network:get_pid(NetworkId) of
|
case sdlan_network:get_pid(NetworkId) of
|
||||||
undefined ->
|
undefined ->
|
||||||
logger:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, not found", [NetworkId, ClientId]),
|
lager:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, not found", [NetworkId, ClientId]),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
NetworkPid when is_pid(NetworkPid) ->
|
NetworkPid when is_pid(NetworkPid) ->
|
||||||
sdlan_network:update_hole(NetworkPid, ClientId, Mac, {Ip, Port}, NatType, V6Info),
|
sdlan_network:update_hole(NetworkPid, ClientId, Mac, {Ip, Port}, NatType, V6Info),
|
||||||
@ -113,7 +113,7 @@ handle_info({udp, Sock, Ip, Port, <<?PACKET_STUN_REQUEST:8, Body/binary>>}, Stat
|
|||||||
cookie = Cookie
|
cookie = Cookie
|
||||||
}),
|
}),
|
||||||
ok = gen_udp:send(Sock, Ip, Port, <<?PACKET_STUN_REPLY, StunReply/binary>>),
|
ok = gen_udp:send(Sock, Ip, Port, <<?PACKET_STUN_REPLY, StunReply/binary>>),
|
||||||
logger:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, hole: ~p", [NetworkId, ClientId, {Ip, Port}]),
|
lager:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, hole: ~p", [NetworkId, ClientId, {Ip, Port}]),
|
||||||
{noreply, State}
|
{noreply, State}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ handle_info({udp, Sock, Ip, Port, <<?PACKET_STUN_REQUEST:8, Body/binary>>}, Stat
|
|||||||
%% 辅助节点没有assist的配置,不支持attr = 2的探测
|
%% 辅助节点没有assist的配置,不支持attr = 2的探测
|
||||||
handle_info({udp, Sock, Ip = {Ip0, Ip1, Ip2, Ip3}, Port, <<?PACKET_STUN_PROBE:8, Body/binary>>}, State = #state{socket = Sock, stun_assist = StunAssist}) ->
|
handle_info({udp, Sock, Ip = {Ip0, Ip1, Ip2, Ip3}, Port, <<?PACKET_STUN_PROBE:8, Body/binary>>}, State = #state{socket = Sock, stun_assist = StunAssist}) ->
|
||||||
#sdl_stun_probe{cookie = Cookie, attr = Attr} = sdlan_pb:decode_msg(Body, sdl_stun_probe),
|
#sdl_stun_probe{cookie = Cookie, attr = Attr} = sdlan_pb:decode_msg(Body, sdl_stun_probe),
|
||||||
logger:debug("[sdlan_stun] get stun_probe request, att: ~p", [Attr]),
|
lager:debug("[sdlan_stun] get stun_probe request, att: ~p", [Attr]),
|
||||||
|
|
||||||
ProbeReply = sdlan_pb:encode_msg(#sdl_stun_probe_reply {
|
ProbeReply = sdlan_pb:encode_msg(#sdl_stun_probe_reply {
|
||||||
cookie = Cookie,
|
cookie = Cookie,
|
||||||
@ -147,14 +147,14 @@ handle_info({udp, Sock, Ip = {Ip0, Ip1, Ip2, Ip3}, Port, <<?PACKET_STUN_PROBE:8,
|
|||||||
|
|
||||||
%% 转发消息, 跨服务器的stun_reply的转发通过socket来转发
|
%% 转发消息, 跨服务器的stun_reply的转发通过socket来转发
|
||||||
handle_info({udp, Sock, _, _, <<?PACKET_STUN_PROBE_RELAY:8, Ip0, Ip1, Ip2, Ip3, Port:16, Reply/binary>>}, State = #state{socket = Sock}) ->
|
handle_info({udp, Sock, _, _, <<?PACKET_STUN_PROBE_RELAY:8, Ip0, Ip1, Ip2, Ip3, Port:16, Reply/binary>>}, State = #state{socket = Sock}) ->
|
||||||
logger:debug("[sdlan_stun] get stun_probe_replay request, reply: ~p", [Reply]),
|
lager:debug("[sdlan_stun] get stun_probe_replay request, reply: ~p", [Reply]),
|
||||||
gen_udp:send(Sock, {Ip0, Ip1, Ip2, Ip3}, Port, Reply),
|
gen_udp:send(Sock, {Ip0, Ip1, Ip2, Ip3}, Port, Reply),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #state{socket = Sock}) ->
|
handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #state{socket = Sock}) ->
|
||||||
Data = #sdl_data{network_id = NetworkId, src_mac = SrcMac, dst_mac = DstMac, ttl = TTL} = sdlan_pb:decode_msg(Body, sdl_data),
|
Data = #sdl_data{network_id = NetworkId, src_mac = SrcMac, dst_mac = DstMac, ttl = TTL} = sdlan_pb:decode_msg(Body, sdl_data),
|
||||||
|
|
||||||
logger:debug("[sdlan_stun] stun data, src_mac: ~p, dst_mac: ~p", [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
lager:debug("[sdlan_stun] stun data, src_mac: ~p, dst_mac: ~p", [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||||
maybe
|
maybe
|
||||||
{ok, NetworkPid} ?= sdlan_network:lookup_pid(NetworkId),
|
{ok, NetworkPid} ?= sdlan_network:lookup_pid(NetworkId),
|
||||||
%% 重新打包数据ttl需要减1
|
%% 重新打包数据ttl需要减1
|
||||||
@ -165,7 +165,7 @@ handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #s
|
|||||||
|
|
||||||
handle_info({udp, _, Ip, Port, <<?PACKET_ARP_REQUEST, Body/binary>>}, State = #state{socket = Sock}) ->
|
handle_info({udp, _, Ip, Port, <<?PACKET_ARP_REQUEST, Body/binary>>}, State = #state{socket = Sock}) ->
|
||||||
#sdl_arp_request{network_id = NetworkId, target_ip = TargetIp} = sdlan_pb:decode_msg(Body, sdl_arp_request),
|
#sdl_arp_request{network_id = NetworkId, target_ip = TargetIp} = sdlan_pb:decode_msg(Body, sdl_arp_request),
|
||||||
logger:debug("[sdlan_stun] stun sdl_arp_request, network_id: ~p, target_ip: ~p", [NetworkId, TargetIp]),
|
lager:debug("[sdlan_stun] stun sdl_arp_request, network_id: ~p, target_ip: ~p", [NetworkId, TargetIp]),
|
||||||
maybe
|
maybe
|
||||||
{ok, NetworkPid} ?= sdlan_network:lookup_pid(NetworkId),
|
{ok, NetworkPid} ?= sdlan_network:lookup_pid(NetworkId),
|
||||||
{ok, TargetMac} ?= sdlan_network:arp_query(NetworkPid, TargetIp),
|
{ok, TargetMac} ?= sdlan_network:arp_query(NetworkPid, TargetIp),
|
||||||
@ -175,7 +175,7 @@ handle_info({udp, _, Ip, Port, <<?PACKET_ARP_REQUEST, Body/binary>>}, State = #s
|
|||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
handle_info(Info, State) ->
|
handle_info(Info, State) ->
|
||||||
logger:error("[sdlan_stun] get a unknown message: ~p, channel will closed", [Info]),
|
lager:error("[sdlan_stun] get a unknown message: ~p, channel will closed", [Info]),
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
|
|||||||
@ -86,7 +86,7 @@ handle_cast(_Info, State) ->
|
|||||||
handle_info({udp, Sock, _Ip, _Port, Data}, State = #state{socket = Sock, bytes = Bytes}) ->
|
handle_info({udp, Sock, _Ip, _Port, Data}, State = #state{socket = Sock, bytes = Bytes}) ->
|
||||||
{noreply, State#state{bytes = Bytes + byte_size(Data)}};
|
{noreply, State#state{bytes = Bytes + byte_size(Data)}};
|
||||||
handle_info({timeout, _, qps_ticker}, State = #state{bytes = Bytes}) ->
|
handle_info({timeout, _, qps_ticker}, State = #state{bytes = Bytes}) ->
|
||||||
logger:debug("[sdlan_udp_wget] qps is: ~p(M)", [Bytes / 1024 / 1024]),
|
lager:debug("[sdlan_udp_wget] qps is: ~p(M)", [Bytes / 1024 / 1024]),
|
||||||
erlang:start_timer(5000, self(), qps_ticker),
|
erlang:start_timer(5000, self(), qps_ticker),
|
||||||
{noreply, State#state{bytes = 0}}.
|
{noreply, State#state{bytes = 0}}.
|
||||||
|
|
||||||
|
|||||||
@ -111,7 +111,7 @@ handle_call(register, _From, State = #state{socket = Socket, client_id = ClientI
|
|||||||
token = <<"1234567890">>
|
token = <<"1234567890">>
|
||||||
},
|
},
|
||||||
|
|
||||||
logger:debug("register is: ~p", [Register]),
|
lager:debug("register is: ~p", [Register]),
|
||||||
|
|
||||||
Packet = jiffy:encode(Req, [force_utf8]),
|
Packet = jiffy:encode(Req, [force_utf8]),
|
||||||
ok = gen_tcp:send(Socket, <<1:32, 101, Packet/binary>>),
|
ok = gen_tcp:send(Socket, <<1:32, 101, Packet/binary>>),
|
||||||
@ -145,7 +145,7 @@ handle_info({tcp, Socket, <<1:32, 5, Data/binary>>}, State = #state{socket = Soc
|
|||||||
<<"lifetime">> := Lifetime
|
<<"lifetime">> := Lifetime
|
||||||
} = Response,
|
} = Response,
|
||||||
|
|
||||||
logger:debug("[stun_client] get a register super response: ~p, alloc ip addr: ~p", [Response, sdlan_ipaddr:int_to_ipv4(NetAddr)]),
|
lager:debug("[stun_client] get a register super response: ~p, alloc ip addr: ~p", [Response, sdlan_ipaddr:int_to_ipv4(NetAddr)]),
|
||||||
|
|
||||||
%% 开始注册自己的tun信息
|
%% 开始注册自己的tun信息
|
||||||
gen_udp:send(TunSocket, "localhost", 1265, <<1, Cookie:32, ClientId/binary, NetworkId:32, NetAddr:32>>),
|
gen_udp:send(TunSocket, "localhost", 1265, <<1, Cookie:32, ClientId/binary, NetworkId:32, NetAddr:32>>),
|
||||||
@ -153,36 +153,36 @@ handle_info({tcp, Socket, <<1:32, 5, Data/binary>>}, State = #state{socket = Soc
|
|||||||
{noreply, State#state{network_id = NetworkId, net_addr = NetAddr, mask_len = NetBitLen, aes_key = AesKey, cookie = Cookie + 1}};
|
{noreply, State#state{network_id = NetworkId, net_addr = NetAddr, mask_len = NetBitLen, aes_key = AesKey, cookie = Cookie + 1}};
|
||||||
|
|
||||||
handle_info({udp, _, _, _, <<2, Cookie:32, Family, Port:16, Ip0, Ip1, Ip2, Ip3>>}, State = #state{}) ->
|
handle_info({udp, _, _, _, <<2, Cookie:32, Family, Port:16, Ip0, Ip1, Ip2, Ip3>>}, State = #state{}) ->
|
||||||
logger:debug("[stun_client] tun register ack, cookie: ~p, ack: ~p", [Cookie, {Family, Port, {Ip0, Ip1, Ip2, Ip3}}]),
|
lager:debug("[stun_client] tun register ack, cookie: ~p, ack: ~p", [Cookie, {Family, Port, {Ip0, Ip1, Ip2, Ip3}}]),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER:8, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
|
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER:8, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
|
||||||
Packet = <<?STUN_REGISTER_ACK, NetworkId:32, DstIp:32, SrcIp:32>>,
|
Packet = <<?STUN_REGISTER_ACK, NetworkId:32, DstIp:32, SrcIp:32>>,
|
||||||
logger:debug("[stun_client] will send stun reply: ~p, peer: ~p", [Packet, {Ip, Port}]),
|
lager:debug("[stun_client] will send stun reply: ~p, peer: ~p", [Packet, {Ip, Port}]),
|
||||||
ok = gen_udp:send(TunSocket, Ip, Port, Packet),
|
ok = gen_udp:send(TunSocket, Ip, Port, Packet),
|
||||||
|
|
||||||
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
|
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
|
||||||
{noreply, State#state{sessions = NSessions}};
|
{noreply, State#state{sessions = NSessions}};
|
||||||
|
|
||||||
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER_ACK, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{sessions = Sessions}) ->
|
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER_ACK, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{sessions = Sessions}) ->
|
||||||
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, register_ack!!!", [NetworkId, SrcIp, DstIp]),
|
lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, register_ack!!!", [NetworkId, SrcIp, DstIp]),
|
||||||
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
|
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
|
||||||
{noreply, State#state{sessions = NSessions}};
|
{noreply, State#state{sessions = NSessions}};
|
||||||
|
|
||||||
handle_info({udp, _, _Ip0, _Port0, <<?STUN_DATA, NetworkId:32, SrcIp:32, DstIp:32, TTL:8, Data/binary>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
|
handle_info({udp, _, _Ip0, _Port0, <<?STUN_DATA, NetworkId:32, SrcIp:32, DstIp:32, TTL:8, Data/binary>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
|
||||||
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, data!!!", [NetworkId, SrcIp, DstIp]),
|
lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, data!!!", [NetworkId, SrcIp, DstIp]),
|
||||||
case maps:is_key(SrcIp, Sessions) of
|
case maps:is_key(SrcIp, Sessions) of
|
||||||
true ->
|
true ->
|
||||||
{Ip, Port} = maps:get(SrcIp, Sessions),
|
{Ip, Port} = maps:get(SrcIp, Sessions),
|
||||||
ok = gen_udp:send(TunSocket, Ip, Port, <<?STUN_DATA, NetworkId:32, DstIp:32, SrcIp:32, 255, Data/binary>>),
|
ok = gen_udp:send(TunSocket, Ip, Port, <<?STUN_DATA, NetworkId:32, DstIp:32, SrcIp:32, 255, Data/binary>>),
|
||||||
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, reply data!!!", [NetworkId, SrcIp, DstIp]);
|
lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, reply data!!!", [NetworkId, SrcIp, DstIp]);
|
||||||
false ->
|
false ->
|
||||||
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, no session", [NetworkId, SrcIp, DstIp])
|
lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, no session", [NetworkId, SrcIp, DstIp])
|
||||||
end,
|
end,
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
handle_info(Info, State = #state{}) ->
|
handle_info(Info, State = #state{}) ->
|
||||||
logger:debug("[stun_client] get info: ~p", [Info]),
|
lager:debug("[stun_client] get info: ~p", [Info]),
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
|
|||||||
@ -62,30 +62,37 @@
|
|||||||
]},
|
]},
|
||||||
|
|
||||||
%% 系统日志配置,系统日志为lager, 支持日志按日期自动分割
|
%% 系统日志配置,系统日志为lager, 支持日志按日期自动分割
|
||||||
{kernel, [
|
{lager, [
|
||||||
%% 设置 Logger 的 primary log level
|
{colored, true},
|
||||||
{logger_level, debug},
|
%% Whether to write a crash log, and where. Undefined means no crash logger.
|
||||||
{logger, [
|
{crash_log, "trade_hub.crash.log"},
|
||||||
{handler, default, logger_std_h,
|
%% Maximum size in bytes of events in the crash log - defaults to 65536
|
||||||
#{
|
{crash_log_msg_size, 65536},
|
||||||
level => debug,
|
%% Maximum size of the crash log in bytes, before its rotated, set
|
||||||
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}}
|
%% to 0 to disable rotation - default is 0
|
||||||
}
|
{crash_log_size, 10485760},
|
||||||
},
|
%% What time to rotate the crash log - default is no time
|
||||||
|
%% rotation. See the README for a description of this format.
|
||||||
|
{crash_log_date, "$D0"},
|
||||||
|
%% Number of rotated crash logs to keep, 0 means keep only the
|
||||||
|
%% current one - default is 0
|
||||||
|
{crash_log_count, 5},
|
||||||
|
%% Whether to redirect error_logger messages into lager - defaults to true
|
||||||
|
{error_logger_redirect, true},
|
||||||
|
|
||||||
{handler, disk, logger_disk_log_h,
|
%% How big the gen_event mailbox can get before it is switched into sync mode
|
||||||
#{
|
{async_threshold, 20},
|
||||||
level => debug,
|
%% Switch back to async mode, when gen_event mailbox size decrease from `async_threshold'
|
||||||
config => #{
|
%% to async_threshold - async_threshold_window
|
||||||
file => "log/debug.log",
|
{async_threshold_window, 5},
|
||||||
max_no_files => 10,
|
|
||||||
max_no_bytes => 524288000
|
|
||||||
},
|
|
||||||
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
{handlers, [
|
||||||
|
%% debug | info | warning | error, 日志级别
|
||||||
|
{lager_console_backend, debug},
|
||||||
|
{lager_file_backend, [{file, "debug.log"}, {level, debug}, {size, 314572800}]},
|
||||||
|
{lager_file_backend, [{file, "notice.log"}, {level, notice}, {size, 314572800}]},
|
||||||
|
{lager_file_backend, [{file, "error.log"}, {level, error}, {size, 314572800}]},
|
||||||
|
{lager_file_backend, [{file, "info.log"}, {level, info}, {size, 314572800}]}
|
||||||
]}
|
]}
|
||||||
]}
|
]}
|
||||||
|
|
||||||
].
|
].
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
{erl_opts, [
|
{erl_opts, [debug_info]}.
|
||||||
debug_info
|
|
||||||
]}.
|
|
||||||
|
|
||||||
{deps, [
|
{deps, [
|
||||||
{poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}},
|
{poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}},
|
||||||
{hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}},
|
{hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}},
|
||||||
@ -46,4 +43,7 @@
|
|||||||
%% {mode, minimal}
|
%% {mode, minimal}
|
||||||
]
|
]
|
||||||
}]}]}.
|
}]}]}.
|
||||||
|
|
||||||
|
{erl_opts, [{parse_transform,lager_transform}]}.
|
||||||
|
|
||||||
{rebar_packages_cdn, "https://hexpm.upyun.com"}.
|
{rebar_packages_cdn, "https://hexpm.upyun.com"}.
|
||||||
Loading…
x
Reference in New Issue
Block a user