diff --git a/src/http_handler/network_handler.erl b/src/http_handler/network_handler.erl index b3550e6..da04d2a 100644 --- a/src/http_handler/network_handler.erl +++ b/src/http_handler/network_handler.erl @@ -14,12 +14,13 @@ -export([handle_request/4]). handle_request("POST", "/network/create", _, #{<<"id">> := NetworkId}) when NetworkId > 0 -> - case sdlan_network_sup:ensured_network_started(NetworkId) of + case sdlan_network_sup:ensure_network_started(NetworkId) of {ok, Pid} when is_pid(Pid) -> {ok, 200, sdlan_util:json_data(<<"success">>)}; {error, Reason} -> logger:debug("[network_handler] create network: ~p, get error: ~p", [NetworkId, Reason]), - {ok, 200, sdlan_util:json_error(-1, <<"error">>)} + ReasonBin = sdlan_util:term_to_binary(Reason), + {ok, 200, sdlan_util:json_error(-1, <<"error: ", ReasonBin/binary>>)} end; handle_request("POST", "/network/delete", _, #{<<"id">> := NetworkId}) when NetworkId > 0 -> diff --git a/src/sdlan_network.erl b/src/sdlan_network.erl index e608daf..5b0e596 100644 --- a/src/sdlan_network.erl +++ b/src/sdlan_network.erl @@ -172,7 +172,7 @@ init([Id]) when is_integer(Id) -> erlang:process_flag(trap_exit, true), case sdlan_api:get_network(Id) of {ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> -> - ignore; + {stop, <<"ipaddrr is null">>}; {ok, NetworkInfo = #{<<"id">> := Id, <<"name">> := Name, <<"domain">> := Domain, <<"algorithm">> := Algorithm0, <<"ipaddr">> := IpAddr0, <<"owner_id">> := OwnerId}} -> logger:debug("[sdlan_network] load network info: ~p", [NetworkInfo]), {IpAddr, MaskLen} = parse_ipaddr(IpAddr0), @@ -194,7 +194,7 @@ init([Id]) when is_integer(Id) -> owner_id = OwnerId, mask_len = MaskLen, key = Key, throttle_key = ThrottleKey}}; {error, Reason} -> logger:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]), - ignore + {stop, Reason} end. %% @private diff --git a/src/sdlan_network_sup.erl b/src/sdlan_network_sup.erl index 5948464..069cd36 100644 --- a/src/sdlan_network_sup.erl +++ b/src/sdlan_network_sup.erl @@ -13,7 +13,7 @@ %% API -export([start_link/0]). --export([ensured_network_started/1, delete_network/1, get_all_networks/0, start_network/1, reallocate_bind_width/0]). +-export([ensure_network_started/1, delete_network/1, get_all_networks/0, start_network/1, reallocate_bind_width/0]). %% Supervisor callbacks -export([init/1]). @@ -50,13 +50,15 @@ init([]) -> %%% Internal functions %%%=================================================================== --spec ensured_network_started(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. -ensured_network_started(Id) when is_integer(Id) -> +-spec ensure_network_started(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. +ensure_network_started(Id) when is_integer(Id) -> case sdlan_network:get_pid(Id) of undefined -> case supervisor:start_child(?MODULE, child_spec(Id)) of {ok, Pid} when is_pid(Pid) -> {ok, Pid}; + {ok, undefined} -> + {error, ignored}; {error, {'already_started', Pid}} when is_pid(Pid) -> {ok, Pid}; {error, Error} -> diff --git a/src/sdlan_util.erl b/src/sdlan_util.erl index b502bc9..52dcf39 100644 --- a/src/sdlan_util.erl +++ b/src/sdlan_util.erl @@ -15,7 +15,7 @@ -export([is_broadcast_mac/1, is_multicast_mac/1]). -export([ipv4_to_int/1, int_to_ipv4/1, ips/2, format_ip/1]). -export([ipv6_to_bytes/1, ipv6_bytes_to_binary/1, ipv6_assist_info/0]). --export([hmac/2]). +-export([hmac/2, term_to_binary/1]). -spec format_mac(Mac :: binary()) -> binary(). format_mac(Mac) when is_binary(Mac) -> @@ -162,3 +162,6 @@ hmac(Key, Data) when is_binary(Key), is_binary(Data) -> Digest = crypto:mac(hmac, md5, Key, Data), %% 转成十六进制小写字符串,和 PHP hash_hmac 一致 lists:flatten([io_lib:format("~2.16.0b", [B]) || B <- binary:bin_to_list(Digest)]). + +term_to_binary(Term) -> + iolist_to_binary(io_lib:format("~p", [Term])). \ No newline at end of file