Skip to content

Always handle config files with Cuttlefish #2277

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 12 additions & 51 deletions apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
Original file line number Diff line number Diff line change
Expand Up @@ -26,38 +26,21 @@ setup(Context) ->
AdvancedConfigFile = find_actual_advanced_config_file(Context),
State = case find_actual_main_config_file(Context) of
{MainConfigFile, erlang} ->
case AdditionalConfigFiles of
[] ->
ok;
_ ->
rabbit_log_prelaunch:notice(
"The following additional configuration "
"files are not loaded when the main "
"configuration file uses the Erlang terms "
"based format"),
lists:foreach(
fun(File) ->
rabbit_log_prelaunch:notice(
" - ~ts", [File])
end,
AdditionalConfigFiles)
end,
Config = load_erlang_term_based_config_file(
MainConfigFile),
Config = load_cuttlefish_config_file(Context,
AdditionalConfigFiles,
MainConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => erlang,
config_files => [MainConfigFile],
config_advanced_file => undefined};
#{config_files => AdditionalConfigFiles,
config_advanced_file => MainConfigFile};
{MainConfigFile, cuttlefish} ->
ConfigFiles = [MainConfigFile | AdditionalConfigFiles],
Config = load_cuttlefish_config_file(Context,
ConfigFiles,
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => cuttlefish,
config_files => ConfigFiles,
#{config_files => ConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined when AdditionalConfigFiles =/= [] ->
ConfigFiles = AdditionalConfigFiles,
Expand All @@ -66,23 +49,21 @@ setup(Context) ->
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => cuttlefish,
config_files => ConfigFiles,
#{config_files => ConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined when AdvancedConfigFile =/= undefined ->
rabbit_log_prelaunch:warning(
"Using RABBITMQ_ADVANCED_CONFIG_FILE: ~s",
[AdvancedConfigFile]),
Config = load_erlang_term_based_config_file(
AdvancedConfigFile),
Config = load_cuttlefish_config_file(Context,
AdditionalConfigFiles,
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => erlang,
config_files => [AdvancedConfigFile],
#{config_files => AdditionalConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined ->
#{config_type => undefined,
config_files => [],
#{config_files => [],
config_advanced_file => undefined}
end,
ok = override_with_hard_coded_critical_config(),
Expand Down Expand Up @@ -186,26 +167,6 @@ determine_config_format(File) ->
end
end.

load_erlang_term_based_config_file(ConfigFile) ->
rabbit_log_prelaunch:debug(
"Loading configuration file \"~ts\" (Erlang terms based)", [ConfigFile]),
case file:consult(ConfigFile) of
{ok, [Config]} when is_list(Config) ->
apply_erlang_term_based_config(Config),
Config;
{ok, OtherTerms} ->
rabbit_log_prelaunch:error(
"Failed to load configuration file \"~ts\", "
"incorrect format: ~p",
[ConfigFile, OtherTerms]),
throw({error, failed_to_parse_configuration_file});
{error, Reason} ->
rabbit_log_prelaunch:error(
"Failed to load configuration file \"~ts\": ~ts",
[ConfigFile, file:format_error(Reason)]),
throw({error, failed_to_read_configuration_file})
end.

load_cuttlefish_config_file(Context,
ConfigFiles,
AdvancedConfigFile) ->
Expand Down
79 changes: 13 additions & 66 deletions src/rabbit_config.erl
Original file line number Diff line number Diff line change
@@ -1,49 +1,30 @@
-module(rabbit_config).

-export([
schema_dir/0,
config_files/0,
get_advanced_config/0
]).

-export([schema_dir/0]).
-deprecated([{schema_dir, 0, eventually}]).

-export_type([config_location/0]).

-type config_location() :: string().

%% we support both the classic Erlang term
%% config file (rabbitmq.config) as well as rabbitmq.conf
legacy_erlang_term_config_used() ->
case get_prelaunch_config_state() of
#{config_type := erlang,
config_advanced_file := undefined} ->
true;
_ ->
false
end.

get_confs() ->
case get_prelaunch_config_state() of
#{config_files := Confs} ->
[ filename:rootname(Conf, ".conf") ++ ".conf"
|| Conf <- Confs ];
_ ->
[]
#{config_files := Confs} -> Confs;
_ -> []
end.

schema_dir() ->
case init:get_argument(conf_schema_dir) of
{ok, SchemaDir} -> SchemaDir;
_ ->
case code:priv_dir(rabbit) of
{error, bad_name} -> filename:join([".", "priv", "schema"]);
PrivDir -> filename:join([PrivDir, "schema"])
end
end.
undefined.

get_advanced_config() ->
case get_prelaunch_config_state() of
%% There can be only one advanced.config
#{config_advanced_file := FileName} ->
#{config_advanced_file := FileName} when FileName =/= undefined ->
case rabbit_file:is_file(FileName) of
true -> FileName;
false -> none
Expand All @@ -53,47 +34,13 @@ get_advanced_config() ->

-spec config_files() -> [config_location()].
config_files() ->
case legacy_erlang_term_config_used() of
true ->
case get_prelaunch_config_state() of
#{config_files := Files} ->
[ filename:absname(filename:rootname(File) ++ ".config")
|| File <- Files];
_ ->
case config_setting() of
ConfFiles = [filename:absname(File) || File <- get_confs(),
filelib:is_regular(File)],
AdvancedFiles = case get_advanced_config() of
none -> [];
File -> [filename:absname(filename:rootname(File, ".config") ++ ".config")
++
" (not found)"]
end
end;
false ->
ConfFiles = [filename:absname(File) || File <- get_confs(),
filelib:is_regular(File)],
AdvancedFiles = case get_advanced_config() of
none -> [];
FileName -> [filename:absname(FileName)]
end,
AdvancedFiles ++ ConfFiles

end.
FileName -> [filename:absname(FileName)]
end,
AdvancedFiles ++ ConfFiles.

get_prelaunch_config_state() ->
rabbit_prelaunch_conf:get_config_state().

%% This is a pain. We want to know where the config file is. But we
%% can't specify it on the command line if it is missing or the VM
%% will fail to start, so we need to find it by some mechanism other
%% than init:get_arguments/0. We can look at the environment variable
%% which is responsible for setting it... but that doesn't work for a
%% Windows service since the variable can change and the service not
%% be reinstalled, so in that case we add a magic application env.
config_setting() ->
case application:get_env(rabbit, windows_service_config) of
{ok, File1} -> File1;
undefined ->
case application:get_env(rabbitmq_prelaunch, context) of
#{main_config_file := File2} -> File2;
_ -> none
end
end.