Skip to content

Commit 72f7c8e

Browse files
committed
Revert "Do not expand plugins anymore"
This broke the management plugin: Cowboy assumes direct file access to resources in the `priv` directory. This reverts commits: 7069f3b 76a8c66 2044cb1 bc64ac1 d616cc9 [#118562759]
1 parent d616cc9 commit 72f7c8e

File tree

8 files changed

+80
-212
lines changed

8 files changed

+80
-212
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
@@ -247,6 +251,7 @@ rmq_check_if_shared_with_mnesia \
247251
RABBITMQ_CONFIG_FILE \
248252
RABBITMQ_LOG_BASE \
249253
RABBITMQ_PID_FILE \
254+
RABBITMQ_PLUGINS_EXPAND_DIR \
250255
RABBITMQ_ENABLED_PLUGINS_FILE \
251256
RABBITMQ_PLUGINS_DIR \
252257
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
@@ -218,6 +218,7 @@ start_rabbitmq_server() {
218218
-rabbit lager_handler "$RABBIT_LAGER_HANDLER" \
219219
-rabbit enabled_plugins_file "\"$RABBITMQ_ENABLED_PLUGINS_FILE\"" \
220220
-rabbit plugins_dir "\"$RABBITMQ_PLUGINS_DIR\"" \
221+
-rabbit plugins_expand_dir "\"$RABBITMQ_PLUGINS_EXPAND_DIR\"" \
221222
-os_mon start_cpu_sup false \
222223
-os_mon start_disksup false \
223224
-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 & 132 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,61 +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, PluginsPath} = application:get_env(rabbit, plugins_dir),
144-
PluginsDirs = split_path(PluginsPath),
145-
lists:flatmap(
146-
fun(PluginsDir) ->
147-
PluginsDirComponents = filename:split(PluginsDir),
148-
loaded_plugin_names(code:get_path(), PluginsDirComponents, [])
149-
end,
150-
PluginsDirs).
151-
152-
loaded_plugin_names([Path | OtherPaths], PluginsDirComponents, PluginNames) ->
153-
case lists:sublist(filename:split(Path), length(PluginsDirComponents)) of
154-
PluginsDirComponents ->
155-
case build_plugin_name_from_code_path(Path) of
156-
undefined ->
157-
loaded_plugin_names(
158-
OtherPaths, PluginsDirComponents, PluginNames);
159-
PluginName ->
160-
loaded_plugin_names(
161-
OtherPaths, PluginsDirComponents,
162-
[list_to_atom(PluginName) | PluginNames])
163-
end;
164-
_ ->
165-
loaded_plugin_names(OtherPaths, PluginsDirComponents, PluginNames)
166-
end;
167-
loaded_plugin_names([], _, PluginNames) ->
168-
PluginNames.
169-
170-
build_plugin_name_from_code_path(Path) ->
171-
AppPath = case filelib:is_dir(Path) of
172-
true ->
173-
case filelib:wildcard(filename:join(Path, "*.app")) of
174-
[AP | _] -> AP;
175-
[] -> undefined
176-
end;
177-
false ->
178-
EZ = filename:dirname(filename:dirname(Path)),
179-
case filelib:is_regular(EZ) of
180-
true ->
181-
case find_app_path_in_ez(EZ) of
182-
{ok, AP} -> AP;
183-
_ -> undefined
184-
end;
185-
_ ->
186-
undefined
187-
end
188-
end,
189-
case AppPath of
190-
undefined -> undefined;
191-
_ -> filename:basename(AppPath, ".app")
192-
end.
134+
lists:member(App, InstalledPlugins)].
193135

194136
%% @doc Get the list of plugins which are ready to be enabled.
195137
list(PluginsPath) ->
@@ -279,19 +221,25 @@ running_plugins() ->
279221
%%----------------------------------------------------------------------------
280222

281223
prepare_plugins(Enabled) ->
282-
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),
283228
Wanted = dependencies(false, Enabled, AllPlugins),
284229
WantedPlugins = lookup_plugins(Wanted, AllPlugins),
285230
{ValidPlugins, Problems} = validate_plugins(WantedPlugins),
286231
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],
287238

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

