diff options
| author | Daniil Fedotov <dfedotov@pivotal.io> | 2016-02-17 11:11:57 +0000 |
|---|---|---|
| committer | Daniil Fedotov <dfedotov@pivotal.io> | 2016-02-17 11:11:57 +0000 |
| commit | 7104595588c739dc8e92671b0307adcb9b40ef2f (patch) | |
| tree | 67bfc4911d5e1a5617e13fb15effd2eb3c8f9d3b | |
| parent | 77bea34198bbbf4f67f726652e5144ca14d66601 (diff) | |
| download | rabbitmq-server-git-7104595588c739dc8e92671b0307adcb9b40ef2f.tar.gz | |
Support for plugin schemas
| -rw-r--r-- | Makefile | 8 | ||||
| -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-defaults | 2 | ||||
| -rw-r--r-- | scripts/rabbitmq-defaults.bat | 2 | ||||
| -rw-r--r-- | scripts/rabbitmq-env | 3 | ||||
| -rwxr-xr-x | scripts/rabbitmq-server | 8 | ||||
| -rw-r--r-- | scripts/rabbitmq-server.bat | 9 | ||||
| -rw-r--r-- | scripts/rabbitmq-service.bat | 11 | ||||
| -rw-r--r-- | src/rabbit.erl | 25 | ||||
| -rw-r--r-- | src/rabbit_config.erl | 29 | ||||
| -rw-r--r-- | src/rabbit_plugins.erl | 17 |
12 files changed, 113 insertions, 65 deletions
@@ -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; |
