Skip to content

Commit d424977

Browse files
committed
rabbit_prelaunch_conf: Load additional Cuttlefish configuration files
By default, in addition to `$RABBITMQ_CONFIG_FILE`, we also load all matching `$RABBITMQ_CONFIG_FILES`. It allows to split the configuration into many files for easier management. Here is the behavior in more details: * If `$RABBITMQ_CONFIG_FILES` is a directory, all files directly inside it are considered. * If `$RABBITMQ_CONFIG_FILES` is a glob pattern, all files matching the pattern are considered. * In both cases, subdirectories (and whatever they contain) are ignored. * `$RABBITMQ_CONFIG_FILES` is only relevant when the main configuration is either missing (the file does not exist or is empty) or uses the Cuttlefish format. * Additional configuration files must use the Cuttlefish format. The default value of `$RABBITMQ_CONFIG_FILES` is: * `/etc/rabbitmq/conf.d/*.conf` on Unix * `%APPDATA%\RabbitMQ\conf.d\*.conf` on Windows Error messages related to Cuttlefish parsing were improved in the process. [#171491267]
1 parent 84176a6 commit d424977

File tree

1 file changed

+46
-7
lines changed

1 file changed

+46
-7
lines changed

apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,28 @@ setup(Context) ->
2020

2121
%% TODO: Check if directories/files are inside Mnesia dir.
2222

23-
%% TODO: Support glob patterns & directories in RABBITMQ_CONFIG_FILE.
24-
2523
ok = set_default_config(),
2624

25+
AdditionalConfigFiles = find_additional_config_files(Context),
2726
AdvancedConfigFile = find_actual_advanced_config_file(Context),
2827
State = case find_actual_main_config_file(Context) of
2928
{MainConfigFile, erlang} ->
29+
case AdditionalConfigFiles of
30+
[] ->
31+
ok;
32+
_ ->
33+
rabbit_log_prelaunch:notice(
34+
"The following additional configuration "
35+
"files are not loaded when the main "
36+
"configuration file uses the Erlang terms "
37+
"based format"),
38+
lists:foreach(
39+
fun(File) ->
40+
rabbit_log_prelaunch:notice(
41+
" - ~ts", [File])
42+
end,
43+
AdditionalConfigFiles)
44+
end,
3045
Config = load_erlang_term_based_config_file(
3146
MainConfigFile),
3247
Apps = [App || {App, _} <- Config],
@@ -35,7 +50,17 @@ setup(Context) ->
3550
config_files => [MainConfigFile],
3651
config_advanced_file => undefined};
3752
{MainConfigFile, cuttlefish} ->
38-
ConfigFiles = [MainConfigFile],
53+
ConfigFiles = [MainConfigFile | AdditionalConfigFiles],
54+
Config = load_cuttlefish_config_file(Context,
55+
ConfigFiles,
56+
AdvancedConfigFile),
57+
Apps = [App || {App, _} <- Config],
58+
decrypt_config(Apps),
59+
#{config_type => cuttlefish,
60+
config_files => ConfigFiles,
61+
config_advanced_file => AdvancedConfigFile};
62+
undefined when AdditionalConfigFiles =/= [] ->
63+
ConfigFiles = AdditionalConfigFiles,
3964
Config = load_cuttlefish_config_file(Context,
4065
ConfigFiles,
4166
AdvancedConfigFile),
@@ -133,6 +158,19 @@ find_actual_main_config_file(#{main_config_file := File}) ->
133158
end
134159
end.
135160

161+
find_additional_config_files(#{additional_config_files := Pattern})
162+
when Pattern =/= undefined ->
163+
Pattern1 = case filelib:is_dir(Pattern) of
164+
true -> filename:join(Pattern, "*");
165+
false -> Pattern
166+
end,
167+
OnlyFiles = [File ||
168+
File <- filelib:wildcard(Pattern1),
169+
filelib:is_regular(File)],
170+
lists:sort(OnlyFiles);
171+
find_additional_config_files(_) ->
172+
[].
173+
136174
find_actual_advanced_config_file(#{advanced_config_file := File}) ->
137175
case filelib:is_regular(File) of
138176
true -> File;
@@ -209,19 +247,20 @@ generate_config_from_cuttlefish_files(Context,
209247
end, ConfigFiles),
210248
case cuttlefish_conf:files(ConfigFiles) of
211249
{errorlist, Errors} ->
212-
rabbit_log_prelaunch:error("Error generating configuration:", []),
250+
rabbit_log_prelaunch:error("Error parsing configuration:"),
213251
lists:foreach(
214252
fun(Error) ->
215253
rabbit_log_prelaunch:error(" - ~ts", [cuttlefish_error:xlate(Error)])
216254
end, Errors),
217-
throw({error, failed_to_generate_configuration_file});
255+
rabbit_log_prelaunch:error("Are those files using the Cuttlefish format?"),
256+
throw({error, failed_to_parse_configuration_file});
218257
Config0 ->
219258
%% Finalize configuration, based on the schema.
220259
Config = case cuttlefish_generator:map(Schema, Config0) of
221260
{error, Phase, {errorlist, Errors}} ->
222261
%% TODO
223262
rabbit_log_prelaunch:error(
224-
"Error generating configuration in phase ~ts:",
263+
"Error preparing configuration in phase ~ts:",
225264
[Phase]),
226265
lists:foreach(
227266
fun(Error) ->
@@ -230,7 +269,7 @@ generate_config_from_cuttlefish_files(Context,
230269
[cuttlefish_error:xlate(Error)])
231270
end, Errors),
232271
throw(
233-
{error, failed_to_generate_configuration_file});
272+
{error, failed_to_prepare_configuration});
234273
ValidConfig ->
235274
proplists:delete(vm_args, ValidConfig)
236275
end,

0 commit comments

Comments
 (0)