diff --git a/src/emqttd_cli.erl b/src/emqttd_cli.erl index 6ff94893c..2ebe43f13 100644 --- a/src/emqttd_cli.erl +++ b/src/emqttd_cli.erl @@ -477,8 +477,38 @@ listeners([]) -> end, Info) end, esockd:listeners()); +listeners(["reopen", Proto, ListenOn1]) -> + ListenOn = case string:tokens(ListenOn1, ":") of + [Port] -> list_to_integer(Port); + [IP, Port] -> {IP, list_to_integer(Port)} + end, + case emqttd_app:restart_listener({list_to_atom(Proto), ListenOn, []}) of + {ok, _Pid} -> + io:format("Reopen ~p listen on ~p successfully.~n", + [list_to_atom(Proto), list_to_atom(ListenOn1)]); + {error, Error} -> + io:format("Failed to reopen ~p listen on ~p, error:~p~n", + [list_to_atom(Proto), list_to_atom(ListenOn1) ,Error]) + end; + +listeners(["close", Proto, ListenOn1]) -> + ListenOn = case string:tokens(ListenOn1, ":") of + [Port] -> list_to_integer(Port); + [IP, Port] -> {IP, list_to_integer(Port)} + end, + case emqttd_app:stop_listener({list_to_atom(Proto), ListenOn, []}) of + ok -> + io:format("Close ~p on ~p successfully.~n", + [list_to_atom(Proto), list_to_atom(ListenOn1)]); + {error, Error} -> + io:format("Failed to close ~p on ~p, error:~p~n", + [list_to_atom(Proto), list_to_atom(ListenOn1) ,Error]) + end; + listeners(_) -> - ?PRINT_CMD("listeners", "List listeners"). + ?USAGE([{"listeners", "List listeners"}, + {"listeners reopen ", "Reopen a listener port"}, + {"listeners close ", "Close a listener port"}]). %%-------------------------------------------------------------------- %% Dump ETS diff --git a/src/emqttd_ctl.erl b/src/emqttd_ctl.erl index 0aa8ce353..195d3dea0 100644 --- a/src/emqttd_ctl.erl +++ b/src/emqttd_ctl.erl @@ -64,14 +64,24 @@ cast(Msg) -> gen_server:cast(?SERVER, Msg). %% @doc Run a command -spec(run([string()]) -> any()). -run([]) -> usage(); +run([]) -> usage(), ok; -run(["help"]) -> usage(); +run(["help"]) -> usage(), ok; run([CmdS|Args]) -> case lookup(list_to_atom(CmdS)) of - [{Mod, Fun}] -> Mod:Fun(Args); - [] -> usage() + [{Mod, Fun}] -> + try Mod:Fun(Args) of + _ -> ok + catch + _:Reason -> + io:format("Reason:~p, get_stacktrace:~p~n", + [Reason, erlang:get_stacktrace()]), + {error, Reason} + end; + [] -> + usage(), + {error, cmd_not_found} end. %% @doc Lookup a command