summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-11-08 17:55:05 +0000
committerSimon MacMullen <simon@rabbitmq.com>2010-11-08 17:55:05 +0000
commit6e4c387dfb98f80fffd5cb86b5577ac21fb3f595 (patch)
tree7ee64af3a133a88353cc99818b07a79ef6d7da2f
parente50c638f7ea1907ed73687c307584eb5b93d0062 (diff)
downloadrabbitmq-server-6e4c387dfb98f80fffd5cb86b5577ac21fb3f595.tar.gz
Add a mechanism to remove plugins from the registry. The intent being that people might want to disable PLAIN and enforce MY_COOL_MECHANISM, but PLAIN is not an .ez file so you can't just delete it. This also lets you disable built-in exchange types if you *really* want to.
-rw-r--r--src/rabbit.erl6
-rw-r--r--src/rabbit_registry.erl25
2 files changed, 31 insertions, 0 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 04c23b5a..70fa4785 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -128,6 +128,12 @@
{requires, kernel_ready},
{enables, core_initialized}]}).
+-rabbit_boot_step({check_disabled_plugins,
+ [{description, "disabled plugins check"},
+ {mfa, {rabbit_registry, remove_disabled, []}},
+ {requires, kernel_ready},
+ {enables, core_initialized}]}).
+
-rabbit_boot_step({core_initialized,
[{description, "core initialized"},
{requires, kernel_ready}]}).
diff --git a/src/rabbit_registry.erl b/src/rabbit_registry.erl
index 8d13f4e1..697c99c8 100644
--- a/src/rabbit_registry.erl
+++ b/src/rabbit_registry.erl
@@ -39,6 +39,7 @@
code_change/3]).
-export([register/3, binary_to_type/1, lookup_module/2, lookup_all/1]).
+-export([remove_disabled/0]).
-define(SERVER, ?MODULE).
-define(ETS_NAME, ?MODULE).
@@ -52,6 +53,7 @@
-spec(lookup_module/2 ::
(atom(), atom()) -> rabbit_types:ok_or_error2(atom(), 'not_found')).
-spec(lookup_all/1 :: (atom()) -> [atom()]).
+-spec(remove_disabled/0 :: () -> 'ok').
-endif.
@@ -86,6 +88,9 @@ lookup_module(Class, T) when is_atom(T) ->
lookup_all(Class) ->
[{K, V} || [K, V] <- ets:match(?ETS_NAME, {{Class, '$1'}, '$2'})].
+remove_disabled() ->
+ gen_server:call(?SERVER, remove_disabled).
+
%%---------------------------------------------------------------------------
internal_binary_to_type(TypeBin) when is_binary(TypeBin) ->
@@ -113,6 +118,21 @@ sanity_check_module(ClassModule, Module) ->
class_module(exchange) -> rabbit_exchange_type;
class_module(auth_mechanism) -> rabbit_auth_mechanism.
+internal_remove_disabled() ->
+ Classes = lists:usort(lists:flatten(
+ ets:match(?ETS_NAME, {{'$1', '_'}, '_'}))),
+ [internal_remove_disabled(Class) || Class <- Classes],
+ ok.
+
+internal_remove_disabled(Class) ->
+ case application:get_env(list_to_atom(
+ atom_to_list(Class) ++ "_plugins_disable")) of
+ undefined ->
+ ok;
+ {ok, List} ->
+ [true = ets:delete(?ETS_NAME, {Class, Key}) || Key <- List]
+ end.
+
%%---------------------------------------------------------------------------
init([]) ->
@@ -122,6 +142,11 @@ init([]) ->
handle_call({register, Class, TypeName, ModuleName}, _From, State) ->
ok = internal_register(Class, TypeName, ModuleName),
{reply, ok, State};
+
+handle_call(remove_disabled, _From, State) ->
+ ok = internal_remove_disabled(),
+ {reply, ok, State};
+
handle_call(Request, _From, State) ->
{stop, {unhandled_call, Request}, State}.