From ff8bd0c2ecd238666c1e90c89a8b44a4956c7d50 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Jul 2011 02:50:04 +0200 Subject: [PATCH] Support static_modules in mod_caps, ping, privacy, private, roster, stats and time --- src/mod_caps.erl | 15 ++++++++------- src/mod_ping.erl | 21 +++++++++++---------- src/mod_privacy.erl | 21 ++++++++++++--------- src/mod_private.erl | 12 ++++++++---- src/mod_roster.erl | 17 ++++++++++------- src/mod_stats.erl | 6 ++++-- src/mod_time.erl | 8 +++++--- 7 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 16b4a69d1..0c811e38e 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -92,11 +92,13 @@ start_link(Host, Opts) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). -start(Host, Opts) -> - Proc = gen_mod:get_module_proc(Host, ?PROCNAME), +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> + Proc = gen_mod:get_module_proc(HostB, ?PROCNAME), ChildSpec = {Proc, - {?MODULE, start_link, [Host, Opts]}, + {?MODULE, start_link, [HostB, Opts]}, transient, 1000, worker, @@ -284,7 +286,7 @@ c2s_broadcast_recipients(Acc, _, _, _, _) -> %%==================================================================== %% gen_server callbacks %%==================================================================== -init([Host, Opts]) -> +init([HostB, Opts]) -> case catch mnesia:table_info(caps_features, storage_type) of {'EXIT', _} -> ok; @@ -301,7 +303,6 @@ init([Host, Opts]) -> MaxSize = gen_mod:get_opt(cache_size, Opts, 1000), LifeTime = gen_mod:get_opt(cache_life_time, Opts, timer:hours(24) div 1000), cache_tab:new(caps_features, [{max_size, MaxSize}, {life_time, LifeTime}]), - HostB = list_to_binary(Host), ejabberd_hooks:add(c2s_presence_in, HostB, ?MODULE, c2s_presence_in, 75), ejabberd_hooks:add(c2s_broadcast_recipients, HostB, @@ -320,7 +321,7 @@ init([Host, Opts]) -> ?MODULE, disco_identity, 75), ejabberd_hooks:add(disco_info, HostB, ?MODULE, disco_info, 75), - {ok, #state{host = Host}}. + {ok, #state{host = HostB}}. handle_call(stop, _From, State) -> {stop, normal, ok, State}; @@ -334,7 +335,7 @@ handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, State) -> - HostB = list_to_binary(State#state.host), + HostB = State#state.host, ejabberd_hooks:delete(c2s_presence_in, HostB, ?MODULE, c2s_presence_in, 75), ejabberd_hooks:delete(c2s_broadcast_recipients, HostB, diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 85f2ed28e..37002848e 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -52,7 +52,7 @@ %% Hook callbacks -export([iq_ping/3, user_online/3, user_offline/3, user_send/3]). --record(state, {host = "", +-record(state, {host, % binary() | global send_pings = ?DEFAULT_SEND_PINGS, ping_interval = ?DEFAULT_PING_INTERVAL, timeout_action = none, @@ -66,16 +66,18 @@ start_link(Host, Opts) -> gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). start_ping(Host, JID) -> - Proc = gen_mod:get_module_proc(Host, ?MODULE), + Proc = gen_mod:get_module_proc_existing(Host, ?MODULE), gen_server:cast(Proc, {start_ping, JID}). stop_ping(Host, JID) -> - Proc = gen_mod:get_module_proc(Host, ?MODULE), + Proc = gen_mod:get_module_proc_existing(Host, ?MODULE), gen_server:cast(Proc, {stop_ping, JID}). %%==================================================================== %% gen_mod callbacks %%==================================================================== +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); start(Host, Opts) -> Proc = gen_mod:get_module_proc(Host, ?MODULE), PingSpec = {Proc, {?MODULE, start_link, [Host, Opts]}, @@ -90,8 +92,7 @@ stop(Host) -> %%==================================================================== %% gen_server callbacks %%==================================================================== -init([Host, Opts]) -> - HostB = list_to_binary(Host), +init([HostB, Opts]) -> SendPings = gen_mod:get_opt(send_pings, Opts, ?DEFAULT_SEND_PINGS), PingInterval = gen_mod:get_opt(ping_interval, Opts, ?DEFAULT_PING_INTERVAL), TimeoutAction = gen_mod:get_opt(timeout_action, Opts, none), @@ -112,14 +113,13 @@ init([Host, Opts]) -> _ -> ok end, - {ok, #state{host = Host, + {ok, #state{host = HostB, send_pings = SendPings, ping_interval = PingInterval, timeout_action = TimeoutAction, timers = ?DICT:new()}}. -terminate(_Reason, #state{host = Host}) -> - HostB = list_to_binary(Host), +terminate(_Reason, #state{host = HostB}) -> ejabberd_hooks:delete(sm_remove_connection_hook, HostB, ?MODULE, user_offline, 100), ejabberd_hooks:delete(sm_register_connection_hook, HostB, @@ -143,7 +143,8 @@ handle_cast({stop_ping, JID}, State) -> {noreply, State#state{timers = Timers}}; handle_cast({iq_pong, JID, timeout}, State) -> Timers = del_timer(JID, State#state.timers), - ejabberd_hooks:run(user_ping_timeout, list_to_binary(State#state.host), [JID]), + Host = exmpp_jid:domain(JID), + ejabberd_hooks:run(user_ping_timeout, Host, [JID]), case State#state.timeout_action of kill -> case ejabberd_sm:get_session_pid(JID) of @@ -171,7 +172,7 @@ handle_info({timeout, _TRef, {ping, JID}}, State) -> F = fun(Response) -> gen_server:cast(Pid, {iq_pong, JID, Response}) end, - From = exmpp_jid:make(State#state.host), + From = exmpp_jid:make(exmpp_jid:domain(JID)), ejabberd_local:route_iq(From, JID, IQ, F), Timers = add_timer(JID, State#state.ping_interval, State#state.timers), {noreply, State#state{timers = Timers}}; diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 168fc8a6d..3b741b4e7 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -118,24 +118,25 @@ -include("ejabberd.hrl"). -include("mod_privacy.hrl"). -start(Host, Opts) -> - HostB = list_to_binary(Host), +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), Backend = gen_mod:get_opt(backend, Opts, mnesia), gen_storage:create_table(Backend, HostB, privacy_list, [{disc_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {type, bag}, {attributes, record_info(fields, privacy_list)}, {types, [{user_host, {text, text}}]}]), gen_storage:create_table(Backend, HostB, privacy_default_list, [{disc_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {attributes, record_info(fields, privacy_default_list)}, {types, [{user_host, {text, text}}]}]), gen_storage:create_table(Backend, HostB, privacy_list_data, [{disc_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {type, bag}, {attributes, record_info(fields, privacy_list_data)}, {types, [{user_host, {text, text}}, @@ -149,7 +150,7 @@ start(Host, Opts) -> {match_presence_in, atom}, {match_presence_out, atom} ]}]), - update_tables(Host, Backend), + update_tables(HostB, Backend), gen_storage:add_table_index(HostB, privacy_list, name), gen_storage:add_table_index(HostB, privacy_list_data, name), ejabberd_hooks:add(privacy_iq_get, HostB, @@ -807,10 +808,12 @@ updated_list(_, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -update_tables(Host, mnesia) -> - HostB = list_to_binary(Host), +update_tables(global, Storage) -> + [update_tables(HostB, Storage) || HostB <- ejabberd_hosts:get_hosts(ejabberd)]; + +update_tables(HostB, mnesia) -> gen_storage_migration:migrate_mnesia( - Host, privacy_default_list, + HostB, privacy_default_list, [{privacy, [us, default, lists], fun({privacy, {U, S}, Default, Lists}) -> US = {list_to_binary(U), list_to_binary(S)}, diff --git a/src/mod_private.erl b/src/mod_private.erl index 1fa7c1f13..96cc72f70 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -69,16 +69,17 @@ %% TODO: usns instead of user_host_ns requires no migration -record(private_storage, {user_host_ns, xml}). -start(Host, Opts) -> - HostB = list_to_binary(Host), +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), Backend = gen_mod:get_opt(backend, Opts, mnesia), gen_storage:create_table(Backend, HostB, private_storage, [{disc_only_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {attributes, record_info(fields, private_storage)}, {types, [{user_host_ns, {binary, binary, atom}}, {xml, xmlel}]}]), - update_table(Host, Backend), + update_table(HostB, Backend), ejabberd_hooks:add(remove_user, HostB, ?MODULE, remove_user, 50), gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE, @@ -218,6 +219,9 @@ remove_user(User, Server) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +update_table(global, Storage) -> + [update_table(HostB, Storage) || HostB <- ejabberd_hosts:get_hosts(ejabberd)]; + update_table(Host, mnesia) -> gen_storage_migration:migrate_mnesia( Host, private_storage, diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 02a6bfc71..7dc9e54fd 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -134,26 +134,27 @@ %% Opts = list() start(Host, Opts) when is_list(Host) -> - HostB = list_to_binary(Host), + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), Backend = gen_mod:get_opt(backend, Opts, mnesia), gen_storage:create_table(Backend, HostB, rosteritem, [{disc_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {attributes, record_info(fields, rosteritem)}, {types, [{user_host_jid, {text, text, ljid}}, {subscription, atom}, {ask, atom}]}]), gen_storage:create_table(Backend, HostB, rostergroup, [{disc_copies, [node()]}, - {odbc_host, Host}, + {odbc_host, HostB}, {type, bag}, {attributes, record_info(fields, rostergroup)}, {types, [{user_host_jid, {text, text, ljid}}]}]), mnesia:create_table(roster_version, [{disc_copies, [node()]}, {attributes, record_info(fields, roster_version)}]), - update_table(Host, Backend), + update_table(HostB, Backend), mnesia:add_table_index(roster, us), mnesia:add_table_index(roster_version, us), ejabberd_hooks:add(roster_get, HostB, @@ -1228,10 +1229,12 @@ get_jid_info(_, User, Server, JID) %% Only supports migration from ejabberd 1.1.2 or higher. -update_table(Host, mnesia) -> - HostB = list_to_binary(Host), +update_table(global, Storage) -> + [update_table(HostB, Storage) || HostB <- ejabberd_hosts:get_hosts(ejabberd)]; + +update_table(HostB, mnesia) -> gen_storage_migration:migrate_mnesia( - Host, rosteritem, + HostB, rosteritem, [{roster, [usj, us, jid, name, subscription, ask, groups, askmessage, xs], fun({roster, USJ, _, _, Name, Subscription, Ask, Groups, AskMessage, _Xs}) -> %% Convert "" to undefined in JIDs and string() to binary(). diff --git a/src/mod_stats.erl b/src/mod_stats.erl index b6a0b311b..d67331912 100644 --- a/src/mod_stats.erl +++ b/src/mod_stats.erl @@ -35,9 +35,11 @@ -include_lib("exmpp/include/exmpp.hrl"). -start(Host, Opts) -> +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), - gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_STATS_s, + gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_STATS_s, ?MODULE, process_local_iq, IQDisc). stop(Host) -> diff --git a/src/mod_time.erl b/src/mod_time.erl index a134177e9..64eaf57d6 100644 --- a/src/mod_time.erl +++ b/src/mod_time.erl @@ -39,12 +39,14 @@ -include("ejabberd.hrl"). -start(Host, Opts) -> +start(Host, Opts) when is_list(Host) -> + start(list_to_binary(Host), Opts); +start(HostB, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), %% TODO: Remove the next two lines once XEP-0090 is Obsolete - gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_TIME_OLD, + gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_TIME_OLD, ?MODULE, process_local_iq90, IQDisc), - gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_TIME, + gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_TIME, ?MODULE, process_local_iq, IQDisc). stop(Host) -> -- 2.50.1