From 1ddb300a5674e4aa777166d05478110a4764476e Mon Sep 17 00:00:00 2001 From: wwhai <751957846@qq.com> Date: Thu, 11 Mar 2021 00:29:37 +0800 Subject: [PATCH] feat(mgmt): add http listener restart support (#4301) --- .../src/emqx_mgmt_api_listeners.erl | 2 ++ apps/emqx_management/src/emqx_mgmt_cli.erl | 26 +++++++++++++++++++ apps/emqx_management/src/emqx_mgmt_http.erl | 2 ++ lib-ce/emqx_dashboard/src/emqx_dashboard.erl | 2 ++ 4 files changed, 32 insertions(+) diff --git a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl index b2e75d7ff..382c1051b 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl @@ -61,6 +61,8 @@ restart(#{node := Node, identifier := Identifier}, _Params) -> end; %% Restart listeners in the cluster. +restart(#{identifier := <<"http", _/binary>>}, _Params) -> + {403, <<"http_listener_restart_unsupported">>}; restart(#{identifier := Identifier}, _Params) -> Results = [{Node, emqx_mgmt:restart_listener(Node, Identifier)} || {Node, _Info} <- emqx_mgmt:list_nodes()], case lists:filter(fun({_, Result}) -> Result =/= ok end, Results) of diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index fc18bc1bf..20b4f1b01 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -509,6 +509,18 @@ listeners(["stop", _Proto, ListenOn]) -> end, stop_listener(emqx_listeners:find_by_listen_on(ListenOn1), ListenOn1); +listeners(["restart", "http:management"]) -> + restart_http_listener(http, emqx_management); + +listeners(["restart", "https:management"]) -> + restart_http_listener(https, emqx_management); + +listeners(["restart", "http:dashboard"]) -> + restart_http_listener(http, emqx_dashboard); + +listeners(["restart", "https:dashboard"]) -> + restart_http_listener(https, emqx_dashboard); + listeners(["restart", Identifier]) -> case emqx_listeners:restart_listener(Identifier) of ok -> @@ -661,3 +673,17 @@ listener_identifier(Protocol, ListenOn) -> ID -> ID end. + +restart_http_listener(Scheme, AppName) -> + Listeners = application:get_env(AppName, listeners, []), + case lists:keyfind(Scheme, 1, Listeners) of + false -> + emqx_ctl:print("Listener ~s not exists!~n", [AppName]); + {Scheme, Port, Options} -> + ModName = http_mod_name(AppName), + ModName:stop_listener({Scheme, Port, Options}), + ModName:start_listener({Scheme, Port, Options}) + end. + +http_mod_name(emqx_management) -> emqx_mgmt_http; +http_mod_name(Name) -> Name. diff --git a/apps/emqx_management/src/emqx_mgmt_http.erl b/apps/emqx_management/src/emqx_mgmt_http.erl index 2bf6ef38a..aee057d39 100644 --- a/apps/emqx_management/src/emqx_mgmt_http.erl +++ b/apps/emqx_management/src/emqx_mgmt_http.erl @@ -21,6 +21,8 @@ -export([ start_listeners/0 , handle_request/2 , stop_listeners/0 + , start_listener/1 + , stop_listener/1 ]). -export([init/2]). diff --git a/lib-ce/emqx_dashboard/src/emqx_dashboard.erl b/lib-ce/emqx_dashboard/src/emqx_dashboard.erl index a2ba1f125..b7b6ca42e 100644 --- a/lib-ce/emqx_dashboard/src/emqx_dashboard.erl +++ b/lib-ce/emqx_dashboard/src/emqx_dashboard.erl @@ -23,6 +23,8 @@ -export([ start_listeners/0 , stop_listeners/0 + , start_listener/1 + , stop_listener/1 ]). %% for minirest