diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2010-11-08 17:55:05 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2010-11-08 17:55:05 +0000 |
commit | 6e4c387dfb98f80fffd5cb86b5577ac21fb3f595 (patch) | |
tree | 7ee64af3a133a88353cc99818b07a79ef6d7da2f | |
parent | e50c638f7ea1907ed73687c307584eb5b93d0062 (diff) | |
download | rabbitmq-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.erl | 6 | ||||
-rw-r--r-- | src/rabbit_registry.erl | 25 |
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}. |