diff --git a/apps/emqx/src/emqx_config.erl b/apps/emqx/src/emqx_config.erl index 24141ceb9..64a19b2f8 100644 --- a/apps/emqx/src/emqx_config.erl +++ b/apps/emqx/src/emqx_config.erl @@ -65,7 +65,7 @@ , update/3 , remove/1 , remove/2 - , reset/1 + , reset/2 ]). -export([ get_raw/1 @@ -184,27 +184,31 @@ put(KeyPath, Config) -> do_put(?CONF, KeyPath, Config). -spec update(emqx_map_lib:config_key_path(), update_request()) -> ok | {error, term()}. -update([RootName | _] = KeyPath, UpdateReq) -> - update(get_schema_mod(RootName), KeyPath, UpdateReq). +update(KeyPath, UpdateReq) -> + update(KeyPath, UpdateReq, #{}). --spec update(module(), emqx_map_lib:config_key_path(), update_request()) -> - ok | {error, term()}. -update(SchemaMod, KeyPath, UpdateReq) -> - emqx_config_handler:update_config(SchemaMod, KeyPath, {update, UpdateReq}). +-spec update(emqx_map_lib:config_key_path(), update_request(), + emqx_config_handler:update_opts()) -> ok | {error, term()}. +update([RootName | _] = KeyPath, UpdateReq, Opts) -> + emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath, + {{update, UpdateReq}, Opts}). -spec remove(emqx_map_lib:config_key_path()) -> ok | {error, term()}. -remove([RootName | _] = KeyPath) -> - remove(get_schema_mod(RootName), KeyPath). +remove(KeyPath) -> + remove(KeyPath, #{}). -remove(SchemaMod, KeyPath) -> - emqx_config_handler:update_config(SchemaMod, KeyPath, remove). +-spec remove(emqx_map_lib:config_key_path(), emqx_config_handler:update_opts()) -> + ok | {error, term()}. +remove([RootName | _] = KeyPath, Opts) -> + emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath, {remove, Opts}). --spec reset(emqx_map_lib:config_key_path()) -> ok | {error, term()}. -reset([RootName | _] = KeyPath) -> +-spec reset(emqx_map_lib:config_key_path(), emqx_config_handler:update_opts()) -> + ok | {error, term()}. +reset([RootName | _] = KeyPath, Opts) -> case get_default_value(KeyPath) of {ok, Default} -> emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath, - {update, Default}); + {{update, Default}, Opts}); {error, _} = Error -> Error end. diff --git a/apps/emqx/src/emqx_config_handler.erl b/apps/emqx/src/emqx_config_handler.erl index 2a1e70501..cae104945 100644 --- a/apps/emqx/src/emqx_config_handler.erl +++ b/apps/emqx/src/emqx_config_handler.erl @@ -38,9 +38,15 @@ -define(MOD, {mod}). +-export_type([update_opts/0, update_cmd/0, update_args/0]). -type handler_name() :: module(). -type handlers() :: #{emqx_config:config_key() => handlers(), ?MOD => handler_name()}. --type update_args() :: {update, emqx_config:update_request()} | remove. +-type update_cmd() :: {update, emqx_config:update_request()} | remove. +-type update_opts() :: #{ + %% fill the default values into the rawconf map + rawconf_with_defaults => boolean() + }. +-type update_args() :: {update_cmd(), Opts :: update_opts()}. -optional_callbacks([ pre_config_update/2 , post_config_update/3 @@ -61,7 +67,7 @@ start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, {}, []). -spec update_config(module(), emqx_config:config_key_path(), update_args()) -> - ok | {error, term()}. + {ok, emqx_config:config(), emqx_config:raw_config()} | {error, term()}. update_config(SchemaModule, ConfKeyPath, UpdateArgs) -> gen_server:call(?MODULE, {change_config, SchemaModule, ConfKeyPath, UpdateArgs}). @@ -80,7 +86,7 @@ handle_call({add_child, ConfKeyPath, HandlerName}, _From, {reply, ok, State#{handlers => emqx_map_lib:deep_put(ConfKeyPath, Handlers, #{?MOD => HandlerName})}}; -handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From, +handle_call({change_config, SchemaModule, ConfKeyPath, {_Cmd, Opts} = UpdateArgs}, _From, #{handlers := Handlers} = State) -> OldConf = emqx_config:get([]), OldRawConf = emqx_config:get_raw([]), @@ -89,7 +95,10 @@ handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From, Handlers, UpdateArgs), {AppEnvs, CheckedConf} = emqx_config:check_config(SchemaModule, NewRawConf), _ = do_post_config_update(ConfKeyPath, Handlers, OldConf, CheckedConf, UpdateArgs), - emqx_config:save_configs(AppEnvs, CheckedConf, NewRawConf, OverrideConf) + case emqx_config:save_configs(AppEnvs, CheckedConf, NewRawConf, OverrideConf) of + ok -> {ok, emqx_config:get([]), return_rawconf(Opts)}; + Err -> Err + end catch Error:Reason:ST -> ?LOG(error, "change_config failed: ~p", [{Error, Reason, ST}]), {error, Reason} @@ -112,12 +121,12 @@ terminate(_Reason, _State) -> code_change(_OldVsn, State, _Extra) -> {ok, State}. -process_upadate_request(ConfKeyPath, OldRawConf, _Handlers, remove) -> +process_upadate_request(ConfKeyPath, OldRawConf, _Handlers, {remove, _Opts}) -> BinKeyPath = bin_path(ConfKeyPath), NewRawConf = emqx_map_lib:deep_remove(BinKeyPath, OldRawConf), OverrideConf = emqx_map_lib:deep_remove(BinKeyPath, emqx_config:read_override_conf()), {NewRawConf, OverrideConf}; -process_upadate_request(ConfKeyPath, OldRawConf, Handlers, {update, UpdateReq}) -> +process_upadate_request(ConfKeyPath, OldRawConf, Handlers, {{update, UpdateReq}, _Opts}) -> NewRawConf = do_update_config(ConfKeyPath, Handlers, OldRawConf, UpdateReq), OverrideConf = update_override_config(NewRawConf), {NewRawConf, OverrideConf}. @@ -172,8 +181,13 @@ update_override_config(RawConf) -> OldConf = emqx_config:read_override_conf(), maps:merge(OldConf, RawConf). -up_req(remove) -> '$remove'; -up_req({update, Req}) -> Req. +up_req({remove, _Opts}) -> '$remove'; +up_req({{update, Req}, _Opts}) -> Req. + +return_rawconf(#{rawconf_with_defaults := true}) -> + emqx_config:fill_defaults(emqx_config:get_raw([])); +return_rawconf(_) -> + emqx_config:get_raw([]). bin_path(ConfKeyPath) -> [bin(Key) || Key <- ConfKeyPath]. diff --git a/apps/emqx_authz/src/emqx_authz.erl b/apps/emqx_authz/src/emqx_authz.erl index 5c46e7749..d4399b82d 100644 --- a/apps/emqx_authz/src/emqx_authz.erl +++ b/apps/emqx_authz/src/emqx_authz.erl @@ -61,10 +61,10 @@ lookup(Id) -> end. move(Id, Position) -> - emqx_config:update(emqx_authz_schema, ?CONF_KEY_PATH, {move, Id, Position}). + emqx_config:update(?CONF_KEY_PATH, {move, Id, Position}). update(Cmd, Rules) -> - emqx_config:update(emqx_authz_schema, ?CONF_KEY_PATH, {Cmd, Rules}). + emqx_config:update(?CONF_KEY_PATH, {Cmd, Rules}). pre_config_update({move, Id, <<"top">>}, Conf) when is_list(Conf) -> {Index, _} = find_rule_by_id(Id),