Skip to content

Commit bcff954

Browse files
Merge branch 'master' into rabbitmq-server-567
2 parents 12901fb + 72f7c8e commit bcff954

File tree

6 files changed

+80
-127
lines changed

6 files changed

+80
-127
lines changed

scripts/rabbitmq-env

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ rmq_normalize_path_var RABBITMQ_PID_FILE
220220

221221
[ "x" = "x$RABBITMQ_BOOT_MODULE" ] && RABBITMQ_BOOT_MODULE=${BOOT_MODULE}
222222

223+
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
224+
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand
225+
rmq_normalize_path_var RABBITMQ_PLUGINS_EXPAND_DIR
226+
223227
[ "x" != "x$RABBITMQ_ENABLED_PLUGINS_FILE" ] && RABBITMQ_ENABLED_PLUGINS_FILE_source=environment
224228
[ "x" = "x$RABBITMQ_ENABLED_PLUGINS_FILE" ] && RABBITMQ_ENABLED_PLUGINS_FILE=${ENABLED_PLUGINS_FILE}
225229
rmq_normalize_path_var RABBITMQ_ENABLED_PLUGINS_FILE
@@ -249,6 +253,7 @@ rmq_check_if_shared_with_mnesia \
249253
RABBITMQ_CONFIG_FILE \
250254
RABBITMQ_LOG_BASE \
251255
RABBITMQ_PID_FILE \
256+
RABBITMQ_PLUGINS_EXPAND_DIR \
252257
RABBITMQ_ENABLED_PLUGINS_FILE \
253258
RABBITMQ_PLUGINS_DIR \
254259
RABBITMQ_LOGS \

scripts/rabbitmq-env.bat

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,20 @@ if "!RABBITMQ_BOOT_MODULE!"=="" (
262262
)
263263
)
264264

