]> granicus.if.org Git - ejabberd/commitdiff
Add gen_mod:is_loaded_elsewhere/2
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Fri, 24 Feb 2017 13:31:39 +0000 (16:31 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Fri, 24 Feb 2017 13:31:39 +0000 (16:31 +0300)
src/gen_mod.erl
src/mod_fail2ban.erl
src/mod_proxy65.erl

index 63bfa314b6344215a9536f21c60a16175528af74..ef000635d72e00b2c596bf054d7fbb4524c08f81 100644 (file)
@@ -37,7 +37,7 @@
         get_opt/4, get_opt_host/3, opt_type/1, is_equal_opt/5,
         get_module_opt/4, get_module_opt/5, get_module_opt_host/3,
         loaded_modules/1, loaded_modules_with_opts/1,
-        get_hosts/2, get_module_proc/2, is_loaded/2,
+        get_hosts/2, get_module_proc/2, is_loaded/2, is_loaded_elsewhere/2,
         start_modules/0, start_modules/1, stop_modules/0, stop_modules/1,
         db_mod/2, db_mod/3, ram_db_mod/2, ram_db_mod/3,
         db_type/2, db_type/3, ram_db_type/2, ram_db_type/3]).
@@ -622,6 +622,15 @@ get_module_proc(Host, Base) ->
 is_loaded(Host, Module) ->
     ets:member(ejabberd_modules, {Module, Host}).
 
+-spec is_loaded_elsewhere(binary(), atom()) -> boolean().
+is_loaded_elsewhere(Host, Module) ->
+    ets:select_count(
+      ejabberd_modules,
+      ets:fun2ms(
+       fun(#ejabberd_module{module_host = {Mod, H}}) ->
+               (Mod == Module) and (H /= Host)
+       end)) /= 0.
+
 -spec config_reloaded() -> ok.
 config_reloaded() ->
     lists:foreach(
index b6f889fc9bfade2eb69a390869e81184336d158e..4d5e5fdb4b5ec057fb2cb529d97188226c44be97 100644 (file)
@@ -150,7 +150,7 @@ handle_info(_Info, State) ->
 terminate(_Reason, #state{host = Host}) ->
     ejabberd_hooks:delete(c2s_auth_result, Host, ?MODULE, c2s_auth_result, 100),
     ejabberd_hooks:delete(c2s_stream_started, Host, ?MODULE, c2s_stream_started, 100),
-    case is_loaded_at_other_hosts(Host) of
+    case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
        true ->
            ok;
        false ->
@@ -184,14 +184,6 @@ is_whitelisted(Host, Addr) ->
                                    none),
     acl:match_rule(Host, Access, Addr) == allow.
 
-is_loaded_at_other_hosts(Host) ->
-    lists:any(
-      fun(VHost) when VHost == Host ->
-             false;
-        (VHost) ->
-             gen_mod:is_loaded(VHost, ?MODULE)
-      end, ?MYHOSTS).
-
 seconds_to_now(Secs) ->
     {Secs div 1000000, Secs rem 1000000, 0}.
 
index d7793115e12aee9af71f3031873b4b564253a852..53f7083402a7bb2a9accf021d66b1452ddc47090 100644 (file)
@@ -63,7 +63,12 @@ start(Host, Opts) ->
     end.
 
 stop(Host) ->
-    mod_proxy65_service:delete_listener(Host),
+    case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
+       false ->
+           mod_proxy65_service:delete_listener(Host);
+       true ->
+           ok
+    end,
     Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
     supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
     supervisor:delete_child(ejabberd_gen_mod_sup, Proc).