summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Fedotov <dfedotov@pivotal.io>2016-02-17 11:11:57 +0000
committerDaniil Fedotov <dfedotov@pivotal.io>2016-02-17 11:11:57 +0000
commit7104595588c739dc8e92671b0307adcb9b40ef2f (patch)
tree67bfc4911d5e1a5617e13fb15effd2eb3c8f9d3b
parent77bea34198bbbf4f67f726652e5144ca14d66601 (diff)
downloadrabbitmq-server-git-7104595588c739dc8e92671b0307adcb9b40ef2f.tar.gz
Support for plugin schemas
-rw-r--r--Makefile8
-rw-r--r--docs/rabbitmq.conf.example (renamed from rabbitmq.conf.d/rabbitmq.conf.example)64
-rw-r--r--priv/schema/rabbitmq.schema (renamed from scripts/rabbitmq.schema)0
-rw-r--r--scripts/rabbitmq-defaults2
-rw-r--r--scripts/rabbitmq-defaults.bat2
-rw-r--r--scripts/rabbitmq-env3
-rwxr-xr-xscripts/rabbitmq-server8
-rw-r--r--scripts/rabbitmq-server.bat9
-rw-r--r--scripts/rabbitmq-service.bat11
-rw-r--r--src/rabbit.erl25
-rw-r--r--src/rabbit_config.erl29
-rw-r--r--src/rabbit_plugins.erl17
12 files changed, 113 insertions, 65 deletions
diff --git a/Makefile b/Makefile
index dfb7555d79..e0f0328210 100644
--- a/Makefile
+++ b/Makefile
@@ -359,7 +359,7 @@ install: install-erlapp install-scripts
install-erlapp: dist
$(verbose) mkdir -p $(DESTDIR)$(RMQ_ERLAPP_DIR)
- $(inst_verbose) cp -r include ebin plugins LICENSE* INSTALL \
+ $(inst_verbose) cp -r include ebin plugins priv LICENSE* INSTALL \
$(DESTDIR)$(RMQ_ERLAPP_DIR)
$(verbose) echo "Put your EZs here and use rabbitmq-plugins to enable them." \
> $(DESTDIR)$(RMQ_ERLAPP_DIR)/plugins/README
@@ -400,7 +400,7 @@ install-windows: install-windows-erlapp install-windows-scripts install-windows-
install-windows-erlapp: dist
$(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)
- $(inst_verbose) cp -r include ebin plugins LICENSE* INSTALL \
+ $(inst_verbose) cp -r include ebin plugins priv LICENSE* INSTALL \
$(DESTDIR)$(WINDOWS_PREFIX)
$(verbose) echo "Put your EZs here and use rabbitmq-plugins.bat to enable them." \
> $(DESTDIR)$(WINDOWS_PREFIX)/plugins/README.txt
@@ -454,7 +454,3 @@ package-generic-unix: $(PACKAGES_SOURCE_DIST_FILE)
$(verbose) $(MAKE) -C packaging $@ \
SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE))
-generate-config:
- rm -rf generated/rabbitmq.*.config
- ./cuttlefish -e . -s ./schema -c rabbitmq.conf.d/rabbitmq.conf -f rabbitmq
- mv generated/rabbitmq.*.config generated/rabbitmq.config
diff --git a/rabbitmq.conf.d/rabbitmq.conf.example b/docs/rabbitmq.conf.example
index 7afc852633..278e37b019 100644
--- a/rabbitmq.conf.d/rabbitmq.conf.example
+++ b/docs/rabbitmq.conf.example
@@ -8,26 +8,26 @@
## By default, RabbitMQ will listen on all interfaces, using
## the standard (reserved) AMQP port.
##
-# listener.tcp.default = 5672
+# listeners.tcp.default = 5672
## To listen on a specific interface, provide an IP address with port.
## For example, to listen only on localhost for both IPv4 and IPv6:
##
# IPv4
-# listener.tcp.local = 127.0.0.1:5672
+# listeners.tcp.local = 127.0.0.1:5672
# IPv6
-# listener.tcp.local_v6 = ::1:5672
+# listeners.tcp.local_v6 = ::1:5672
## You can define multiple listeners using listener names
-# listener.tcp.other_port = 5673
-# listener.tcp.other_ip = 10.10.10.10:5672
+# listeners.tcp.other_port = 5673
+# listeners.tcp.other_ip = 10.10.10.10:5672
## SSL listeners are configured in the same fashion as TCP listeners,
## including the option to control the choice of interface.
##
-# listener.ssl.default = 5671
+# listeners.ssl.default = 5671
## Number of Erlang processes that will accept connections for the TCP
## and SSL listeners.
@@ -56,20 +56,20 @@
## via a loopback interface (e.g. localhost).
## {loopback_users, [<<"guest">>]},
##
-# loopback_user.guest = true
+# loopback_users.guest = true
## Uncomment the following line if you want to allow access to the
## guest user from anywhere on the network.
-# loopback_user.guest = false
+# loopback_users.guest = false
## Configuring SSL.
## See http://www.rabbitmq.com/ssl.html for full documentation.
##
-# ssl_option.verify = verify_peer
-# ssl_option.fail_if_no_peer_cert = false
-# ssl_option.cacertfile = /path/to/rabbitmq.crt
-# ssl_option.certfile = /path/to/rabbitmq.crt
-# ssl_option.keyfile = /path/to/rabbitmq.key
+# ssl_options.verify = verify_peer
+# ssl_options.fail_if_no_peer_cert = false
+# ssl_options.cacertfile = /path/to/rabbitmq.crt
+# ssl_options.certfile = /path/to/rabbitmq.crt
+# ssl_options.keyfile = /path/to/rabbitmq.key
## Choose the available SASL mechanism(s) to expose.
## The two default (built in) mechanisms are 'PLAIN' and
@@ -78,8 +78,8 @@
##
## See http://www.rabbitmq.com/authentication.html for more details.
##
-# auth_mechanism.plain = PLAIN
-# auth_mechanism.amqplain = AMQPLAIN
+# auth_mechanisms.1 = PLAIN
+# auth_mechanisms.2 = AMQPLAIN
## Select an authentication database to use. RabbitMQ comes bundled
## with a built-in auth-database, based on mnesia.
@@ -104,7 +104,7 @@
## To use auth-mechanism-ssl, add to or replace the auth_mechanisms
## with EXTERNAL value.
##
-#auth_mechanism.external = EXTERNAL
+#auth_mechanisms.3 = EXTERNAL
## The rabbitmq_auth_backend_ldap plugin allows the broker to
## perform authentication and authorisation by deferring to an
@@ -119,7 +119,7 @@
# auth_backends.2 = rabbit_auth_backend_ldap
## Add another backend
-# auth_backend.3 = rabbit_auth_backend_http
+# auth_backends.3 = rabbit_auth_backend_http
## This pertains to both the rabbitmq_auth_mechanism_ssl plugin and
@@ -209,9 +209,9 @@
## further documentation.
##
-# tcp_listen_option.backlog = 128
-# tcp_listen_option.nodelay = true
-# tcp_listen_option.exit_on_close = false
+# tcp_listen_options.backlog = 128
+# tcp_listen_options.nodelay = true
+# tcp_listen_options.exit_on_close = false
##
## Resource Limits & Flow Control
@@ -392,13 +392,13 @@
##
# QA: Maybe use IP type like in tcp_listener?
-# management.listener.port = 12345
-# management.listener.ip = 127.0.0.1
-# management.listener.ssl = true
+# management.listeners.port = 12345
+# management.listeners.ip = 127.0.0.1
+# management.listeners.ssl = true
-# management.listener.ssl_opts.cacertfile = /path/to/cacert.pem
-# management.listener.ssl_opts.certfile = /path/to/cert.pem
-# management.listener.ssl_opts.keyfile = /path/to/key.pem
+# management.listeners.ssl_opts.cacertfile = /path/to/cacert.pem
+# management.listeners.ssl_opts.certfile = /path/to/cert.pem
+# management.listeners.ssl_opts.keyfile = /path/to/key.pem
## One of 'basic', 'detailed' or 'none'. See
## http://www.rabbitmq.com/management.html#fine-stats for more details.
@@ -439,11 +439,11 @@
## Network Configuration - the format is generally the same as for the broker
##
-# stomp.listener.tcp.default = 61613
+# stomp.listeners.tcp.default = 61613
## Same for ssl listeners
##
-# stomp.listener.ssl.default = 61614
+# stomp.listeners.ssl.default = 61614
## Number of Erlang processes that will accept connections for the TCP
## and SSL listeners.
@@ -521,11 +521,11 @@
## TCP/SSL Configuration (as per the broker configuration).
##
-# mqtt.listener.tcp.default = 1883
+# mqtt.listeners.tcp.default = 1883
## Same for ssl listener
##
-# mqtt.listener.ssl.default = 1884
+# mqtt.listeners.ssl.default = 1884
## Number of Erlang processes that will accept connections for the TCP
## and SSL listeners.
@@ -535,8 +535,8 @@
## TCP/Socket options (as per the broker configuration).
##
-# mqtt.tcp_listen_option.backlog = 128
-# mqtt.tcp_listen_option.nodelay = true
+# mqtt.tcp_listen_options.backlog = 128
+# mqtt.tcp_listen_options.nodelay = true
## ----------------------------------------------------------------------------
## RabbitMQ AMQP 1.0 Support
diff --git a/scripts/rabbitmq.schema b/priv/schema/rabbitmq.schema
index b7663700cc..b7663700cc 100644
--- a/scripts/rabbitmq.schema
+++ b/priv/schema/rabbitmq.schema
diff --git a/scripts/rabbitmq-defaults b/scripts/rabbitmq-defaults
index b5427eee46..b102b3619c 100644
--- a/scripts/rabbitmq-defaults
+++ b/scripts/rabbitmq-defaults
@@ -39,7 +39,7 @@ LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins
GENERATED_CONFIG_DIR=${SYS_PREFIX}/var/lib/rabbitmq/config
-RABBITMQ_CONFIG_ADDITIONAL=${SYS_PREFIX}/etc/rabbitmq/additional
+RABBITMQ_CONFIG_ADVANCED=${SYS_PREFIX}/etc/rabbitmq/advanced
PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
IO_THREAD_POOL_SIZE=64
diff --git a/scripts/rabbitmq-defaults.bat b/scripts/rabbitmq-defaults.bat
index 3c57b2ab34..7c351bf48a 100644
--- a/scripts/rabbitmq-defaults.bat
+++ b/scripts/rabbitmq-defaults.bat
@@ -42,7 +42,7 @@ set LOG_BASE=!RABBITMQ_BASE!\log
set MNESIA_BASE=!RABBITMQ_BASE!\db
set ENABLED_PLUGINS_FILE=!RABBITMQ_BASE!\enabled_plugins
set GENERATED_CONFIG_DIR=!RABBITMQ_BASE!\config
-set RABBITMQ_CONFIG_ADDITIONAL=!RABBITMQ_BASE!\additional
+set RABBITMQ_CONFIG_ADVANCED=!RABBITMQ_BASE!\advanced
REM PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
for /f "delims=" %%F in ("!TDP0!..\plugins") do set PLUGINS_DIR=%%~dpsF%%~nF%%~xF
diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env
index 9a2b7acc3c..a360631a19 100644
--- a/scripts/rabbitmq-env
+++ b/scripts/rabbitmq-env
@@ -259,7 +259,8 @@ if [ "${RABBITMQ_DEV_ENV}" ]; then
RABBITMQ_ENABLED_PLUGINS_FILE="${enabled_plugins_file}"
fi
fi
-
+
+
if [ -d "${RABBITMQ_PLUGINS_DIR}" ]; then
# RabbitMQ was started with "make run-broker" from its own
# source tree. Take rabbit_common from the plugins directory.
diff --git a/scripts/rabbitmq-server b/scripts/rabbitmq-server
index 1b95d9efb1..9f70c7f992 100755
--- a/scripts/rabbitmq-server
+++ b/scripts/rabbitmq-server
@@ -70,7 +70,7 @@ RABBITMQ_DIST_PORT=$RABBITMQ_DIST_PORT \
${RABBITMQ_NAME_TYPE} rabbitmqprelaunch$$ \
-conf_dir "${RABBITMQ_GENERATED_CONFIG_DIR}" \
-conf_script_dir "`dirname $0`" \
- -conf_additional "${RABBITMQ_CONFIG_ADDITIONAL}" \
+ -conf_advanced "${RABBITMQ_CONFIG_ADVANCED}" \
-extra "${RABBITMQ_NODENAME}"
PRELAUNCH_RESULT=$?
@@ -89,7 +89,11 @@ set -e
if [ -f "${RABBITMQ_CONFIG_FILE}.config" ]; then
RABBITMQ_CONFIG_ARG="-config ${RABBITMQ_CONFIG_FILE}"
elif [ -f "${RABBITMQ_CONFIG_FILE}.conf" ]; then
- RABBITMQ_CONFIG_ARG="-conf ${RABBITMQ_CONFIG_FILE} -conf_dir ${RABBITMQ_GENERATED_CONFIG_DIR} -conf_script_dir `dirname $0` -conf_additional ${RABBITMQ_CONFIG_ADDITIONAL}"
+ RABBITMQ_CONFIG_ARG="-conf ${RABBITMQ_CONFIG_FILE} \
+ -conf_dir ${RABBITMQ_GENERATED_CONFIG_DIR} \
+ -conf_script_dir `dirname $0` \
+ -conf_advanced ${RABBITMQ_CONFIG_ADVANCED} \
+ -conf_schema_dir ${RABBITMQ_HOME}/priv/schema"
fi
RABBITMQ_LISTEN_ARG=
diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat
index d2c63d2036..2064dc1474 100644
--- a/scripts/rabbitmq-server.bat
+++ b/scripts/rabbitmq-server.bat
@@ -50,7 +50,8 @@ set RABBITMQ_CONFIG_FILE="!RABBITMQ_CONFIG_FILE!"
!RABBITMQ_NAME_TYPE! rabbitmqprelaunch!RANDOM!!TIME:~9! ^
-conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" ^
-conf_script_dir "%~dp0" ^
- -conf_additional "!RABBITMQ_CONFIG_ADDITIONAL!" ^
+ -conf_advanced "!RABBITMQ_CONFIG_ADVANCED!" ^
+ -conf_schema_dir "!RABBITMQ_HOME!\priv\schema" ^
-extra "!RABBITMQ_NODENAME!"
if ERRORLEVEL 2 (
@@ -66,7 +67,11 @@ set RABBITMQ_EBIN_PATH="-pa !RABBITMQ_EBIN_ROOT!"
if exist "!RABBITMQ_CONFIG_FILE!.config" (
set RABBITMQ_CONFIG_ARG=-config "!RABBITMQ_CONFIG_FILE!"
) else if exist "!RABBITMQ_CONFIG_FILE!.conf" (
- set RABBITMQ_CONFIG_ARG=-conf "!RABBITMQ_CONFIG_FILE!" -conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" -conf_script_dir "%~dp0" -conf_additional "!RABBITMQ_CONFIG_ADDITIONAL!"
+ set RABBITMQ_CONFIG_ARG=-conf "!RABBITMQ_CONFIG_FILE!" ^
+ -conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" ^
+ -conf_script_dir "%~dp0" ^
+ -conf_advanced "!RABBITMQ_CONFIG_ADVANCED!" ^
+ -conf_schema_dir "!RABBITMQ_HOME!\priv\schema"
) else (
set RABBITMQ_CONFIG_ARG=
)
diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat
index 8de3330f2c..78ca812e8d 100644
--- a/scripts/rabbitmq-service.bat
+++ b/scripts/rabbitmq-service.bat
@@ -122,7 +122,8 @@ set RABBITMQ_CONFIG_FILE="!RABBITMQ_CONFIG_FILE!"
-s rabbit_prelaunch ^
-conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" ^
-conf_script_dir "!TDP0!" ^
- -conf_additional "!RABBITMQ_CONFIG_ADDITIONAL!" ^
+ -conf_advanced "!RABBITMQ_CONFIG_ADVANCED!" ^
+ -conf_schema_dir "!RABBITMQ_HOME!\priv\schema" ^
!RABBITMQ_NAME_TYPE! rabbitmqprelaunch!RANDOM!!TIME:~9!
if ERRORLEVEL 3 (
@@ -140,11 +141,13 @@ if ERRORLEVEL 3 (
if exist "!RABBITMQ_CONFIG_FILE!.config" (
set RABBITMQ_CONFIG_ARG=-config "!RABBITMQ_CONFIG_FILE!"
) else if exist "!RABBITMQ_CONFIG_FILE!.conf" (
- set RABBITMQ_CONFIG_ARG=-conf "!RABBITMQ_CONFIG_FILE!" -conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" -conf_script_dir "!TDP0!" -conf_additional "!RABBITMQ_CONFIG_ADDITIONAL!"
-) else (
rem Always specify generated config arguments, we cannot
rem assume generated file is available
- set RABBITMQ_CONFIG_ARG=-conf "!RABBITMQ_CONFIG_FILE!" -conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" -conf_script_dir "!TDP0!" -conf_additional "!RABBITMQ_CONFIG_ADDITIONAL!"
+ set RABBITMQ_CONFIG_ARG=-conf "!RABBITMQ_CONFIG_FILE!" ^
+ -conf_dir "!RABBITMQ_GENERATED_CONFIG_DIR!" ^
+ -conf_script_dir "!TDP0!" ^
+ -conf_advanced "!RABBITMQ_CONFIG_ADVANCED!" ^
+ -conf_schema_dir "!RABBITMQ_HOME!\priv\schema"
)
set RABBITMQ_LISTEN_ARG=
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 2715b80eb5..7fafaf4d4d 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -272,14 +272,7 @@ start() ->
boot() ->
start_it(fun() ->
- case rabbit_config:prepare_and_use_config() of
- {error, Reason} ->
- log_boot_error_and_exit(
- generate_config_file,
- "~nConfig file generation failed ~p",
- [Reason]);
- ok -> ok
- end,
+ ensure_config(),
ok = ensure_application_loaded(),
HipeResult = rabbit_hipe:maybe_hipe_compile(),
ok = start_logger(),
@@ -293,8 +286,24 @@ boot() ->
broker_start()
end).
+ensure_config() ->
+ case rabbit_config:prepare_and_use_config() of
+ {error, Reason} ->
+ {Format, Arg} = case Reason of
+ {generation_error, Error} -> {"~s", [Error]};
+ Other -> {"~p", [Other]}
+ end,
+ log_boot_error_and_exit(generate_config_file,
+ "~nConfig file generation failed "++Format,
+ Arg);
+ ok -> ok
+ end.
+
+
broker_start() ->
Plugins = rabbit_plugins:setup(),
+ % Duplicate ensure_config to support plugin schemas.
+ ensure_config(),
ToBeLoaded = Plugins ++ ?APPS,
start_apps(ToBeLoaded),
case os:type() of
diff --git a/src/rabbit_config.erl b/src/rabbit_config.erl
index 23e080ae4d..a6107aef6d 100644
--- a/src/rabbit_config.erl
+++ b/src/rabbit_config.erl
@@ -4,7 +4,8 @@
generate_config_file/3,
prepare_and_use_config/0,
prepare_config/1,
- update_app_config/1]).
+ update_app_config/1,
+ schema_dir/0]).
prepare_and_use_config() ->
case config_exist() of
@@ -59,23 +60,25 @@ update_app_config(ConfigFile) ->
ok = application_controller:change_application_data([], [ConfigFile]).
generate_config_file(ConfFiles, ConfDir, ScriptDir) ->
- SchemaFile = filename:join([ScriptDir, "rabbitmq.schema"]),
+ SchemaDir = schema_dir(),
+ % SchemaFile = filename:join([ScriptDir, "rabbitmq.schema"]),
Cuttlefish = filename:join([ScriptDir, "cuttlefish"]),
GeneratedDir = filename:join([ConfDir, "generated"]),
- AdditionalConfigArg = case get_additional_config() of
+ AdvancedConfigArg = case get_advanced_config() of
{ok, FileName} -> [" -a ", FileName];
none -> []
end,
rabbit_file:recursive_delete([GeneratedDir]),
Command = lists:concat(["escript ", "\"", Cuttlefish, "\"",
- " -f rabbitmq -i ", "\"", SchemaFile, "\"",
+ " -f rabbitmq -s ", "\"", SchemaDir, "\"",
" -e ", "\"", ConfDir, "\"",
[[" -c ", ConfFile] || ConfFile <- ConfFiles],
- AdditionalConfigArg]),
+ AdvancedConfigArg]),
+ io:format("Command: ~s~n", [Command]),
Result = rabbit_misc:os_cmd(Command),
case string:str(Result, " -config ") of
- 0 -> {error, {generaion_error, Result}};
+ 0 -> {error, {generation_error, Result}};
_ ->
[OutFile] = rabbit_file:wildcard("rabbitmq.*.config", GeneratedDir),
ResultFile = filename:join([GeneratedDir, "rabbitmq.config"]),
@@ -84,8 +87,18 @@ generate_config_file(ConfFiles, ConfDir, ScriptDir) ->
{ok, ResultFile}
end.
-get_additional_config() ->
- case init:get_argument(conf_additional) of
+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.
+
+get_advanced_config() ->
+ case init:get_argument(conf_advanced) of
{ok, FileName} ->
ConfigName = FileName ++ ".config",
case rabbit_file:is_file(ConfigName) of
diff --git a/src/rabbit_plugins.erl b/src/rabbit_plugins.erl
index c7f5d501bf..ff7ec1a984 100644
--- a/src/rabbit_plugins.erl
+++ b/src/rabbit_plugins.erl
@@ -228,6 +228,7 @@ clean_plugin(Plugin, ExpandDir) ->
prepare_dir_plugin(PluginAppDescPath) ->
PluginEbinDir = filename:dirname(PluginAppDescPath),
Plugin = filename:basename(PluginAppDescPath, ".app"),
+ copy_plugin_schema(Plugin, PluginAppDescPath),
code:add_patha(PluginEbinDir),
case filelib:wildcard(PluginEbinDir++ "/*.beam") of
[] ->
@@ -250,6 +251,22 @@ prepare_dir_plugin(PluginAppDescPath) ->
%%----------------------------------------------------------------------------
+copy_plugin_schema(Plugin, PluginAppDescPath) ->
+ PluginSchema = filename:join([PluginAppDescPath,
+ "priv",
+ "schema",
+ [Plugin, ".schema"]]),
+ case rabbit_file:is_file(PluginSchema) of
+ false -> ok;
+ true ->
+ SchemaDir = rabbit_config:schema_dir(),
+ case rabbit_file:is_dir(SchemaDir) of
+ true -> file:copy(PluginSchema, SchemaDir);
+ false -> rabbit_log:info("Failed to copy plugin schema. "
+ "Schema dir doesn't exist")
+ end
+ end.
+
delete_recursively(Fn) ->
case rabbit_file:recursive_delete([Fn]) of
ok -> ok;