265+
REM [ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
266+
REM [ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand
267+
if "!RABBITMQ_PLUGINS_EXPAND_DIR!"=="" (
268+
if "!PLUGINS_EXPAND_DIR!"=="" (
269+
set RABBITMQ_PLUGINS_EXPAND_DIR=!RABBITMQ_MNESIA_BASE!\!RABBITMQ_NODENAME!-plugins-expand
270+
) else (
271+
set RABBITMQ_PLUGINS_EXPAND_DIR=!PLUGINS_EXPAND_DIR!
272+
)
273+
)
274+
REM FIXME: RabbitMQ removes and recreates RABBITMQ_PLUGINS_EXPAND_DIR
275+
REM itself. Therefore we can't create it here in advance and escape the
276+
REM directory name, and RABBITMQ_PLUGINS_EXPAND_DIR must not contain
277+
REM non-US-ASCII characters.
278+
265279
REM [ "x" = "x$RABBITMQ_ENABLED_PLUGINS_FILE" ] && RABBITMQ_ENABLED_PLUGINS_FILE=${ENABLED_PLUGINS_FILE}
266280
if "!RABBITMQ_ENABLED_PLUGINS_FILE!"=="" (
267281
if "!ENABLED_PLUGINS_FILE!"=="" (

scripts/rabbitmq-server

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ start_rabbitmq_server() {
221221
-rabbit lager_handler_upgrade "$RABBITMQ_LAGER_HANDLER_UPGRADE" \
222222
-rabbit enabled_plugins_file "\"$RABBITMQ_ENABLED_PLUGINS_FILE\"" \
223223
-rabbit plugins_dir "\"$RABBITMQ_PLUGINS_DIR\"" \
224+
-rabbit plugins_expand_dir "\"$RABBITMQ_PLUGINS_EXPAND_DIR\"" \
224225
-os_mon start_cpu_sup false \
225226
-os_mon start_disksup false \
226227
-os_mon start_memsup false \

scripts/rabbitmq-server.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ if "!ENV_OK!"=="false" (
174174
-rabbit lager_handler !RABBIT_LAGER_HANDLER! ^
175175
-rabbit enabled_plugins_file \""!RABBITMQ_ENABLED_PLUGINS_FILE:\=/!"\" ^
176176
-rabbit plugins_dir \""!RABBITMQ_PLUGINS_DIR:\=/!"\" ^
177+
-rabbit plugins_expand_dir \""!RABBITMQ_PLUGINS_EXPAND_DIR:\=/!"\" ^
177178
-os_mon start_cpu_sup false ^
178179
-os_mon start_disksup false ^
179180
-os_mon start_memsup false ^

scripts/rabbitmq-service.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ set ERLANG_SERVICE_ARGUMENTS= ^
251251
-rabbit lager_handler !RABBIT_LAGER_HANDLER! ^
252252
-rabbit enabled_plugins_file \""!RABBITMQ_ENABLED_PLUGINS_FILE:\=/!"\" ^
253253
-rabbit plugins_dir \""!RABBITMQ_PLUGINS_DIR:\=/!"\" ^
254+
-rabbit plugins_expand_dir \""!RABBITMQ_PLUGINS_EXPAND_DIR:\=/!"\" ^
254255
-rabbit windows_service_config \""!RABBITMQ_CONFIG_FILE:\=/!"\" ^
255256
-os_mon start_cpu_sup false ^
256257
-os_mon start_disksup false ^

src/rabbit_plugins.erl

Lines changed: 58 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,15 @@ ensure(FileJustChanged0) ->
6767
{error, {enabled_plugins_mismatch, FileJustChanged, OurFile}}
6868
end.
6969

70+
%% @doc Prepares the file system and installs all enabled plugins.
7071
setup() ->
71-
case application:get_env(rabbit, plugins_expand_dir) of
72-
{ok, ExpandDir} ->
73-
case filelib:is_dir(ExpandDir) of
74-
true ->
75-
rabbit_log:info(
76-
"\"~s\" is no longer used to expand plugins.~n"
77-
"RabbitMQ still manages this directory "
78-
"but will stop doing so in the future.", [ExpandDir]),
79-
80-
_ = delete_recursively(ExpandDir);
81-
false ->
82-
ok
83-
end;
84-
undefined ->
85-
ok
72+
{ok, ExpandDir} = application:get_env(rabbit, plugins_expand_dir),
73+
74+
%% Eliminate the contents of the destination directory
75+
case delete_recursively(ExpandDir) of
76+
ok -> ok;
77+
{error, E1} -> throw({error, {cannot_delete_plugins_expand_dir,
78+
[ExpandDir, E1]}})
8679
end,
8780

8881
{ok, EnabledFile} = application:get_env(rabbit, enabled_plugins_file),
@@ -135,56 +128,10 @@ extract_schema(#plugin{type = dir, location = Location}, SchemaDir) ->
135128

136129
%% @doc Lists the plugins which are currently running.
137130
active() ->
138-
LoadedPluginNames = maybe_keep_required_deps(false, loaded_plugin_names()),
131+
{ok, ExpandDir} = application:get_env(rabbit, plugins_expand_dir),
132+
InstalledPlugins = plugin_names(list(ExpandDir)),
139133
[App || {App, _, _} <- rabbit_misc:which_applications(),
140-
lists:member(App, LoadedPluginNames)].
141-
142-
loaded_plugin_names() ->
143-
{ok, PluginsDir} = application:get_env(rabbit, plugins_dir),
144-
PluginsDirComponents = filename:split(PluginsDir),
145-
loaded_plugin_names(code:get_path(), PluginsDirComponents, []).
146-
147-
loaded_plugin_names([Path | OtherPaths], PluginsDirComponents, PluginNames) ->
148-
case lists:sublist(filename:split(Path), length(PluginsDirComponents)) of
149-
PluginsDirComponents ->
150-
case build_plugin_name_from_code_path(Path) of
151-
undefined ->
152-
loaded_plugin_names(
153-
OtherPaths, PluginsDirComponents, PluginNames);
154-
PluginName ->
155-
loaded_plugin_names(
156-
OtherPaths, PluginsDirComponents,
157-
[list_to_atom(PluginName) | PluginNames])
158-
end;
159-
_ ->
160-
loaded_plugin_names(OtherPaths, PluginsDirComponents, PluginNames)
161-
end;
162-
loaded_plugin_names([], _, PluginNames) ->
163-
PluginNames.
164-
165-
build_plugin_name_from_code_path(Path) ->
166-
AppPath = case filelib:is_dir(Path) of
167-
true ->
168-
case filelib:wildcard(filename:join(Path, "*.app")) of
169-
[AP | _] -> AP;
170-
[] -> undefined
171-
end;
172-
false ->
173-
EZ = filename:dirname(filename:dirname(Path)),
174-
case filelib:is_regular(EZ) of
175-
true ->
176-
case find_app_path_in_ez(EZ) of
177-
{ok, AP} -> AP;
178-
_ -> undefined
179-
end;
180-
_ ->
181-
undefined
182-
end
183-
end,
184-
case AppPath of
185-
undefined -> undefined;
186-
_ -> filename:basename(AppPath, ".app")
187-
end.
134+
lists:member(App, InstalledPlugins)].
188135

189136
%% @doc Get the list of plugins which are ready to be enabled.
190137
list(PluginsPath) ->
@@ -274,19 +221,25 @@ running_plugins() ->
274221
%%----------------------------------------------------------------------------
275222

276223
prepare_plugins(Enabled) ->
277-
AllPlugins = installed_plugins(),
224+
{ok, PluginsDistDir} = application:get_env(rabbit, plugins_dir),
225+
{ok, ExpandDir} = application:get_env(rabbit, plugins_expand_dir),
226+
227+
AllPlugins = list(PluginsDistDir),
278228
Wanted = dependencies(false, Enabled, AllPlugins),
279229
WantedPlugins = lookup_plugins(Wanted, AllPlugins),
280230
{ValidPlugins, Problems} = validate_plugins(WantedPlugins),
281231
maybe_warn_about_invalid_plugins(Problems),
232+
case filelib:ensure_dir(ExpandDir ++ "/") of
233+
ok -> ok;
234+
{error, E2} -> throw({error, {cannot_create_plugins_expand_dir,
235+
[ExpandDir, E2]}})
236+
end,
237+
[prepare_plugin(Plugin, ExpandDir) || Plugin <- ValidPlugins],
282238

283-
[prepare_dir_plugin(ValidPlugin) || ValidPlugin <- ValidPlugins],
239+
[prepare_dir_plugin(PluginAppDescPath) ||
240+
PluginAppDescPath <- filelib:wildcard(ExpandDir ++ "/*/ebin/*.app")],
284241
Wanted.
285242

286-
installed_plugins() ->
287-
{ok, PluginsDistDir} = application:get_env(rabbit, plugins_dir),
288-
list(PluginsDistDir).
289-
290243
maybe_warn_about_invalid_plugins([]) ->
291244
ok;
292245
maybe_warn_about_invalid_plugins(InvalidPlugins) ->
@@ -399,60 +352,40 @@ is_version_supported(Version, ExpectedVersions) ->
399352
end.
400353

401354
clean_plugins(Plugins) ->
402-
[clean_plugin(Plugin) || Plugin <- Plugins].
355+
{ok, ExpandDir} = application:get_env(rabbit, plugins_expand_dir),
356+
[clean_plugin(Plugin, ExpandDir) || Plugin <- Plugins].
403357

404-
clean_plugin(Plugin) ->
358+
clean_plugin(Plugin, ExpandDir) ->
405359
{ok, Mods} = application:get_key(Plugin, modules),
406-
PluginEbinDir = code:lib_dir(Plugin, ebin),
407-
408360
application:unload(Plugin),
409361
[begin
410362
code:soft_purge(Mod),
411363
code:delete(Mod),
412364
false = code:is_loaded(Mod)
413365
end || Mod <- Mods],
414-
415-
code:del_path(PluginEbinDir).
416-
417-
plugin_ebin_dir(#plugin{type = ez, location = Location}) ->
418-
case find_app_path_in_ez(Location) of
419-
{ok, AppPath} ->
420-
filename:join(Location, filename:dirname(AppPath));
421-
{error, Reason} ->
422-
{error, Reason}
423-
end;
424-
plugin_ebin_dir(#plugin{type = dir, location = Location}) ->
425-
filename:join(Location, "ebin").
426-
427-
prepare_dir_plugin(#plugin{name = Name} = Plugin) ->
428-
PluginEbinDir = case plugin_ebin_dir(Plugin) of
429-
{error, Reason} ->
430-
throw({plugin_ebin_dir_not_found, Name, Reason});
431-
Dir ->
432-
Dir
433-
end,
434-
case code:add_patha(PluginEbinDir) of
435-
true ->
436-
case filelib:wildcard(PluginEbinDir++ "/*.beam") of
437-
[] ->
366+
delete_recursively(rabbit_misc:format("~s/~s", [ExpandDir, Plugin])).
367+
368+
prepare_dir_plugin(PluginAppDescPath) ->
369+
PluginEbinDir = filename:dirname(PluginAppDescPath),
370+
Plugin = filename:basename(PluginAppDescPath, ".app"),
371+
code:add_patha(PluginEbinDir),
372+
case filelib:wildcard(PluginEbinDir++ "/*.beam") of
373+
[] ->
374+
ok;
375+
[BeamPath | _] ->
376+
Module = list_to_atom(filename:basename(BeamPath, ".beam")),
377+
case code:ensure_loaded(Module) of
378+
{module, _} ->
438379
ok;
439-
[BeamPath | _] ->
440-
Module = list_to_atom(filename:basename(BeamPath, ".beam")),
441-
case code:ensure_loaded(Module) of
442-
{module, _} ->
443-
ok;
444-
{error, badfile} ->
445-
rabbit_log:error("Failed to enable plugin \"~s\": "
446-
"it may have been built with an "
447-
"incompatible (more recent?) "
448-
"version of Erlang~n", [Name]),
449-
throw({plugin_built_with_incompatible_erlang, Name});
450-
Error ->
451-
throw({plugin_module_unloadable, Name, Error})
452-
end
453-
end;
454-
{error, bad_directory} ->
455-
throw({plugin_ebin_path_incorrect, Name, PluginEbinDir})
380+
{error, badfile} ->
381+
rabbit_log:error("Failed to enable plugin \"~s\": "
382+
"it may have been built with an "
383+
"incompatible (more recent?) "
384+
"version of Erlang~n", [Plugin]),
385+
throw({plugin_built_with_incompatible_erlang, Plugin});
386+
Error ->
387+
throw({plugin_module_unloadable, Plugin, Error})
388+
end
456389
end.
457390

458391
%%----------------------------------------------------------------------------
@@ -463,6 +396,12 @@ delete_recursively(Fn) ->
463396
{error, {Path, E}} -> {error, {cannot_delete, Path, E}}
464397
end.
465398

399+
prepare_plugin(#plugin{type = ez, location = Location}, ExpandDir) ->
400+
zip:unzip(Location, [{cwd, ExpandDir}]);
401+
prepare_plugin(#plugin{type = dir, name = Name, location = Location},
402+
ExpandDir) ->
403+
rabbit_file:recursive_copy(Location, filename:join([ExpandDir, Name])).
404+
466405
plugin_info({ez, EZ}) ->
467406
case read_app_file(EZ) of
468407
{application, Name, Props} -> mkplugin(Name, Props, ez, EZ);
@@ -489,29 +428,21 @@ mkplugin(Name, Props, Type, Location) ->
489428
broker_version_requirements = BrokerVersions,
490429
dependency_version_requirements = DepsVersions}.
491430

492-
find_app_path_in_ez(EZ) ->
431+
read_app_file(EZ) ->
493432
case zip:list_dir(EZ) of
494433
{ok, [_|ZippedFiles]} ->
495434
case find_app_files(ZippedFiles) of
496435
[AppPath|_] ->
497-
{ok, AppPath};
436+
{ok, [{AppPath, AppFile}]} =
437+
zip:extract(EZ, [{file_list, [AppPath]}, memory]),
438+
parse_binary(AppFile);
498439
[] ->
499440
{error, no_app_file}
500441
end;
501442
{error, Reason} ->
502443
{error, {invalid_ez, Reason}}
503444
end.
504445

505-
read_app_file(EZ) ->
506-
case find_app_path_in_ez(EZ) of
507-
{ok, AppPath} ->
508-
{ok, [{AppPath, AppFile}]} =
509-
zip:extract(EZ, [{file_list, [AppPath]}, memory]),
510-
parse_binary(AppFile);
511-
{error, Reason} ->
512-
{error, Reason}
513-
end.
514-
515446
find_app_files(ZippedFiles) ->
516447
{ok, RE} = re:compile("^.*/ebin/.*.app$"),
517448
[Path || {zip_file, Path, _, _, _, _} <- ZippedFiles,

0 commit comments

Comments
 (0)