@@ -67,22 +67,15 @@ ensure(FileJustChanged0) ->
67
67
{error , {enabled_plugins_mismatch , FileJustChanged , OurFile }}
68
68
end .
69
69
70
+ % % @doc Prepares the file system and installs all enabled plugins.
70
71
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 ]}})
86
79
end ,
87
80
88
81
{ok , EnabledFile } = application :get_env (rabbit , enabled_plugins_file ),
@@ -135,56 +128,10 @@ extract_schema(#plugin{type = dir, location = Location}, SchemaDir) ->
135
128
136
129
% % @doc Lists the plugins which are currently running.
137
130
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 )),
139
133
[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 )].
188
135
189
136
% % @doc Get the list of plugins which are ready to be enabled.
190
137
list (PluginsPath ) ->
@@ -274,19 +221,25 @@ running_plugins() ->
274
221
% %----------------------------------------------------------------------------
275
222
276
223
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 ),
278
228
Wanted = dependencies (false , Enabled , AllPlugins ),
279
229
WantedPlugins = lookup_plugins (Wanted , AllPlugins ),
280
230
{ValidPlugins , Problems } = validate_plugins (WantedPlugins ),
281
231
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 ],
282
238
283
- [prepare_dir_plugin (ValidPlugin ) || ValidPlugin <- ValidPlugins ],
239
+ [prepare_dir_plugin (PluginAppDescPath ) ||
240
+ PluginAppDescPath <- filelib :wildcard (ExpandDir ++ " /*/ebin/*.app" )],
284
241
Wanted .
285
242
286
- installed_plugins () ->
287
- {ok , PluginsDistDir } = application :get_env (rabbit , plugins_dir ),
288
- list (PluginsDistDir ).
289
-
290
243
maybe_warn_about_invalid_plugins ([]) ->
291
244
ok ;
292
245
maybe_warn_about_invalid_plugins (InvalidPlugins ) ->
@@ -399,60 +352,40 @@ is_version_supported(Version, ExpectedVersions) ->
399
352
end .
400
353
401
354
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 ].
403
357
404
- clean_plugin (Plugin ) ->
358
+ clean_plugin (Plugin , ExpandDir ) ->
405
359
{ok , Mods } = application :get_key (Plugin , modules ),
406
- PluginEbinDir = code :lib_dir (Plugin , ebin ),
407
-
408
360
application :unload (Plugin ),
409
361
[begin
410
362
code :soft_purge (Mod ),
411
363
code :delete (Mod ),
412
364
false = code :is_loaded (Mod )
413
365
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 , _ } ->
438
379
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
456
389
end .
457
390
458
391
% %----------------------------------------------------------------------------
@@ -463,6 +396,12 @@ delete_recursively(Fn) ->
463
396
{error , {Path , E }} -> {error , {cannot_delete , Path , E }}
464
397
end .
465
398
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
+
466
405
plugin_info ({ez , EZ }) ->
467
406
case read_app_file (EZ ) of
468
407
{application , Name , Props } -> mkplugin (Name , Props , ez , EZ );
@@ -489,29 +428,21 @@ mkplugin(Name, Props, Type, Location) ->
489
428
broker_version_requirements = BrokerVersions ,
490
429
dependency_version_requirements = DepsVersions }.
491
430
492
- find_app_path_in_ez (EZ ) ->
431
+ read_app_file (EZ ) ->
493
432
case zip :list_dir (EZ ) of
494
433
{ok , [_ |ZippedFiles ]} ->
495
434
case find_app_files (ZippedFiles ) of
496
435
[AppPath |_ ] ->
497
- {ok , AppPath };
436
+ {ok , [{AppPath , AppFile }]} =
437
+ zip :extract (EZ , [{file_list , [AppPath ]}, memory ]),
438
+ parse_binary (AppFile );
498
439
[] ->
499
440
{error , no_app_file }
500
441
end ;
501
442
{error , Reason } ->
502
443
{error , {invalid_ez , Reason }}
503
444
end .
504
445
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
-
515
446
find_app_files (ZippedFiles ) ->
516
447
{ok , RE } = re :compile (" ^.*/ebin/.*.app$" ),
517
448
[Path || {zip_file , Path , _ , _ , _ , _ } <- ZippedFiles ,
0 commit comments