291-
installed_plugins() ->
292-
{ok, PluginsDistDir} = application:get_env(rabbit, plugins_dir),
293-
list(PluginsDistDir).
294-
295243
maybe_warn_about_invalid_plugins([]) ->
296244
ok;
297245
maybe_warn_about_invalid_plugins(InvalidPlugins) ->
@@ -404,60 +352,40 @@ is_version_supported(Version, ExpectedVersions) ->
404352
end.
405353

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

409-
clean_plugin(Plugin) ->
358+
clean_plugin(Plugin, ExpandDir) ->
410359
{ok, Mods} = application:get_key(Plugin, modules),
411-
PluginEbinDir = code:lib_dir(Plugin, ebin),
412-
413360
application:unload(Plugin),
414361
[begin
415362
code:soft_purge(Mod),
416363
code:delete(Mod),
417364
false = code:is_loaded(Mod)
418365
end || Mod <- Mods],
419-
420-
code:del_path(PluginEbinDir).
421-
422-
plugin_ebin_dir(#plugin{type = ez, location = Location}) ->
423-
case find_app_path_in_ez(Location) of
424-
{ok, AppPath} ->
425-
filename:join(Location, filename:dirname(AppPath));
426-
{error, Reason} ->
427-
{error, Reason}
428-
end;
429-
plugin_ebin_dir(#plugin{type = dir, location = Location}) ->
430-
filename:join(Location, "ebin").
431-
432-
prepare_dir_plugin(#plugin{name = Name} = Plugin) ->
433-
PluginEbinDir = case plugin_ebin_dir(Plugin) of
434-
{error, Reason} ->
435-
throw({plugin_ebin_dir_not_found, Name, Reason});
436-
Dir ->
437-
Dir
438-
end,
439-
case code:add_patha(PluginEbinDir) of
440-
true ->
441-
case filelib:wildcard(PluginEbinDir++ "/*.beam") of
442-
[] ->
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, _} ->
443379
ok;
444-
[BeamPath | _] ->
445-
Module = list_to_atom(filename:basename(BeamPath, ".beam")),
446-
case code:ensure_loaded(Module) of
447-
{module, _} ->
448-
ok;
449-
{error, badfile} ->
450-
rabbit_log:error("Failed to enable plugin \"~s\": "
451-
"it may have been built with an "
452-
"incompatible (more recent?) "
453-
"version of Erlang~n", [Name]),
454-
throw({plugin_built_with_incompatible_erlang, Name});
455-
Error ->
456-
throw({plugin_module_unloadable, Name, Error})
457-
end
458-
end;
459-
{error, bad_directory} ->
460-
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
461389
end.
462390

463391
%%----------------------------------------------------------------------------
@@ -468,6 +396,12 @@ delete_recursively(Fn) ->
468396
{error, {Path, E}} -> {error, {cannot_delete, Path, E}}
469397
end.
470398

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+
471405
plugin_info({ez, EZ}) ->
472406
case read_app_file(EZ) of
473407
{application, Name, Props} -> mkplugin(Name, Props, ez, EZ);
@@ -494,29 +428,21 @@ mkplugin(Name, Props, Type, Location) ->
494428
broker_version_requirements = BrokerVersions,
495429
dependency_version_requirements = DepsVersions}.
496430

497-
find_app_path_in_ez(EZ) ->
431+
read_app_file(EZ) ->
498432
case zip:list_dir(EZ) of
499433
{ok, [_|ZippedFiles]} ->
500434
case find_app_files(ZippedFiles) of
501435
[AppPath|_] ->
502-
{ok, AppPath};
436+
{ok, [{AppPath, AppFile}]} =
437+
zip:extract(EZ, [{file_list, [AppPath]}, memory]),
438+
parse_binary(AppFile);
503439
[] ->
504440
{error, no_app_file}
505441
end;
506442
{error, Reason} ->
507443
{error, {invalid_ez, Reason}}
508444
end.
509445

510-
read_app_file(EZ) ->
511-
case find_app_path_in_ez(EZ) of
512-
{ok, AppPath} ->
513-
{ok, [{AppPath, AppFile}]} =
514-
zip:extract(EZ, [{file_list, [AppPath]}, memory]),
515-
parse_binary(AppFile);
516-
{error, Reason} ->
517-
{error, Reason}
518-
end.
519-
520446
find_app_files(ZippedFiles) ->
521447
{ok, RE} = re:compile("^.*/ebin/.*.app$"),
522448
[Path || {zip_file, Path, _, _, _, _} <- ZippedFiles,

0 commit comments

Comments
 (0)