From 7edfe2292c3c59a8e03e37574b89a00708ae1bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Mon, 16 Mar 2020 17:00:02 +0100 Subject: [PATCH 1/2] rabbit_prelaunch_conf: Always handle config. files with Cuttlefish This has several benefits: 1. It simplifies the code, all configuration being handled by the same code path (no more condition on Erlang-term-based vs. Cuttlefish). `rabbit_config` shrinks quite a lot in the process. 2. We can use additional configuration files AND an Erlang-term-based configuration file. In other words, it is possible to use the same existing Erlang-term-based file and introduce Cuttlefish files when needed. It allows a user to run RabbitMQ with: RABBITMQ_CONFIG_FILE=/path/to/rabbitmq.config \ RABBITMQ_CONFIG_FILES=/path/to/conf.d/*.conf \ ./sbin/rabbitmq-server A developer can do the same with `make run-broker`: make run-broker \ RABBITMQ_CONFIG_FILES=/path/to/conf.d/*.conf In the example above, the main configuration file generated by rabbitmq-run.mk is an Erlang-term-based one. This is implemented by calling Cuttlefish with a (possibly empty) list of additional files and the Erlang-term-based file as the advanced configuration file. References #2180. --- .../src/rabbit_prelaunch_conf.erl | 63 ++++-------------- src/rabbit_config.erl | 66 +++---------------- 2 files changed, 21 insertions(+), 108 deletions(-) diff --git a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl index 9ff4cf09d0e8..ece600b68eb7 100644 --- a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl +++ b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl @@ -26,29 +26,13 @@ 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, @@ -56,8 +40,7 @@ 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 AdditionalConfigFiles =/= [] -> ConfigFiles = AdditionalConfigFiles, @@ -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(), @@ -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) -> diff --git a/src/rabbit_config.erl b/src/rabbit_config.erl index 573a972c682e..d65475d38810 100644 --- a/src/rabbit_config.erl +++ b/src/rabbit_config.erl @@ -10,24 +10,10 @@ -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() -> @@ -43,7 +29,7 @@ schema_dir() -> 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 @@ -53,47 +39,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. From 5f5fccfb40526dbb4e0b4faa7ff5e66d6cb43672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Mon, 16 Mar 2020 17:38:24 +0100 Subject: [PATCH 2/2] rabbit_config: Deprecate schema_dir/0 It is unused in RabbitMQ or tier-1 plugins, and the previously returned value made no sense since the switch to Cuttlefish as a library (as part of #2180). --- src/rabbit_config.erl | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/rabbit_config.erl b/src/rabbit_config.erl index d65475d38810..1198035a7aab 100644 --- a/src/rabbit_config.erl +++ b/src/rabbit_config.erl @@ -1,11 +1,13 @@ -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(). @@ -17,14 +19,7 @@ get_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