feat(logger): update configs for logger at runtime
This commit is contained in:
parent
e92255114f
commit
436dba83b8
|
@ -28,7 +28,7 @@
|
||||||
-boot_mnesia({mnesia, [boot]}).
|
-boot_mnesia({mnesia, [boot]}).
|
||||||
-copy_mnesia({mnesia, [copy]}).
|
-copy_mnesia({mnesia, [copy]}).
|
||||||
|
|
||||||
-export([post_config_update/3]).
|
-export([post_config_update/4]).
|
||||||
|
|
||||||
-export([ start_link/0
|
-export([ start_link/0
|
||||||
, stop/0
|
, stop/0
|
||||||
|
@ -148,7 +148,7 @@ get_alarms(activated) ->
|
||||||
get_alarms(deactivated) ->
|
get_alarms(deactivated) ->
|
||||||
gen_server:call(?MODULE, {get_alarms, deactivated}).
|
gen_server:call(?MODULE, {get_alarms, deactivated}).
|
||||||
|
|
||||||
post_config_update(_, #{validity_period := Period0}, _OldConf) ->
|
post_config_update(_, #{validity_period := Period0}, _OldConf, _AppEnv) ->
|
||||||
?MODULE ! {update_timer, Period0},
|
?MODULE ! {update_timer, Period0},
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ format(_) ->
|
||||||
|
|
||||||
init([]) ->
|
init([]) ->
|
||||||
deactivate_all_alarms(),
|
deactivate_all_alarms(),
|
||||||
emqx_config_handler:add_handler([alarm], ?MODULE),
|
ok = emqx_config_handler:add_handler([alarm], ?MODULE),
|
||||||
{ok, #state{timer = ensure_timer(undefined, get_validity_period())}}.
|
{ok, #state{timer = ensure_timer(undefined, get_validity_period())}}.
|
||||||
|
|
||||||
%% suppress dialyzer warning due to dirty read/write race condition.
|
%% suppress dialyzer warning due to dirty read/write race condition.
|
||||||
|
@ -255,6 +255,7 @@ handle_info(Info, State) ->
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
terminate(_Reason, _State) ->
|
terminate(_Reason, _State) ->
|
||||||
|
ok = emqx_config_handler:remove_handler([alarm]),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
code_change(_OldVsn, State, _Extra) ->
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
|
|
@ -80,7 +80,7 @@
|
||||||
error:badarg -> EXP_ON_FAIL
|
error:badarg -> EXP_ON_FAIL
|
||||||
end).
|
end).
|
||||||
|
|
||||||
-export_type([update_request/0, raw_config/0, config/0,
|
-export_type([update_request/0, raw_config/0, config/0, app_envs/0,
|
||||||
update_opts/0, update_cmd/0, update_args/0,
|
update_opts/0, update_cmd/0, update_args/0,
|
||||||
update_error/0, update_result/0]).
|
update_error/0, update_result/0]).
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
%% API functions
|
%% API functions
|
||||||
-export([ start_link/0
|
-export([ start_link/0
|
||||||
, add_handler/2
|
, add_handler/2
|
||||||
|
, remove_handler/1
|
||||||
, update_config/3
|
, update_config/3
|
||||||
, merge_to_old_config/2
|
, merge_to_old_config/2
|
||||||
]).
|
]).
|
||||||
|
@ -49,14 +50,15 @@
|
||||||
-type handlers() :: #{emqx_config:config_key() => handlers(), ?MOD => handler_name()}.
|
-type handlers() :: #{emqx_config:config_key() => handlers(), ?MOD => handler_name()}.
|
||||||
|
|
||||||
-optional_callbacks([ pre_config_update/2
|
-optional_callbacks([ pre_config_update/2
|
||||||
, post_config_update/3
|
, post_config_update/4
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-callback pre_config_update(emqx_config:update_request(), emqx_config:raw_config()) ->
|
-callback pre_config_update(emqx_config:update_request(), emqx_config:raw_config()) ->
|
||||||
{ok, emqx_config:update_request()} | {error, term()}.
|
{ok, emqx_config:update_request()} | {error, term()}.
|
||||||
|
|
||||||
-callback post_config_update(emqx_config:update_request(), emqx_config:config(),
|
-callback post_config_update(emqx_config:update_request(), emqx_config:config(),
|
||||||
emqx_config:config()) -> ok | {ok, Result::any()} | {error, Reason::term()}.
|
emqx_config:config(), emqx_config:app_envs()) ->
|
||||||
|
ok | {ok, Result::any()} | {error, Reason::term()}.
|
||||||
|
|
||||||
-type state() :: #{
|
-type state() :: #{
|
||||||
handlers := handlers(),
|
handlers := handlers(),
|
||||||
|
@ -76,6 +78,10 @@ update_config(SchemaModule, ConfKeyPath, UpdateArgs) ->
|
||||||
add_handler(ConfKeyPath, HandlerName) ->
|
add_handler(ConfKeyPath, HandlerName) ->
|
||||||
gen_server:call(?MODULE, {add_child, ConfKeyPath, HandlerName}).
|
gen_server:call(?MODULE, {add_child, ConfKeyPath, HandlerName}).
|
||||||
|
|
||||||
|
-spec remove_handler(emqx_config:config_key_path()) -> ok.
|
||||||
|
remove_handler(ConfKeyPath) ->
|
||||||
|
gen_server:call(?MODULE, {remove_child, ConfKeyPath}).
|
||||||
|
|
||||||
%%============================================================================
|
%%============================================================================
|
||||||
|
|
||||||
-spec init(term()) -> {ok, state()}.
|
-spec init(term()) -> {ok, state()}.
|
||||||
|
@ -87,6 +93,11 @@ handle_call({add_child, ConfKeyPath, HandlerName}, _From,
|
||||||
{reply, ok, State#{handlers =>
|
{reply, ok, State#{handlers =>
|
||||||
emqx_map_lib:deep_put(ConfKeyPath, Handlers, #{?MOD => HandlerName})}};
|
emqx_map_lib:deep_put(ConfKeyPath, Handlers, #{?MOD => HandlerName})}};
|
||||||
|
|
||||||
|
handle_call({remove_child, ConfKeyPath}, _From,
|
||||||
|
State = #{handlers := Handlers}) ->
|
||||||
|
{reply, ok, State#{handlers =>
|
||||||
|
emqx_map_lib:deep_remove(ConfKeyPath, Handlers)}};
|
||||||
|
|
||||||
handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From,
|
handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From,
|
||||||
#{handlers := Handlers} = State) ->
|
#{handlers := Handlers} = State) ->
|
||||||
Reply = try
|
Reply = try
|
||||||
|
@ -152,7 +163,7 @@ check_and_save_configs(SchemaModule, ConfKeyPath, Handlers, NewRawConf, Override
|
||||||
FullRawConf = with_full_raw_confs(NewRawConf),
|
FullRawConf = with_full_raw_confs(NewRawConf),
|
||||||
{AppEnvs, CheckedConf} = emqx_config:check_config(SchemaModule, FullRawConf),
|
{AppEnvs, CheckedConf} = emqx_config:check_config(SchemaModule, FullRawConf),
|
||||||
NewConf = maps:with(maps:keys(OldConf), CheckedConf),
|
NewConf = maps:with(maps:keys(OldConf), CheckedConf),
|
||||||
case do_post_config_update(ConfKeyPath, Handlers, OldConf, NewConf, UpdateArgs, #{}) of
|
case do_post_config_update(ConfKeyPath, Handlers, OldConf, NewConf, AppEnvs, UpdateArgs, #{}) of
|
||||||
{ok, Result0} ->
|
{ok, Result0} ->
|
||||||
case save_configs(ConfKeyPath, AppEnvs, NewConf, NewRawConf, OverrideConf,
|
case save_configs(ConfKeyPath, AppEnvs, NewConf, NewRawConf, OverrideConf,
|
||||||
UpdateArgs) of
|
UpdateArgs) of
|
||||||
|
@ -163,16 +174,18 @@ check_and_save_configs(SchemaModule, ConfKeyPath, Handlers, NewRawConf, Override
|
||||||
Error -> Error
|
Error -> Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
do_post_config_update([], Handlers, OldConf, NewConf, UpdateArgs, Result) ->
|
do_post_config_update([], Handlers, OldConf, NewConf, AppEnvs, UpdateArgs, Result) ->
|
||||||
call_post_config_update(Handlers, OldConf, NewConf, up_req(UpdateArgs), Result);
|
call_post_config_update(Handlers, OldConf, NewConf, AppEnvs, up_req(UpdateArgs), Result);
|
||||||
do_post_config_update([ConfKey | ConfKeyPath], Handlers, OldConf, NewConf, UpdateArgs, Result) ->
|
do_post_config_update([ConfKey | ConfKeyPath], Handlers, OldConf, NewConf, AppEnvs, UpdateArgs,
|
||||||
|
Result) ->
|
||||||
SubOldConf = get_sub_config(ConfKey, OldConf),
|
SubOldConf = get_sub_config(ConfKey, OldConf),
|
||||||
SubNewConf = get_sub_config(ConfKey, NewConf),
|
SubNewConf = get_sub_config(ConfKey, NewConf),
|
||||||
SubHandlers = maps:get(ConfKey, Handlers, #{}),
|
SubHandlers = maps:get(ConfKey, Handlers, #{}),
|
||||||
case do_post_config_update(ConfKeyPath, SubHandlers, SubOldConf, SubNewConf, UpdateArgs,
|
case do_post_config_update(ConfKeyPath, SubHandlers, SubOldConf, SubNewConf, AppEnvs,
|
||||||
Result) of
|
UpdateArgs, Result) of
|
||||||
{ok, Result1} ->
|
{ok, Result1} ->
|
||||||
call_post_config_update(Handlers, OldConf, NewConf, up_req(UpdateArgs), Result1);
|
call_post_config_update(Handlers, OldConf, NewConf, AppEnvs, up_req(UpdateArgs),
|
||||||
|
Result1);
|
||||||
Error -> Error
|
Error -> Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -192,11 +205,11 @@ call_pre_config_update(Handlers, OldRawConf, UpdateReq) ->
|
||||||
false -> merge_to_old_config(UpdateReq, OldRawConf)
|
false -> merge_to_old_config(UpdateReq, OldRawConf)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
call_post_config_update(Handlers, OldConf, NewConf, UpdateReq, Result) ->
|
call_post_config_update(Handlers, OldConf, NewConf, AppEnvs, UpdateReq, Result) ->
|
||||||
HandlerName = maps:get(?MOD, Handlers, undefined),
|
HandlerName = maps:get(?MOD, Handlers, undefined),
|
||||||
case erlang:function_exported(HandlerName, post_config_update, 3) of
|
case erlang:function_exported(HandlerName, post_config_update, 4) of
|
||||||
true ->
|
true ->
|
||||||
case HandlerName:post_config_update(UpdateReq, NewConf, OldConf) of
|
case HandlerName:post_config_update(UpdateReq, NewConf, OldConf, AppEnvs) of
|
||||||
ok -> {ok, Result};
|
ok -> {ok, Result};
|
||||||
{ok, Result1} -> {ok, Result#{HandlerName => Result1}};
|
{ok, Result1} -> {ok, Result#{HandlerName => Result1}};
|
||||||
{error, Reason} -> {error, {post_config_update, HandlerName, Reason}}
|
{error, Reason} -> {error, {post_config_update, HandlerName, Reason}}
|
||||||
|
|
|
@ -34,6 +34,7 @@ init([]) ->
|
||||||
, child_spec(emqx_stats, worker)
|
, child_spec(emqx_stats, worker)
|
||||||
, child_spec(emqx_metrics, worker)
|
, child_spec(emqx_metrics, worker)
|
||||||
, child_spec(emqx_ctl, worker)
|
, child_spec(emqx_ctl, worker)
|
||||||
|
, child_spec(emqx_logger, worker)
|
||||||
]}}.
|
]}}.
|
||||||
|
|
||||||
child_spec(M, Type) ->
|
child_spec(M, Type) ->
|
||||||
|
|
|
@ -18,6 +18,19 @@
|
||||||
|
|
||||||
-compile({no_auto_import, [error/1]}).
|
-compile({no_auto_import, [error/1]}).
|
||||||
|
|
||||||
|
-behaviour(gen_server).
|
||||||
|
-behaviour(emqx_config_handler).
|
||||||
|
|
||||||
|
%% gen_server callbacks
|
||||||
|
-export([ start_link/0
|
||||||
|
, init/1
|
||||||
|
, handle_call/3
|
||||||
|
, handle_cast/2
|
||||||
|
, handle_info/2
|
||||||
|
, terminate/2
|
||||||
|
, code_change/3
|
||||||
|
]).
|
||||||
|
|
||||||
%% Logs
|
%% Logs
|
||||||
-export([ debug/1
|
-export([ debug/1
|
||||||
, debug/2
|
, debug/2
|
||||||
|
@ -47,6 +60,7 @@
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([ get_primary_log_level/0
|
-export([ get_primary_log_level/0
|
||||||
|
, tune_primary_log_level/0
|
||||||
, get_log_handlers/0
|
, get_log_handlers/0
|
||||||
, get_log_handlers/1
|
, get_log_handlers/1
|
||||||
, get_log_handler/1
|
, get_log_handler/1
|
||||||
|
@ -56,6 +70,8 @@
|
||||||
, stop_log_handler/1
|
, stop_log_handler/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
-export([post_config_update/4]).
|
||||||
|
|
||||||
-type(peername_str() :: list()).
|
-type(peername_str() :: list()).
|
||||||
-type(logger_dst() :: file:filename() | console | unknown).
|
-type(logger_dst() :: file:filename() | console | unknown).
|
||||||
-type(logger_handler_info() :: #{
|
-type(logger_handler_info() :: #{
|
||||||
|
@ -66,6 +82,54 @@
|
||||||
}).
|
}).
|
||||||
|
|
||||||
-define(stopped_handlers, {?MODULE, stopped_handlers}).
|
-define(stopped_handlers, {?MODULE, stopped_handlers}).
|
||||||
|
-define(CONF_PATH, [log]).
|
||||||
|
|
||||||
|
start_link() ->
|
||||||
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||||
|
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% gen_server callbacks
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
init([]) ->
|
||||||
|
ok = emqx_config_handler:add_handler(?CONF_PATH, ?MODULE),
|
||||||
|
{ok, #{}}.
|
||||||
|
|
||||||
|
handle_call({update_config, AppEnvs}, _From, State) ->
|
||||||
|
io:format("----new appenvs: ~p~n", [AppEnvs]),
|
||||||
|
OldEnvs = application:get_env(kernel, logger, []),
|
||||||
|
NewEnvs = proplists:get_value(logger, proplists:get_value(kernel, AppEnvs, []), []),
|
||||||
|
io:format("----new logger configs: ~p~n", [NewEnvs]),
|
||||||
|
ok = application:set_env(kernel, logger, NewEnvs),
|
||||||
|
io:format("----1~n", []),
|
||||||
|
_ = [logger:remove_handler(HandlerId) || {handler, HandlerId, _Mod, _Conf} <- OldEnvs],
|
||||||
|
io:format("----2~n", []),
|
||||||
|
_ = [logger:add_handler(HandlerId, Mod, Conf) || {handler, HandlerId, Mod, Conf} <- NewEnvs],
|
||||||
|
io:format("----3~n", []),
|
||||||
|
ok = tune_primary_log_level(),
|
||||||
|
{reply, ok, State};
|
||||||
|
|
||||||
|
handle_call(_Req, _From, State) ->
|
||||||
|
{reply, ignored, State}.
|
||||||
|
|
||||||
|
handle_cast(_Msg, State) ->
|
||||||
|
{noreply, State}.
|
||||||
|
|
||||||
|
handle_info(_Info, State) ->
|
||||||
|
{noreply, State}.
|
||||||
|
|
||||||
|
terminate(_Reason, _State) ->
|
||||||
|
ok = emqx_config_handler:remove_handler(?CONF_PATH),
|
||||||
|
ok.
|
||||||
|
|
||||||
|
code_change(_OldVsn, State, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
||||||
|
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% emqx_config_handler callbacks
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
post_config_update(_Req, _NewConf, _OldConf, AppEnvs) ->
|
||||||
|
gen_server:call(?MODULE, {update_config, AppEnvs}, 5000).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% APIs
|
%% APIs
|
||||||
|
@ -159,6 +223,16 @@ get_primary_log_level() ->
|
||||||
#{level := Level} = logger:get_primary_config(),
|
#{level := Level} = logger:get_primary_config(),
|
||||||
Level.
|
Level.
|
||||||
|
|
||||||
|
-spec tune_primary_log_level() -> ok.
|
||||||
|
tune_primary_log_level() ->
|
||||||
|
LowestLevel = lists:foldl(fun(#{level := Level}, OldLevel) ->
|
||||||
|
case logger:compare_levels(Level, OldLevel) of
|
||||||
|
lt -> Level;
|
||||||
|
_ -> OldLevel
|
||||||
|
end
|
||||||
|
end, get_primary_log_level(), get_log_handlers()),
|
||||||
|
set_primary_log_level(LowestLevel).
|
||||||
|
|
||||||
-spec(set_primary_log_level(logger:level()) -> ok | {error, term()}).
|
-spec(set_primary_log_level(logger:level()) -> ok | {error, term()}).
|
||||||
set_primary_log_level(Level) ->
|
set_primary_log_level(Level) ->
|
||||||
logger:set_primary_config(level, Level).
|
logger:set_primary_config(level, Level).
|
||||||
|
|
|
@ -62,12 +62,12 @@ deep_find(_KeyPath, Data) ->
|
||||||
{not_found, _KeyPath, Data}.
|
{not_found, _KeyPath, Data}.
|
||||||
|
|
||||||
-spec deep_put(config_key_path(), map(), term()) -> map().
|
-spec deep_put(config_key_path(), map(), term()) -> map().
|
||||||
deep_put([], Map, Config) when is_map(Map) ->
|
deep_put([], Map, Data) when is_map(Map) ->
|
||||||
Config;
|
Data;
|
||||||
deep_put([], _Map, Config) -> %% not map, replace it
|
deep_put([], _Map, Data) -> %% not map, replace it
|
||||||
Config;
|
Data;
|
||||||
deep_put([Key | KeyPath], Map, Config) ->
|
deep_put([Key | KeyPath], Map, Data) ->
|
||||||
SubMap = deep_put(KeyPath, maps:get(Key, Map, #{}), Config),
|
SubMap = deep_put(KeyPath, maps:get(Key, Map, #{}), Data),
|
||||||
Map#{Key => SubMap}.
|
Map#{Key => SubMap}.
|
||||||
|
|
||||||
-spec deep_remove(config_key_path(), map()) -> map().
|
-spec deep_remove(config_key_path(), map()) -> map().
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
-include_lib("emqx/include/logger.hrl").
|
-include_lib("emqx/include/logger.hrl").
|
||||||
|
|
||||||
-export([ pre_config_update/2
|
-export([ pre_config_update/2
|
||||||
, post_config_update/3
|
, post_config_update/4
|
||||||
, update_config/2
|
, update_config/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
@ -137,11 +137,11 @@ pre_config_update({move_authenticator, ID, Position}, OldConfig) ->
|
||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
post_config_update({enable, true}, _NewConfig, _OldConfig) ->
|
post_config_update({enable, true}, _NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
emqx_authn:enable();
|
emqx_authn:enable();
|
||||||
post_config_update({enable, false}, _NewConfig, _OldConfig) ->
|
post_config_update({enable, false}, _NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
emqx_authn:disable();
|
emqx_authn:disable();
|
||||||
post_config_update({create_authenticator, #{<<"name">> := Name}}, NewConfig, _OldConfig) ->
|
post_config_update({create_authenticator, #{<<"name">> := Name}}, NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
case lists:filter(
|
case lists:filter(
|
||||||
fun(#{name := N}) ->
|
fun(#{name := N}) ->
|
||||||
N =:= Name
|
N =:= Name
|
||||||
|
@ -151,12 +151,12 @@ post_config_update({create_authenticator, #{<<"name">> := Name}}, NewConfig, _Ol
|
||||||
[_Config | _] ->
|
[_Config | _] ->
|
||||||
{error, name_has_be_used}
|
{error, name_has_be_used}
|
||||||
end;
|
end;
|
||||||
post_config_update({delete_authenticator, ID}, _NewConfig, _OldConfig) ->
|
post_config_update({delete_authenticator, ID}, _NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
case delete_authenticator(?CHAIN, ID) of
|
case delete_authenticator(?CHAIN, ID) of
|
||||||
ok -> ok;
|
ok -> ok;
|
||||||
{error, Reason} -> throw(Reason)
|
{error, Reason} -> throw(Reason)
|
||||||
end;
|
end;
|
||||||
post_config_update({update_authenticator, ID, #{<<"name">> := Name}}, NewConfig, _OldConfig) ->
|
post_config_update({update_authenticator, ID, #{<<"name">> := Name}}, NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
case lists:filter(
|
case lists:filter(
|
||||||
fun(#{name := N}) ->
|
fun(#{name := N}) ->
|
||||||
N =:= Name
|
N =:= Name
|
||||||
|
@ -166,7 +166,7 @@ post_config_update({update_authenticator, ID, #{<<"name">> := Name}}, NewConfig,
|
||||||
[_Config | _] ->
|
[_Config | _] ->
|
||||||
{error, name_has_be_used}
|
{error, name_has_be_used}
|
||||||
end;
|
end;
|
||||||
post_config_update({update_or_create_authenticator, ID, #{<<"name">> := Name}}, NewConfig, _OldConfig) ->
|
post_config_update({update_or_create_authenticator, ID, #{<<"name">> := Name}}, NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
case lists:filter(
|
case lists:filter(
|
||||||
fun(#{name := N}) ->
|
fun(#{name := N}) ->
|
||||||
N =:= Name
|
N =:= Name
|
||||||
|
@ -176,7 +176,7 @@ post_config_update({update_or_create_authenticator, ID, #{<<"name">> := Name}},
|
||||||
[_Config | _] ->
|
[_Config | _] ->
|
||||||
{error, name_has_be_used}
|
{error, name_has_be_used}
|
||||||
end;
|
end;
|
||||||
post_config_update({move_authenticator, ID, Position}, _NewConfig, _OldConfig) ->
|
post_config_update({move_authenticator, ID, Position}, _NewConfig, _OldConfig, _AppEnvs) ->
|
||||||
NPosition = case Position of
|
NPosition = case Position of
|
||||||
<<"top">> -> top;
|
<<"top">> -> top;
|
||||||
<<"bottom">> -> bottom;
|
<<"bottom">> -> bottom;
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
, authorize/5
|
, authorize/5
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([post_config_update/3, pre_config_update/2]).
|
-export([post_config_update/4, pre_config_update/2]).
|
||||||
|
|
||||||
-define(CONF_KEY_PATH, [authorization_rules, rules]).
|
-define(CONF_KEY_PATH, [authorization_rules, rules]).
|
||||||
|
|
||||||
|
@ -107,23 +107,23 @@ pre_config_update({_, Rules}, _Conf) when is_list(Rules)->
|
||||||
%% overwrite the entire config!
|
%% overwrite the entire config!
|
||||||
{ok, Rules}.
|
{ok, Rules}.
|
||||||
|
|
||||||
post_config_update(_, undefined, _Conf) ->
|
post_config_update(_, undefined, _Conf, _AppEnvs) ->
|
||||||
ok;
|
ok;
|
||||||
post_config_update({move, Id, <<"top">>}, _NewRules, _OldRules) ->
|
post_config_update({move, Id, <<"top">>}, _NewRules, _OldRules, _AppEnvs) ->
|
||||||
InitedRules = lookup(),
|
InitedRules = lookup(),
|
||||||
{Index, Rule} = find_rule_by_id(Id, InitedRules),
|
{Index, Rule} = find_rule_by_id(Id, InitedRules),
|
||||||
{Rules1, Rules2 } = lists:split(Index, InitedRules),
|
{Rules1, Rules2 } = lists:split(Index, InitedRules),
|
||||||
Rules3 = [Rule] ++ lists:droplast(Rules1) ++ Rules2,
|
Rules3 = [Rule] ++ lists:droplast(Rules1) ++ Rules2,
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
post_config_update({move, Id, <<"bottom">>}, _NewRules, _OldRules) ->
|
post_config_update({move, Id, <<"bottom">>}, _NewRules, _OldRules, _AppEnvs) ->
|
||||||
InitedRules = lookup(),
|
InitedRules = lookup(),
|
||||||
{Index, Rule} = find_rule_by_id(Id, InitedRules),
|
{Index, Rule} = find_rule_by_id(Id, InitedRules),
|
||||||
{Rules1, Rules2 } = lists:split(Index, InitedRules),
|
{Rules1, Rules2 } = lists:split(Index, InitedRules),
|
||||||
Rules3 = lists:droplast(Rules1) ++ Rules2 ++ [Rule],
|
Rules3 = lists:droplast(Rules1) ++ Rules2 ++ [Rule],
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
post_config_update({move, Id, #{<<"before">> := BeforeId}}, _NewRules, _OldRules) ->
|
post_config_update({move, Id, #{<<"before">> := BeforeId}}, _NewRules, _OldRules, _AppEnvs) ->
|
||||||
InitedRules = lookup(),
|
InitedRules = lookup(),
|
||||||
{_, Rule0} = find_rule_by_id(Id, InitedRules),
|
{_, Rule0} = find_rule_by_id(Id, InitedRules),
|
||||||
{Index, Rule1} = find_rule_by_id(BeforeId, InitedRules),
|
{Index, Rule1} = find_rule_by_id(BeforeId, InitedRules),
|
||||||
|
@ -134,7 +134,7 @@ post_config_update({move, Id, #{<<"before">> := BeforeId}}, _NewRules, _OldRules
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
|
|
||||||
post_config_update({move, Id, #{<<"after">> := AfterId}}, _NewRules, _OldRules) ->
|
post_config_update({move, Id, #{<<"after">> := AfterId}}, _NewRules, _OldRules, _AppEnvs) ->
|
||||||
InitedRules = lookup(),
|
InitedRules = lookup(),
|
||||||
{_, Rule} = find_rule_by_id(Id, InitedRules),
|
{_, Rule} = find_rule_by_id(Id, InitedRules),
|
||||||
{Index, _} = find_rule_by_id(AfterId, InitedRules),
|
{Index, _} = find_rule_by_id(AfterId, InitedRules),
|
||||||
|
@ -145,17 +145,17 @@ post_config_update({move, Id, #{<<"after">> := AfterId}}, _NewRules, _OldRules)
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [Rules3]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
|
|
||||||
post_config_update({head, Rules}, _NewRules, _OldConf) ->
|
post_config_update({head, Rules}, _NewRules, _OldConf, _AppEnvs) ->
|
||||||
InitedRules = [init_provider(R) || R <- check_rules(Rules)],
|
InitedRules = [init_provider(R) || R <- check_rules(Rules)],
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [InitedRules ++ lookup()]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [InitedRules ++ lookup()]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
|
|
||||||
post_config_update({tail, Rules}, _NewRules, _OldConf) ->
|
post_config_update({tail, Rules}, _NewRules, _OldConf, _AppEnvs) ->
|
||||||
InitedRules = [init_provider(R) || R <- check_rules(Rules)],
|
InitedRules = [init_provider(R) || R <- check_rules(Rules)],
|
||||||
emqx_hooks:put('client.authorize', {?MODULE, authorize, [lookup() ++ InitedRules]}, -1),
|
emqx_hooks:put('client.authorize', {?MODULE, authorize, [lookup() ++ InitedRules]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
|
|
||||||
post_config_update({{replace_once, Id}, Rule}, _NewRules, _OldConf) when is_map(Rule) ->
|
post_config_update({{replace_once, Id}, Rule}, _NewRules, _OldConf, _AppEnvs) when is_map(Rule) ->
|
||||||
OldInitedRules = lookup(),
|
OldInitedRules = lookup(),
|
||||||
{Index, OldRule} = find_rule_by_id(Id, OldInitedRules),
|
{Index, OldRule} = find_rule_by_id(Id, OldInitedRules),
|
||||||
case maps:get(type, OldRule, undefined) of
|
case maps:get(type, OldRule, undefined) of
|
||||||
|
@ -169,7 +169,7 @@ post_config_update({{replace_once, Id}, Rule}, _NewRules, _OldConf) when is_map(
|
||||||
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [lists:droplast(OldRules1) ++ InitedRules ++ OldRules2]}, -1),
|
ok = emqx_hooks:put('client.authorize', {?MODULE, authorize, [lists:droplast(OldRules1) ++ InitedRules ++ OldRules2]}, -1),
|
||||||
ok = emqx_authz_cache:drain_cache();
|
ok = emqx_authz_cache:drain_cache();
|
||||||
|
|
||||||
post_config_update(_, NewRules, _OldConf) ->
|
post_config_update(_, NewRules, _OldConf, _AppEnvs) ->
|
||||||
%% overwrite the entire config!
|
%% overwrite the entire config!
|
||||||
OldInitedRules = lookup(),
|
OldInitedRules = lookup(),
|
||||||
InitedRules = [init_provider(Rule) || Rule <- NewRules],
|
InitedRules = [init_provider(Rule) || Rule <- NewRules],
|
||||||
|
|
|
@ -46,7 +46,13 @@
|
||||||
|
|
||||||
-define(ERR_MSG(MSG), list_to_binary(io_lib:format("~p", [MSG]))).
|
-define(ERR_MSG(MSG), list_to_binary(io_lib:format("~p", [MSG]))).
|
||||||
|
|
||||||
-define(CORE_CONFS, [node, log, alarm, zones, cluster, rpc, broker, sysmon,
|
-define(CORE_CONFS, [
|
||||||
|
%% from emqx_machine_schema
|
||||||
|
log, rpc,
|
||||||
|
%% from emqx_schema
|
||||||
|
zones, mqtt, flapping_detect, force_shutdown, force_gc, conn_congestion, rate_limit, quota,
|
||||||
|
broker, alarm, sysmon,
|
||||||
|
%% from other apps
|
||||||
emqx_dashboard, emqx_management]).
|
emqx_dashboard, emqx_management]).
|
||||||
|
|
||||||
api_spec() ->
|
api_spec() ->
|
||||||
|
@ -109,9 +115,9 @@ config(get, _Params, Req) ->
|
||||||
{404, #{code => 'NOT_FOUND', message => <<"Config cannot found">>}}
|
{404, #{code => 'NOT_FOUND', message => <<"Config cannot found">>}}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
config(put, _Params, Req) ->
|
config(put, #{body := Body}, Req) ->
|
||||||
Path = conf_path(Req),
|
Path = conf_path(Req),
|
||||||
{ok, #{raw_config := RawConf}} = emqx:update_config(Path, http_body(Req),
|
{ok, #{raw_config := RawConf}} = emqx:update_config(Path, Body,
|
||||||
#{rawconf_with_defaults => true}),
|
#{rawconf_with_defaults => true}),
|
||||||
{200, emqx_map_lib:jsonable_map(RawConf)}.
|
{200, emqx_map_lib:jsonable_map(RawConf)}.
|
||||||
|
|
||||||
|
@ -142,12 +148,6 @@ conf_path_reset(Req) ->
|
||||||
<<"/api/v5", ?PREFIX_RESET, Path/binary>> = cowboy_req:path(Req),
|
<<"/api/v5", ?PREFIX_RESET, Path/binary>> = cowboy_req:path(Req),
|
||||||
string:lexemes(Path, "/ ").
|
string:lexemes(Path, "/ ").
|
||||||
|
|
||||||
http_body(Req) ->
|
|
||||||
{ok, Body, _} = cowboy_req:read_body(Req),
|
|
||||||
try jsx:decode(Body, [{return_maps, true}])
|
|
||||||
catch error:badarg -> Body
|
|
||||||
end.
|
|
||||||
|
|
||||||
get_conf_schema(Conf, MaxDepth) ->
|
get_conf_schema(Conf, MaxDepth) ->
|
||||||
get_conf_schema([], maps:to_list(Conf), [], MaxDepth).
|
get_conf_schema([], maps:to_list(Conf), [], MaxDepth).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue