chore: ensure the `bind` output style

e.g:
- Configured as `1883`, printed as `:1883`
- Configured as `0.0.0.0:1883`, printed as `:1883`
- Configured as `127.0.0.1:1883`, printed as `127.0.0.1:1883`
- Configured as `::1:1883`, printed as `[::1]:1883`
- Configured as `[::1]:1883`, printed as `[::1]:1883`
This commit is contained in:
JianBo He 2022-07-26 18:09:18 +08:00
parent 889e25d64e
commit 257e310931
8 changed files with 40 additions and 57 deletions

View File

@ -54,7 +54,7 @@
-export([pre_config_update/3, post_config_update/5]). -export([pre_config_update/3, post_config_update/5]).
-export([format_addr/1]). -export([format_bind/1]).
-define(CONF_KEY_PATH, [listeners, '?', '?']). -define(CONF_KEY_PATH, [listeners, '?', '?']).
-define(TYPES_STRING, ["tcp", "ssl", "ws", "wss", "quic"]). -define(TYPES_STRING, ["tcp", "ssl", "ws", "wss", "quic"]).
@ -201,14 +201,14 @@ start_listener(Type, ListenerName, #{bind := Bind} = Conf) ->
?tp(listener_started, #{type => Type, bind => Bind}), ?tp(listener_started, #{type => Type, bind => Bind}),
console_print( console_print(
"Listener ~ts on ~ts started.~n", "Listener ~ts on ~ts started.~n",
[listener_id(Type, ListenerName), format_addr(Bind)] [listener_id(Type, ListenerName), format_bind(Bind)]
), ),
ok; ok;
{error, {already_started, Pid}} -> {error, {already_started, Pid}} ->
{error, {already_started, Pid}}; {error, {already_started, Pid}};
{error, Reason} -> {error, Reason} ->
ListenerId = listener_id(Type, ListenerName), ListenerId = listener_id(Type, ListenerName),
BindStr = format_addr(Bind), BindStr = format_bind(Bind),
?ELOG( ?ELOG(
"Failed to start listener ~ts on ~ts: ~0p.~n", "Failed to start listener ~ts on ~ts: ~0p.~n",
[ListenerId, BindStr, Reason] [ListenerId, BindStr, Reason]
@ -261,19 +261,19 @@ stop_listener(Type, ListenerName, #{bind := Bind} = Conf) ->
ok -> ok ->
console_print( console_print(
"Listener ~ts on ~ts stopped.~n", "Listener ~ts on ~ts stopped.~n",
[listener_id(Type, ListenerName), format_addr(Bind)] [listener_id(Type, ListenerName), format_bind(Bind)]
), ),
ok; ok;
{error, not_found} -> {error, not_found} ->
?ELOG( ?ELOG(
"Failed to stop listener ~ts on ~ts: ~0p~n", "Failed to stop listener ~ts on ~ts: ~0p~n",
[listener_id(Type, ListenerName), format_addr(Bind), already_stopped] [listener_id(Type, ListenerName), format_bind(Bind), already_stopped]
), ),
ok; ok;
{error, Reason} -> {error, Reason} ->
?ELOG( ?ELOG(
"Failed to stop listener ~ts on ~ts: ~0p~n", "Failed to stop listener ~ts on ~ts: ~0p~n",
[listener_id(Type, ListenerName), format_addr(Bind), Reason] [listener_id(Type, ListenerName), format_bind(Bind), Reason]
), ),
{error, Reason} {error, Reason}
end. end.
@ -492,17 +492,32 @@ merge_default(Options) ->
[{tcp_options, ?MQTT_SOCKOPTS} | Options] [{tcp_options, ?MQTT_SOCKOPTS} | Options]
end. end.
format_addr(Port) when is_integer(Port) -> -spec format_bind(
io_lib:format("~w", [Port]); integer() | {tuple(), integer()} | string() | binary()
) -> io_lib:chars().
format_bind(Port) when is_integer(Port) ->
io_lib:format(":~w", [Port]);
%% Print only the port number when bound on all interfaces %% Print only the port number when bound on all interfaces
format_addr({{0, 0, 0, 0}, Port}) -> format_bind({{0, 0, 0, 0}, Port}) ->
format_addr(Port); format_bind(Port);
format_addr({{0, 0, 0, 0, 0, 0, 0, 0}, Port}) -> format_bind({{0, 0, 0, 0, 0, 0, 0, 0}, Port}) ->
format_addr(Port); format_bind(Port);
format_addr({Addr, Port}) when is_list(Addr) -> format_bind({Addr, Port}) when is_list(Addr) ->
io_lib:format("~ts:~w", [Addr, Port]); io_lib:format("~ts:~w", [Addr, Port]);
format_addr({Addr, Port}) when is_tuple(Addr) -> format_bind({Addr, Port}) when is_tuple(Addr), tuple_size(Addr) == 4 ->
io_lib:format("~ts:~w", [inet:ntoa(Addr), Port]). io_lib:format("~ts:~w", [inet:ntoa(Addr), Port]);
format_bind({Addr, Port}) when is_tuple(Addr), tuple_size(Addr) == 8 ->
io_lib:format("[~ts]:~w", [inet:ntoa(Addr), Port]);
%% Support string, binary type for Port or IP:Port
format_bind(Str) when is_list(Str) ->
case emqx_schema:to_ip_port(Str) of
{ok, {Ip, Port}} ->
format_bind({Ip, Port});
{error, _} ->
format_bind(list_to_integer(Str))
end;
format_bind(Bin) when is_binary(Bin) ->
format_bind(binary_to_list(Bin)).
listener_id(Type, ListenerName) -> listener_id(Type, ListenerName) ->
list_to_atom(lists:append([str(Type), ":", str(ListenerName)])). list_to_atom(lists:append([str(Type), ":", str(ListenerName)])).

View File

@ -92,7 +92,7 @@ start_listeners(Listeners) ->
case minirest:start(Name, RanchOptions, Minirest) of case minirest:start(Name, RanchOptions, Minirest) of
{ok, _} -> {ok, _} ->
?ULOG("Listener ~ts on ~ts started.~n", [ ?ULOG("Listener ~ts on ~ts started.~n", [
Name, emqx_listeners:format_addr(Bind) Name, emqx_listeners:format_bind(Bind)
]), ]),
Acc; Acc;
{error, _Reason} -> {error, _Reason} ->
@ -114,7 +114,7 @@ stop_listeners(Listeners) ->
case minirest:stop(Name) of case minirest:stop(Name) of
ok -> ok ->
?ULOG("Stop listener ~ts on ~ts successfully.~n", [ ?ULOG("Stop listener ~ts on ~ts successfully.~n", [
Name, emqx_listeners:format_addr(Port) Name, emqx_listeners:format_bind(Port)
]); ]);
{error, not_found} -> {error, not_found} ->
?SLOG(warning, #{msg => "stop_listener_failed", name => Name, port => Port}) ?SLOG(warning, #{msg => "stop_listener_failed", name => Name, port => Port})

View File

@ -345,9 +345,9 @@ aggregate_running(R, undefined) -> R;
aggregate_running(_, _) -> inconsistent. aggregate_running(_, _) -> inconsistent.
bind2str(Listener = #{bind := Bind}) -> bind2str(Listener = #{bind := Bind}) ->
Listener#{bind := iolist_to_binary(emqx_gateway_utils:format_listenon(Bind))}; Listener#{bind := iolist_to_binary(emqx_listeners:format_bind(Bind))};
bind2str(Listener = #{<<"bind">> := Bind}) -> bind2str(Listener = #{<<"bind">> := Bind}) ->
Listener#{<<"bind">> := iolist_to_binary(emqx_gateway_utils:format_listenon(Bind))}. Listener#{<<"bind">> := iolist_to_binary(emqx_listeners:format_bind(Bind))}.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Swagger defines %% Swagger defines

View File

@ -37,7 +37,6 @@
-export([ -export([
apply/2, apply/2,
format_listenon/1,
parse_listenon/1, parse_listenon/1,
unix_ts_to_rfc3339/1, unix_ts_to_rfc3339/1,
unix_ts_to_rfc3339/2, unix_ts_to_rfc3339/2,
@ -165,7 +164,7 @@ start_listener(
{Type, LisName, ListenOn, SocketOpts, Cfg}, {Type, LisName, ListenOn, SocketOpts, Cfg},
ModCfg ModCfg
) -> ) ->
ListenOnStr = emqx_gateway_utils:format_listenon(ListenOn), ListenOnStr = emqx_listeners:format_bind(ListenOn),
ListenerId = emqx_gateway_utils:listener_id(GwName, Type, LisName), ListenerId = emqx_gateway_utils:listener_id(GwName, Type, LisName),
NCfg = maps:merge(Cfg, ModCfg), NCfg = maps:merge(Cfg, ModCfg),
@ -243,7 +242,7 @@ stop_listeners(GwName, Listeners) ->
-spec stop_listener(GwName :: atom(), Listener :: tuple()) -> ok. -spec stop_listener(GwName :: atom(), Listener :: tuple()) -> ok.
stop_listener(GwName, {Type, LisName, ListenOn, SocketOpts, Cfg}) -> stop_listener(GwName, {Type, LisName, ListenOn, SocketOpts, Cfg}) ->
StopRet = stop_listener(GwName, Type, LisName, ListenOn, SocketOpts, Cfg), StopRet = stop_listener(GwName, Type, LisName, ListenOn, SocketOpts, Cfg),
ListenOnStr = emqx_gateway_utils:format_listenon(ListenOn), ListenOnStr = emqx_listeners:format_bind(ListenOn),
case StopRet of case StopRet of
ok -> ok ->
console_print( console_print(
@ -287,9 +286,6 @@ apply(F, A2) when
-> ->
erlang:apply(F, A2). erlang:apply(F, A2).
format_listenon(Term) ->
emqx_mgmt_util:format_listen_on(Term).
parse_listenon(Port) when is_integer(Port) -> parse_listenon(Port) when is_integer(Port) ->
Port; Port;
parse_listenon(IpPort) when is_tuple(IpPort) -> parse_listenon(IpPort) when is_tuple(IpPort) ->

View File

@ -167,7 +167,7 @@ start_grpc_server(GwName, Options = #{bind := ListenOn}) ->
)} )}
] ]
end, end,
ListenOnStr = emqx_listeners:format_addr(ListenOn), ListenOnStr = emqx_listeners:format_bind(ListenOn),
case grpc:start_server(GwName, ListenOn, Services, SvrOptions) of case grpc:start_server(GwName, ListenOn, Services, SvrOptions) of
{ok, _SvrPid} -> {ok, _SvrPid} ->
console_print( console_print(

View File

@ -543,7 +543,7 @@ format_status(Key, Node, Listener, Acc) ->
enable => Enabled, enable => Enabled,
ids => [Id], ids => [Id],
acceptors => Acceptors, acceptors => Acceptors,
bind => format_raw_bind(Bind), bind => iolist_to_binary(emqx_listeners:format_bind(Bind)),
status => #{ status => #{
running => Running, running => Running,
max_connections => MaxConnections, max_connections => MaxConnections,
@ -605,12 +605,6 @@ max_conn(_Int1, <<"infinity">>) -> <<"infinity">>;
max_conn(<<"infinity">>, _Int) -> <<"infinity">>; max_conn(<<"infinity">>, _Int) -> <<"infinity">>;
max_conn(Int1, Int2) -> Int1 + Int2. max_conn(Int1, Int2) -> Int1 + Int2.
%% @doc returning a uniform format (ip_port string) is more
%% helpful to users
format_raw_bind(Bind) when is_integer(Bind) ->
<<"0.0.0.0:", (integer_to_binary(Bind))/binary>>;
format_raw_bind(Bind) when is_binary(Bind) -> Bind.
update(Path, Conf) -> update(Path, Conf) ->
wrap(emqx_conf:update(Path, {update, Conf}, ?OPTS(cluster))). wrap(emqx_conf:update(Path, {update, Conf}, ?OPTS(cluster))).

View File

@ -582,7 +582,7 @@ listeners([]) ->
end, end,
Info = Info =
[ [
{listen_on, {string, emqx_mgmt_util:format_listen_on(Bind)}}, {listen_on, {string, emqx_listeners:format_bind(Bind)}},
{acceptors, Acceptors}, {acceptors, Acceptors},
{proxy_protocol, ProxyProtocol}, {proxy_protocol, ProxyProtocol},
{running, Running} {running, Running}

View File

@ -43,10 +43,7 @@
batch_schema/1 batch_schema/1
]). ]).
-export([ -export([urldecode/1]).
urldecode/1,
format_listen_on/1
]).
-define(KB, 1024). -define(KB, 1024).
-define(MB, (1024 * 1024)). -define(MB, (1024 * 1024)).
@ -89,25 +86,6 @@ merge_maps(Default, New) ->
urldecode(S) -> urldecode(S) ->
emqx_http_lib:uri_decode(S). emqx_http_lib:uri_decode(S).
-spec format_listen_on(
integer() | {tuple(), integer()} | string() | binary()
) -> io_lib:chars().
format_listen_on(Port) when is_integer(Port) ->
io_lib:format("0.0.0.0:~w", [Port]);
format_listen_on({Addr, Port}) when is_list(Addr) ->
io_lib:format("~ts:~w", [Addr, Port]);
format_listen_on({Addr, Port}) when is_tuple(Addr) ->
io_lib:format("~ts:~w", [inet:ntoa(Addr), Port]);
format_listen_on(Str) when is_list(Str) ->
case emqx_schema:to_ip_port(Str) of
{ok, {Ip, Port}} ->
format_listen_on({Ip, Port});
{error, _} ->
format_listen_on(list_to_integer(Str))
end;
format_listen_on(Bin) when is_binary(Bin) ->
format_listen_on(binary_to_list(Bin)).
%%%============================================================================================== %%%==============================================================================================
%% schema util %% schema util
schema(Ref) when is_atom(Ref) -> schema(Ref) when is_atom(Ref) ->