diff options
author | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-02-26 15:27:24 +0100 |
---|---|---|
committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-02-28 09:42:15 +0100 |
commit | c1e891c5ee343910a9b4537fd5930b0bb34d20a2 (patch) | |
tree | 9116bbfb52e3fbfdb6cf6787130514acdda3059f | |
parent | 234be07b3cc8438b6a26a4c6be8ab02c4c94c872 (diff) | |
download | rabbitmq-server-git-c1e891c5ee343910a9b4537fd5930b0bb34d20a2.tar.gz |
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]
-rw-r--r-- | apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl index d71df752cc..db7f16702f 100644 --- a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl +++ b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl @@ -20,13 +20,28 @@ setup(Context) -> %% TODO: Check if directories/files are inside Mnesia dir. - %% TODO: Support glob patterns & directories in RABBITMQ_CONFIG_FILE. - ok = set_default_config(), + AdditionalConfigFiles = find_additional_config_files(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), Apps = [App || {App, _} <- Config], @@ -35,7 +50,17 @@ setup(Context) -> config_files => [MainConfigFile], config_advanced_file => undefined}; {MainConfigFile, cuttlefish} -> - ConfigFiles = [MainConfigFile], + 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_advanced_file => AdvancedConfigFile}; + undefined when AdditionalConfigFiles =/= [] -> + ConfigFiles = AdditionalConfigFiles, Config = load_cuttlefish_config_file(Context, ConfigFiles, AdvancedConfigFile), @@ -133,6 +158,19 @@ find_actual_main_config_file(#{main_config_file := File}) -> end end. +find_additional_config_files(#{additional_config_files := Pattern}) + when Pattern =/= undefined -> + Pattern1 = case filelib:is_dir(Pattern) of + true -> filename:join(Pattern, "*"); + false -> Pattern + end, + OnlyFiles = [File || + File <- filelib:wildcard(Pattern1), + filelib:is_regular(File)], + lists:sort(OnlyFiles); +find_additional_config_files(_) -> + []. + find_actual_advanced_config_file(#{advanced_config_file := File}) -> case filelib:is_regular(File) of true -> File; @@ -209,19 +247,20 @@ generate_config_from_cuttlefish_files(Context, end, ConfigFiles), case cuttlefish_conf:files(ConfigFiles) of {errorlist, Errors} -> - rabbit_log_prelaunch:error("Error generating configuration:", []), + rabbit_log_prelaunch:error("Error parsing configuration:"), lists:foreach( fun(Error) -> rabbit_log_prelaunch:error(" - ~ts", [cuttlefish_error:xlate(Error)]) end, Errors), - throw({error, failed_to_generate_configuration_file}); + rabbit_log_prelaunch:error("Are these files using the Cuttlefish format?"), + throw({error, failed_to_parse_configuration_file}); Config0 -> %% Finalize configuration, based on the schema. Config = case cuttlefish_generator:map(Schema, Config0) of {error, Phase, {errorlist, Errors}} -> %% TODO rabbit_log_prelaunch:error( - "Error generating configuration in phase ~ts:", + "Error preparing configuration in phase ~ts:", [Phase]), lists:foreach( fun(Error) -> @@ -230,7 +269,7 @@ generate_config_from_cuttlefish_files(Context, [cuttlefish_error:xlate(Error)]) end, Errors), throw( - {error, failed_to_generate_configuration_file}); + {error, failed_to_prepare_configuration}); ValidConfig -> proplists:delete(vm_args, ValidConfig) end, |