fix: dashboard should restart listeners after return 200

This commit is contained in:
Zhongwen Deng 2022-04-24 11:15:21 +08:00
parent b7a6bd973f
commit eeba6ac01d
2 changed files with 50 additions and 6 deletions

View File

@ -19,7 +19,38 @@
%% API
-export([add_handler/0, remove_handler/0]).
-export([post_config_update/5]).
-export([pre_config_update/3, post_config_update/5]).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
init([]) ->
{ok, #{}, hibernate}.
handle_call(_Request, _From, State) ->
{reply, ok, State}.
handle_cast(_Request, State) ->
{noreply, State}.
handle_info({update_listeners, OldListeners, NewListeners}, State) ->
ok = emqx_dashboard:stop_listeners(OldListeners),
ok = emqx_dashboard:start_listeners(NewListeners),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
add_handler() ->
Roots = emqx_dashboard_schema:roots(),
@ -31,13 +62,22 @@ remove_handler() ->
ok = emqx_config_handler:remove_handler(Roots),
ok.
pre_config_update(_Path, UpdateConf0, RawConf) ->
UpdateConf =
case UpdateConf0 of
#{<<"default_password">> := <<"******">>} ->
maps:remove(<<"default_password">>, UpdateConf0);
_ ->
UpdateConf0
end,
NewConf = emqx_map_lib:deep_merge(RawConf, UpdateConf),
{ok, NewConf}.
post_config_update(_, _Req, NewConf, OldConf, _AppEnvs) ->
#{listeners := NewListeners} = NewConf,
#{listeners := OldListeners} = OldConf,
case NewListeners =:= OldListeners of
true -> ok;
false ->
ok = emqx_dashboard:stop_listeners(OldListeners),
ok = emqx_dashboard:start_listeners(NewListeners)
false -> erlang:send_after(500, ?MODULE, {update_listeners, OldListeners, NewListeners})
end,
ok.

View File

@ -28,5 +28,9 @@ start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
{ok, {{one_for_all, 10, 100},
[?CHILD(emqx_dashboard_token), ?CHILD(emqx_dashboard_monitor)]}}.
{ok, {{one_for_one, 10, 100},
[
?CHILD(emqx_dashboard_token),
?CHILD(emqx_dashboard_monitor),
?CHILD(emqx_dashboard_config)
]}}.