From bc71a1e2c67bfc1a4d60be82f6c6c66c2ddd5903 Mon Sep 17 00:00:00 2001 From: Turtle Date: Sat, 19 Jun 2021 16:30:11 +0800 Subject: [PATCH] fix(plugins): fix load plugin generate hocon configs fail --- apps/emqx/src/emqx_plugins.erl | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/emqx/src/emqx_plugins.erl b/apps/emqx/src/emqx_plugins.erl index 7df1f368c..bda537f47 100644 --- a/apps/emqx/src/emqx_plugins.erl +++ b/apps/emqx/src/emqx_plugins.erl @@ -175,7 +175,7 @@ load_ext_plugin(PluginDir) -> end, ok = load_plugin_app(AppName, Ebin), try - ok = generate_configs(AppName) + ok = generate_configs(AppName, PluginDir) catch throw : {conf_file_not_found, ConfFile} -> %% this is maybe a dependency of an external plugin @@ -367,8 +367,16 @@ funlog(Key, Value) -> ?LOG(info, "~s = ~p", [string:join(Key, "."), Value]). generate_configs(App) -> - PluginConfDir = filename:join([code:lib_dir(App), "etc"]), - PluginSchemaDir = filename:join([code:lib_dir(App), "priv"]), + PluginConfDir = emqx:get_env(plugins_etc_dir), + PluginSchemaDir = code:priv_dir(App), + generate_configs(App, PluginConfDir, PluginSchemaDir). + +generate_configs(App, PluginDir) -> + PluginConfDir = filename:join([PluginDir, "etc"]), + PluginSchemaDir = filename:join([PluginDir, "priv"]), + generate_configs(App, PluginConfDir, PluginSchemaDir). + +generate_configs(App, PluginConfDir, PluginSchemaDir) -> ConfigFile = filename:join([PluginConfDir, App]) ++ ".config", case filelib:is_file(ConfigFile) of true -> @@ -410,13 +418,14 @@ do_generate_hocon_configs(App, ConfName, SchemaFile) -> SchemaMod = lists:concat([App, "_schema"]), case {filelib:is_file(ConfName), filelib:is_file(SchemaFile)} of {true, true} -> - {ok, RawConfig} = hocon:load(ConfName), - Config = hocon_schema:check_plain(list_to_atom(SchemaMod), RawConfig, #{atom_key => true}), + {ok, RawConfig} = hocon:load(ConfName, #{format => richmap}), + Config = hocon_schema:check(list_to_atom(SchemaMod), RawConfig, #{atom_key => true, + return_plain => true}), emqx_config_handler:update_config(emqx_config_handler, Config); {true, false} -> error({schema_not_found, [SchemaFile]}); {false, true} -> - error({config_not_found, [SchemaFile]}); + error({config_not_found, [ConfName]}); {false, false} -> error({conf_and_schema_not_found, [ConfName, SchemaFile]}) end.