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,
%%====================================================================
%% gen_server callbacks
%%====================================================================
-init([Host, Opts]) ->
+init([HostB, Opts]) ->
case catch mnesia:table_info(caps_features, storage_type) of
{'EXIT', _} ->
ok;
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,
?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};
{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,
%% 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,
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]},
%%====================================================================
%% 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),
_ ->
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,
{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
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}};
-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}},
{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,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-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)},
%% 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,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+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,
%% 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,
%% 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().
-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) ->
-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) ->