Support static_modules in mod_caps, ping, privacy, private, roster, stats and time

This commit is contained in:
Badlop 2011-07-15 02:50:04 +02:00
parent 12d6f3364b
commit ff8bd0c2ec
7 changed files with 58 additions and 42 deletions

View File

@ -92,11 +92,13 @@ start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME), Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
start(Host, Opts) -> start(Host, Opts) when is_list(Host) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME), start(list_to_binary(Host), Opts);
start(HostB, Opts) ->
Proc = gen_mod:get_module_proc(HostB, ?PROCNAME),
ChildSpec = ChildSpec =
{Proc, {Proc,
{?MODULE, start_link, [Host, Opts]}, {?MODULE, start_link, [HostB, Opts]},
transient, transient,
1000, 1000,
worker, worker,
@ -284,7 +286,7 @@ c2s_broadcast_recipients(Acc, _, _, _, _) ->
%%==================================================================== %%====================================================================
%% gen_server callbacks %% gen_server callbacks
%%==================================================================== %%====================================================================
init([Host, Opts]) -> init([HostB, Opts]) ->
case catch mnesia:table_info(caps_features, storage_type) of case catch mnesia:table_info(caps_features, storage_type) of
{'EXIT', _} -> {'EXIT', _} ->
ok; ok;
@ -301,7 +303,6 @@ init([Host, Opts]) ->
MaxSize = gen_mod:get_opt(cache_size, Opts, 1000), MaxSize = gen_mod:get_opt(cache_size, Opts, 1000),
LifeTime = gen_mod:get_opt(cache_life_time, Opts, timer:hours(24) div 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}]), cache_tab:new(caps_features, [{max_size, MaxSize}, {life_time, LifeTime}]),
HostB = list_to_binary(Host),
ejabberd_hooks:add(c2s_presence_in, HostB, ejabberd_hooks:add(c2s_presence_in, HostB,
?MODULE, c2s_presence_in, 75), ?MODULE, c2s_presence_in, 75),
ejabberd_hooks:add(c2s_broadcast_recipients, HostB, ejabberd_hooks:add(c2s_broadcast_recipients, HostB,
@ -320,7 +321,7 @@ init([Host, Opts]) ->
?MODULE, disco_identity, 75), ?MODULE, disco_identity, 75),
ejabberd_hooks:add(disco_info, HostB, ejabberd_hooks:add(disco_info, HostB,
?MODULE, disco_info, 75), ?MODULE, disco_info, 75),
{ok, #state{host = Host}}. {ok, #state{host = HostB}}.
handle_call(stop, _From, State) -> handle_call(stop, _From, State) ->
{stop, normal, ok, State}; {stop, normal, ok, State};
@ -334,7 +335,7 @@ handle_info(_Info, State) ->
{noreply, State}. {noreply, State}.
terminate(_Reason, State) -> terminate(_Reason, State) ->
HostB = list_to_binary(State#state.host), HostB = State#state.host,
ejabberd_hooks:delete(c2s_presence_in, HostB, ejabberd_hooks:delete(c2s_presence_in, HostB,
?MODULE, c2s_presence_in, 75), ?MODULE, c2s_presence_in, 75),
ejabberd_hooks:delete(c2s_broadcast_recipients, HostB, ejabberd_hooks:delete(c2s_broadcast_recipients, HostB,

View File

@ -52,7 +52,7 @@
%% Hook callbacks %% Hook callbacks
-export([iq_ping/3, user_online/3, user_offline/3, user_send/3]). -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, send_pings = ?DEFAULT_SEND_PINGS,
ping_interval = ?DEFAULT_PING_INTERVAL, ping_interval = ?DEFAULT_PING_INTERVAL,
timeout_action = none, timeout_action = none,
@ -66,16 +66,18 @@ start_link(Host, Opts) ->
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
start_ping(Host, JID) -> 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}). gen_server:cast(Proc, {start_ping, JID}).
stop_ping(Host, 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_server:cast(Proc, {stop_ping, JID}).
%%==================================================================== %%====================================================================
%% gen_mod callbacks %% gen_mod callbacks
%%==================================================================== %%====================================================================
start(Host, Opts) when is_list(Host) ->
start(list_to_binary(Host), Opts);
start(Host, Opts) -> start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE), Proc = gen_mod:get_module_proc(Host, ?MODULE),
PingSpec = {Proc, {?MODULE, start_link, [Host, Opts]}, PingSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
@ -90,8 +92,7 @@ stop(Host) ->
%%==================================================================== %%====================================================================
%% gen_server callbacks %% gen_server callbacks
%%==================================================================== %%====================================================================
init([Host, Opts]) -> init([HostB, Opts]) ->
HostB = list_to_binary(Host),
SendPings = gen_mod:get_opt(send_pings, Opts, ?DEFAULT_SEND_PINGS), SendPings = gen_mod:get_opt(send_pings, Opts, ?DEFAULT_SEND_PINGS),
PingInterval = gen_mod:get_opt(ping_interval, Opts, ?DEFAULT_PING_INTERVAL), PingInterval = gen_mod:get_opt(ping_interval, Opts, ?DEFAULT_PING_INTERVAL),
TimeoutAction = gen_mod:get_opt(timeout_action, Opts, none), TimeoutAction = gen_mod:get_opt(timeout_action, Opts, none),
@ -112,14 +113,13 @@ init([Host, Opts]) ->
_ -> _ ->
ok ok
end, end,
{ok, #state{host = Host, {ok, #state{host = HostB,
send_pings = SendPings, send_pings = SendPings,
ping_interval = PingInterval, ping_interval = PingInterval,
timeout_action = TimeoutAction, timeout_action = TimeoutAction,
timers = ?DICT:new()}}. timers = ?DICT:new()}}.
terminate(_Reason, #state{host = Host}) -> terminate(_Reason, #state{host = HostB}) ->
HostB = list_to_binary(Host),
ejabberd_hooks:delete(sm_remove_connection_hook, HostB, ejabberd_hooks:delete(sm_remove_connection_hook, HostB,
?MODULE, user_offline, 100), ?MODULE, user_offline, 100),
ejabberd_hooks:delete(sm_register_connection_hook, HostB, ejabberd_hooks:delete(sm_register_connection_hook, HostB,
@ -143,7 +143,8 @@ handle_cast({stop_ping, JID}, State) ->
{noreply, State#state{timers = Timers}}; {noreply, State#state{timers = Timers}};
handle_cast({iq_pong, JID, timeout}, State) -> handle_cast({iq_pong, JID, timeout}, State) ->
Timers = del_timer(JID, State#state.timers), 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 case State#state.timeout_action of
kill -> kill ->
case ejabberd_sm:get_session_pid(JID) of case ejabberd_sm:get_session_pid(JID) of
@ -171,7 +172,7 @@ handle_info({timeout, _TRef, {ping, JID}}, State) ->
F = fun(Response) -> F = fun(Response) ->
gen_server:cast(Pid, {iq_pong, JID, Response}) gen_server:cast(Pid, {iq_pong, JID, Response})
end, end,
From = exmpp_jid:make(State#state.host), From = exmpp_jid:make(exmpp_jid:domain(JID)),
ejabberd_local:route_iq(From, JID, IQ, F), ejabberd_local:route_iq(From, JID, IQ, F),
Timers = add_timer(JID, State#state.ping_interval, State#state.timers), Timers = add_timer(JID, State#state.ping_interval, State#state.timers),
{noreply, State#state{timers = Timers}}; {noreply, State#state{timers = Timers}};

View File

@ -118,24 +118,25 @@
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include("mod_privacy.hrl"). -include("mod_privacy.hrl").
start(Host, Opts) -> 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), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
Backend = gen_mod:get_opt(backend, Opts, mnesia), Backend = gen_mod:get_opt(backend, Opts, mnesia),
gen_storage:create_table(Backend, HostB, privacy_list, gen_storage:create_table(Backend, HostB, privacy_list,
[{disc_copies, [node()]}, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{type, bag}, {type, bag},
{attributes, record_info(fields, privacy_list)}, {attributes, record_info(fields, privacy_list)},
{types, [{user_host, {text, text}}]}]), {types, [{user_host, {text, text}}]}]),
gen_storage:create_table(Backend, HostB, privacy_default_list, gen_storage:create_table(Backend, HostB, privacy_default_list,
[{disc_copies, [node()]}, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{attributes, record_info(fields, privacy_default_list)}, {attributes, record_info(fields, privacy_default_list)},
{types, [{user_host, {text, text}}]}]), {types, [{user_host, {text, text}}]}]),
gen_storage:create_table(Backend, HostB, privacy_list_data, gen_storage:create_table(Backend, HostB, privacy_list_data,
[{disc_copies, [node()]}, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{type, bag}, {type, bag},
{attributes, record_info(fields, privacy_list_data)}, {attributes, record_info(fields, privacy_list_data)},
{types, [{user_host, {text, text}}, {types, [{user_host, {text, text}},
@ -149,7 +150,7 @@ start(Host, Opts) ->
{match_presence_in, atom}, {match_presence_in, atom},
{match_presence_out, 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, name),
gen_storage:add_table_index(HostB, privacy_list_data, name), gen_storage:add_table_index(HostB, privacy_list_data, name),
ejabberd_hooks:add(privacy_iq_get, HostB, ejabberd_hooks:add(privacy_iq_get, HostB,
@ -807,10 +808,12 @@ updated_list(_,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
update_tables(Host, mnesia) -> update_tables(global, Storage) ->
HostB = list_to_binary(Host), [update_tables(HostB, Storage) || HostB <- ejabberd_hosts:get_hosts(ejabberd)];
update_tables(HostB, mnesia) ->
gen_storage_migration:migrate_mnesia( gen_storage_migration:migrate_mnesia(
Host, privacy_default_list, HostB, privacy_default_list,
[{privacy, [us, default, lists], [{privacy, [us, default, lists],
fun({privacy, {U, S}, Default, Lists}) -> fun({privacy, {U, S}, Default, Lists}) ->
US = {list_to_binary(U), list_to_binary(S)}, US = {list_to_binary(U), list_to_binary(S)},

View File

@ -69,16 +69,17 @@
%% TODO: usns instead of user_host_ns requires no migration %% TODO: usns instead of user_host_ns requires no migration
-record(private_storage, {user_host_ns, xml}). -record(private_storage, {user_host_ns, xml}).
start(Host, Opts) -> 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), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
Backend = gen_mod:get_opt(backend, Opts, mnesia), Backend = gen_mod:get_opt(backend, Opts, mnesia),
gen_storage:create_table(Backend, HostB, private_storage, gen_storage:create_table(Backend, HostB, private_storage,
[{disc_only_copies, [node()]}, [{disc_only_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{attributes, record_info(fields, private_storage)}, {attributes, record_info(fields, private_storage)},
{types, [{user_host_ns, {binary, binary, atom}}, {xml, xmlel}]}]), {types, [{user_host_ns, {binary, binary, atom}}, {xml, xmlel}]}]),
update_table(Host, Backend), update_table(HostB, Backend),
ejabberd_hooks:add(remove_user, HostB, ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50), ?MODULE, remove_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE, 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) -> update_table(Host, mnesia) ->
gen_storage_migration:migrate_mnesia( gen_storage_migration:migrate_mnesia(
Host, private_storage, Host, private_storage,

View File

@ -134,26 +134,27 @@
%% Opts = list() %% Opts = list()
start(Host, Opts) when is_list(Host) -> 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), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
Backend = gen_mod:get_opt(backend, Opts, mnesia), Backend = gen_mod:get_opt(backend, Opts, mnesia),
gen_storage:create_table(Backend, HostB, gen_storage:create_table(Backend, HostB,
rosteritem, [{disc_copies, [node()]}, rosteritem, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{attributes, record_info(fields, rosteritem)}, {attributes, record_info(fields, rosteritem)},
{types, [{user_host_jid, {text, text, ljid}}, {types, [{user_host_jid, {text, text, ljid}},
{subscription, atom}, {subscription, atom},
{ask, atom}]}]), {ask, atom}]}]),
gen_storage:create_table(Backend, HostB, gen_storage:create_table(Backend, HostB,
rostergroup, [{disc_copies, [node()]}, rostergroup, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{type, bag}, {type, bag},
{attributes, record_info(fields, rostergroup)}, {attributes, record_info(fields, rostergroup)},
{types, [{user_host_jid, {text, text, ljid}}]}]), {types, [{user_host_jid, {text, text, ljid}}]}]),
mnesia:create_table(roster_version, [{disc_copies, [node()]}, mnesia:create_table(roster_version, [{disc_copies, [node()]},
{attributes, record_info(fields, roster_version)}]), {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, us),
mnesia:add_table_index(roster_version, us), mnesia:add_table_index(roster_version, us),
ejabberd_hooks:add(roster_get, HostB, 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. %% Only supports migration from ejabberd 1.1.2 or higher.
update_table(Host, mnesia) -> update_table(global, Storage) ->
HostB = list_to_binary(Host), [update_table(HostB, Storage) || HostB <- ejabberd_hosts:get_hosts(ejabberd)];
update_table(HostB, mnesia) ->
gen_storage_migration:migrate_mnesia( gen_storage_migration:migrate_mnesia(
Host, rosteritem, HostB, rosteritem,
[{roster, [usj, us, jid, name, subscription, ask, groups, askmessage, xs], [{roster, [usj, us, jid, name, subscription, ask, groups, askmessage, xs],
fun({roster, USJ, _, _, Name, Subscription, Ask, Groups, AskMessage, _Xs}) -> fun({roster, USJ, _, _, Name, Subscription, Ask, Groups, AskMessage, _Xs}) ->
%% Convert "" to undefined in JIDs and string() to binary(). %% Convert "" to undefined in JIDs and string() to binary().

View File

@ -35,9 +35,11 @@
-include_lib("exmpp/include/exmpp.hrl"). -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), 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). ?MODULE, process_local_iq, IQDisc).
stop(Host) -> stop(Host) ->

View File

@ -39,12 +39,14 @@
-include("ejabberd.hrl"). -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), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
%% TODO: Remove the next two lines once XEP-0090 is Obsolete %% 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), ?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). ?MODULE, process_local_iq, IQDisc).
stop(Host) -> stop(Host) ->