24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-02 21:17:12 +02:00

Fix support for static_modules in mod_adhoc, announce, disco, last, offline

This commit is contained in:
Badlop 2011-07-11 19:46:26 +02:00
parent 0d7e69a65e
commit 0b1f3ca148
10 changed files with 87 additions and 52 deletions

View File

@ -611,6 +611,12 @@
%% %%
{static_modules, {static_modules,
[ [
%% {mod_adhoc, []},
%% {mod_announce, []},
%% {mod_disco, []},
%% {mod_echo, [{prefix, "echo"}]},
%% {mod_last, []},
%% {mod_offline, []}
]}. ]}.

View File

@ -40,6 +40,7 @@
loaded_modules_with_opts/1, loaded_modules_with_opts/1,
get_hosts/2, get_hosts/2,
get_module_proc/2, get_module_proc/2,
get_module_proc_existing/2,
expand_host_name/3, expand_host_name/3,
is_loaded/2]). is_loaded/2]).
@ -194,7 +195,13 @@ get_module_opt(Host, Module, Opt, Default) ->
OptsList = ets:lookup(ejabberd_modules, {Module, Host}), OptsList = ets:lookup(ejabberd_modules, {Module, Host}),
case OptsList of case OptsList of
[] -> [] ->
Default; OptsList2 = ets:lookup(ejabberd_modules, {Module, global}),
case OptsList2 of
[] ->
Default;
[#ejabberd_module{opts = Opts} | _] ->
get_opt(Opt, Opts, Default)
end;
[#ejabberd_module{opts = Opts} | _] -> [#ejabberd_module{opts = Opts} | _] ->
get_opt(Opt, Opts, Default) get_opt(Opt, Opts, Default)
end. end.
@ -260,6 +267,15 @@ get_hosts(Opts, Prefix) ->
Hosts Hosts
end. end.
get_module_proc_existing(Host, Base) ->
Proc = get_module_proc(Host, Base),
%% If the process doesn't exist for Host, it may exist for global
case {whereis(Proc), Host == global} of
{undefined, false} -> get_module_proc(global, Base);
{undefined, true} -> not_existing;
{_, _} -> Proc
end.
get_module_proc(Host, Base) when is_binary(Host) -> get_module_proc(Host, Base) when is_binary(Host) ->
get_module_proc(binary_to_list(Host), Base); get_module_proc(binary_to_list(Host), Base);
get_module_proc(global, Base) -> get_module_proc(global, Base) ->
@ -269,8 +285,11 @@ get_module_proc(Host, {frontend, Base}) ->
get_module_proc(Host, Base) -> get_module_proc(Host, Base) ->
list_to_atom(atom_to_list(Base) ++ "_" ++ Host). list_to_atom(atom_to_list(Base) ++ "_" ++ Host).
%% @spec(Host::string() | global, Module::atom()) -> true | false
%% @doc Check if the module is loaded in this host (or global), or not.
is_loaded(Host, Module) -> is_loaded(Host, Module) ->
ets:member(ejabberd_modules, {Module, Host}). ets:member(ejabberd_modules, {Module, Host})
orelse ets:member(ejabberd_modules, {Module, global}).
expand_host_name(Host, Opts, DefaultPrefix) -> expand_host_name(Host, Opts, DefaultPrefix) ->
case Host of case Host of

View File

@ -118,6 +118,9 @@ table_info(Host, Tab, InfoKey) ->
-spec create_table(atom(), storage_host(), storage_table(), list()) -> -spec create_table(atom(), storage_host(), storage_table(), list()) ->
tuple(). tuple().
create_table(Backend, global, Tab, Def) ->
[create_table(Backend, list_to_binary(Host), Tab, Def) || Host <- ejabberd_hosts:get_hosts(ejabberd)];
create_table(mnesia, Host, Tab, Def) -> create_table(mnesia, Host, Tab, Def) ->
MDef = filter_mnesia_tabdef(Def), MDef = filter_mnesia_tabdef(Def),
define_table(mnesia, Host, Tab, #mnesia_def{table = Tab, define_table(mnesia, Host, Tab, #mnesia_def{table = Tab,

View File

@ -32,8 +32,9 @@ migrate_mnesia(Host, Table, Migrations) ->
end end
end, DifferentTableName). end, DifferentTableName).
migrate_mnesia1(Host, Table, {OldTable, OldAttributes, MigrateFun}) -> migrate_mnesia1(Host, Table, {OldTable, OldAttributes, MigrateFun}) when is_list(Host) ->
HostB = list_to_binary(Host), migrate_mnesia1(list_to_binary(Host), Table, {OldTable, OldAttributes, MigrateFun});
migrate_mnesia1(HostB, Table, {OldTable, OldAttributes, MigrateFun}) ->
case (catch mnesia:table_info(OldTable, attributes)) of case (catch mnesia:table_info(OldTable, attributes)) of
OldAttributes -> OldAttributes ->
if if

View File

@ -47,8 +47,9 @@
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include("adhoc.hrl"). -include("adhoc.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),
gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_ADHOC, gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_ADHOC,

View File

@ -57,8 +57,9 @@
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]). -define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
tokenize(Node) -> string:tokens(Node, "/#"). tokenize(Node) -> string:tokens(Node, "/#").
start(Host, _Opts) -> start(Host, Opts) when is_list(Host) ->
HostB = list_to_binary(Host), start(list_to_binary(Host), Opts);
start(HostB, _Opts) ->
mnesia:create_table(motd, [{disc_copies, [node()]}, mnesia:create_table(motd, [{disc_copies, [node()]},
{attributes, record_info(fields, motd)}]), {attributes, record_info(fields, motd)}]),
mnesia:create_table(motd_users, [{disc_copies, [node()]}, mnesia:create_table(motd_users, [{disc_copies, [node()]},
@ -73,7 +74,7 @@ start(Host, _Opts) ->
ejabberd_hooks:add(adhoc_local_commands, HostB, ?MODULE, announce_commands, 50), ejabberd_hooks:add(adhoc_local_commands, HostB, ?MODULE, announce_commands, 50),
ejabberd_hooks:add(user_available_hook, HostB, ejabberd_hooks:add(user_available_hook, HostB,
?MODULE, send_motd, 50), ?MODULE, send_motd, 50),
register(gen_mod:get_module_proc(Host, ?PROCNAME), register(gen_mod:get_module_proc(HostB, ?PROCNAME),
proc_lib:spawn(?MODULE, init, [])). proc_lib:spawn(?MODULE, init, [])).
init() -> init() ->
@ -135,7 +136,7 @@ announce(From, To, Packet) ->
case {exmpp_jid:prep_node(To), exmpp_jid:prep_resource(To)} of case {exmpp_jid:prep_node(To), exmpp_jid:prep_resource(To)} of
{undefined, Res} -> {undefined, Res} ->
Name = Packet#xmlel.name, Name = Packet#xmlel.name,
Proc = gen_mod:get_module_proc(exmpp_jid:prep_domain_as_list(To), ?PROCNAME), Proc = gen_mod:get_module_proc_existing(exmpp_jid:prep_domain_as_list(To), ?PROCNAME),
case {Res, Name} of case {Res, Name} of
{<<"announce/all">>, 'message'} -> {<<"announce/all">>, 'message'} ->
Proc ! {announce_all, From, To, Packet}, Proc ! {announce_all, From, To, Packet},
@ -541,7 +542,7 @@ handle_adhoc_form(From, To,
node = Node, node = Node,
sessionid = SessionID}, sessionid = SessionID},
Fields) -> Fields) ->
LServer = exmpp_jid:prep_domain_as_list(To), LServerB = exmpp_jid:prep_domain(To),
Confirm = case lists:keysearch("confirm", 1, Fields) of Confirm = case lists:keysearch("confirm", 1, Fields) of
{value, {"confirm", ["true"]}} -> {value, {"confirm", ["true"]}} ->
true; true;
@ -582,7 +583,7 @@ handle_adhoc_form(From, To,
[] []
end}, end},
Proc = gen_mod:get_module_proc(LServer, ?PROCNAME), Proc = gen_mod:get_module_proc_existing(LServerB, ?PROCNAME),
case {Node, Body} of case {Node, Body} of
{?NS_ADMIN_s ++ "#delete-motd", _} -> {?NS_ADMIN_s ++ "#delete-motd", _} ->
if Confirm -> if Confirm ->

View File

@ -53,8 +53,9 @@
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include_lib("stdlib/include/ms_transform.hrl"). -include_lib("stdlib/include/ms_transform.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) ->
ejabberd_local:refresh_iq_handlers(), ejabberd_local:refresh_iq_handlers(),
@ -75,7 +76,7 @@ start(Host, Opts) ->
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]), catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
ExtraDomains = gen_mod:get_opt(extra_domains, Opts, []), ExtraDomains = gen_mod:get_opt(extra_domains, Opts, []),
lists:foreach(fun(Domain) -> register_extra_domain(list_to_binary(Host), Domain) end, lists:foreach(fun(Domain) -> register_extra_domain(HostB, Domain) end,
ExtraDomains), ExtraDomains),
catch ets:new(disco_sm_features, [named_table, ordered_set, public]), catch ets:new(disco_sm_features, [named_table, ordered_set, public]),
catch ets:new(disco_sm_nodes, [named_table, ordered_set, public]), catch ets:new(disco_sm_nodes, [named_table, ordered_set, public]),
@ -106,7 +107,7 @@ stop(Host) ->
ok. ok.
register_feature(HostB, Feature) when is_binary(HostB) -> register_feature(HostB, Feature) ->
catch ets:new(disco_features, [named_table, ordered_set, public]), catch ets:new(disco_features, [named_table, ordered_set, public]),
ets:insert(disco_features, {{Feature, HostB}}). ets:insert(disco_features, {{Feature, HostB}}).
@ -114,11 +115,11 @@ unregister_feature(HostB, Feature) ->
catch ets:new(disco_features, [named_table, ordered_set, public]), catch ets:new(disco_features, [named_table, ordered_set, public]),
ets:delete(disco_features, {Feature, HostB}). ets:delete(disco_features, {Feature, HostB}).
register_extra_domain(HostB, Domain) when is_binary(HostB) -> register_extra_domain(HostB, Domain) ->
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]), catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
ets:insert(disco_extra_domains, {{Domain, HostB}}). ets:insert(disco_extra_domains, {{Domain, HostB}}).
unregister_extra_domain(HostB, Domain) when is_binary(HostB) -> unregister_extra_domain(HostB, Domain) ->
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]), catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
ets:delete(disco_extra_domains, {Domain, HostB}). ets:delete(disco_extra_domains, {Domain, HostB}).
@ -242,14 +243,14 @@ get_local_services(Acc, _From, To, <<>>, _Lang) ->
empty -> [] empty -> []
end, end,
Host = exmpp_jid:prep_domain_as_list(To), Host = exmpp_jid:prep_domain_as_list(To),
NHost = ejabberd:normalize_host(Host), NHostB = list_to_binary(ejabberd:normalize_host(Host)),
{result, {result,
lists:usort( lists:usort(
lists:map(fun domain_to_xml/1, lists:map(fun domain_to_xml/1,
get_vh_services(Host) ++ get_vh_services(Host) ++
ets:select(disco_extra_domains, ets:select(disco_extra_domains,
ets:fun2ms(fun ({{Service, H}}) ets:fun2ms(fun ({{Service, H}})
when H =:= NHost; when H =:= NHostB;
H =:= global -> H =:= global ->
Service Service
end))) end)))

View File

@ -77,17 +77,18 @@
-record(last_activity, {user_host, timestamp, status}). -record(last_activity, {user_host, timestamp, status}).
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, last_activity, gen_storage:create_table(Backend, HostB, last_activity,
[{disc_copies, [node()]}, [{disc_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{attributes, record_info(fields, last_activity)}, {attributes, record_info(fields, last_activity)},
{types, [{user_host, {text, text}}, {types, [{user_host, {text, text}},
{timestamp, bigint}]}]), {timestamp, bigint}]}]),
update_table(Host, Backend), update_table(HostB, Backend),
gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY, gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY,
?MODULE, process_local_iq, IQDisc), ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY, gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY,
@ -97,8 +98,9 @@ start(Host, Opts) ->
ejabberd_hooks:add(unset_presence_hook, HostB, ejabberd_hooks:add(unset_presence_hook, HostB,
?MODULE, on_presence_update, 50). ?MODULE, on_presence_update, 50).
stop(Host) -> stop(Host) when is_list(Host) ->
HostB = list_to_binary(Host), stop(list_to_binary(Host));
stop(HostB) ->
ejabberd_hooks:delete(remove_user, HostB, ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50), ?MODULE, remove_user, 50),
ejabberd_hooks:delete(unset_presence_hook, HostB, ejabberd_hooks:delete(unset_presence_hook, HostB,
@ -252,9 +254,12 @@ remove_user(User, Server) when is_binary(User), is_binary(Server) ->
ok ok
end. end.
update_table(Host, mnesia) -> update_table(global, Storage) ->
[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, last_activity, HostB, last_activity,
[{last_activity, [us, timestamp, status], [{last_activity, [us, timestamp, status],
fun({last_activity, {U, S}, Timestamp, Status}) -> fun({last_activity, {U, S}, Timestamp, Status}) ->
U1 = case U of U1 = case U of
@ -266,14 +271,14 @@ update_table(Host, mnesia) ->
timestamp = Timestamp, timestamp = Timestamp,
status = list_to_binary(Status)} status = list_to_binary(Status)}
end}]); end}]);
update_table(Host, odbc) -> update_table(HostB, odbc) ->
gen_storage_migration:migrate_odbc( gen_storage_migration:migrate_odbc(
Host, [last_activity], HostB, [last_activity],
[{"last", ["username", "seconds", "state"], [{"last", ["username", "seconds", "state"],
fun(_, Username, STimeStamp, Status) -> fun(_, Username, STimeStamp, Status) ->
case catch list_to_integer(STimeStamp) of case catch list_to_integer(STimeStamp) of
TimeStamp when is_integer(TimeStamp) -> TimeStamp when is_integer(TimeStamp) ->
[#last_activity{user_host = {Username, Host}, [#last_activity{user_host = {Username, HostB},
timestamp = TimeStamp, timestamp = TimeStamp,
status = Status}]; status = Status}];
_ -> _ ->

View File

@ -112,12 +112,14 @@
%% default value for the maximum number of user messages %% default value for the maximum number of user messages
-define(MAX_USER_MESSAGES, infinity). -define(MAX_USER_MESSAGES, infinity).
start(Host, Opts) -> start(Host, Opts) when is_list(Host) ->
HostB = list_to_binary(Host), start(list_to_binary(Host), Opts);
start(HostB, Opts) ->
% Host = binary_to_list(HostB),
Backend = gen_mod:get_opt(backend, Opts, mnesia), Backend = gen_mod:get_opt(backend, Opts, mnesia),
gen_storage:create_table(Backend, HostB, offline_msg, gen_storage:create_table(Backend, HostB, offline_msg,
[{disc_only_copies, [node()]}, [{disc_only_copies, [node()]},
{odbc_host, Host}, {odbc_host, HostB},
{type, bag}, {type, bag},
{attributes, record_info(fields, offline_msg)}, {attributes, record_info(fields, offline_msg)},
{types, [{user_host, {text, text}}, {types, [{user_host, {text, text}},
@ -125,7 +127,7 @@ start(Host, Opts) ->
{expire, bigint}, {expire, bigint},
{from, jid}, {from, jid},
{to, jid}]}]), {to, jid}]}]),
update_table(Host, Backend), update_table(HostB, Backend),
ejabberd_hooks:add(offline_message_hook, HostB, ejabberd_hooks:add(offline_message_hook, HostB,
?MODULE, store_packet, 50), ?MODULE, store_packet, 50),
ejabberd_hooks:add(resend_offline_messages_hook, HostB, ejabberd_hooks:add(resend_offline_messages_hook, HostB,
@ -145,7 +147,7 @@ start(Host, Opts) ->
ejabberd_hooks:add(webadmin_user_parse_query, HostB, ejabberd_hooks:add(webadmin_user_parse_query, HostB,
?MODULE, webadmin_user_parse_query, 50), ?MODULE, webadmin_user_parse_query, 50),
AccessMaxOfflineMsgs = gen_mod:get_opt(access_max_user_messages, Opts, max_user_offline_messages), AccessMaxOfflineMsgs = gen_mod:get_opt(access_max_user_messages, Opts, max_user_offline_messages),
register(gen_mod:get_module_proc(Host, ?PROCNAME), register(gen_mod:get_module_proc(HostB, ?PROCNAME),
spawn(?MODULE, loop, [AccessMaxOfflineMsgs])). spawn(?MODULE, loop, [AccessMaxOfflineMsgs])).
stanza_to_store(Stanza) -> stanza_to_store(Stanza) ->
@ -258,7 +260,7 @@ store_packet(From, To, Packet) ->
LServer = exmpp_jid:prep_domain(To), LServer = exmpp_jid:prep_domain(To),
TimeStamp = make_timestamp(), TimeStamp = make_timestamp(),
Expire = find_x_expire(TimeStamp, Packet#xmlel.children), Expire = find_x_expire(TimeStamp, Packet#xmlel.children),
gen_mod:get_module_proc(LServer, ?PROCNAME) ! gen_mod:get_module_proc_existing(LServer, ?PROCNAME) !
#offline_msg{user_host = {LUser, LServer}, #offline_msg{user_host = {LUser, LServer},
timestamp = TimeStamp, timestamp = TimeStamp,
expire = Expire, expire = Expire,
@ -464,6 +466,9 @@ remove_user(User, Server) when is_binary(User), is_binary(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, offline_msg, Host, offline_msg,
@ -720,8 +725,8 @@ get_messages_subset2(Max, Length, MsgsAll) ->
MsgsFirstN ++ [IntermediateMsg] ++ MsgsLastN. MsgsFirstN ++ [IntermediateMsg] ++ MsgsLastN.
webadmin_user(Acc, User, Server, Lang) -> webadmin_user(Acc, User, Server, Lang) ->
LUser = exmpp_stringprep:nodeprep(User), LUser = list_to_binary(exmpp_stringprep:nodeprep(User)),
LServer = exmpp_stringprep:nameprep(Server), LServer = list_to_binary(exmpp_stringprep:nameprep(Server)),
QueueLen = get_queue_length(LUser, LServer), QueueLen = get_queue_length(LUser, LServer),
FQueueLen = [?AC("queue/", integer_to_list(QueueLen))], FQueueLen = [?AC("queue/", integer_to_list(QueueLen))],
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")]. Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")].

View File

@ -1658,8 +1658,7 @@ list_users_in_diapason(Host, Diap, Lang, URLFunc) ->
Sub = lists:sublist(SUsers, N1, N2 - N1 + 1), Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
[list_given_users(Host, Sub, "../../", Lang, URLFunc)]. [list_given_users(Host, Sub, "../../", Lang, URLFunc)].
list_given_users(Host, Users, Prefix, Lang, URLFunc) -> list_given_users(_Host, Users, Prefix, Lang, URLFunc) ->
ModOffline = get_offlinemsg_module(Host),
?XE('table', ?XE('table',
[?XE('thead', [?XE('thead',
[?XE('tr', [?XE('tr',
@ -1672,7 +1671,7 @@ list_given_users(Host, Users, Prefix, Lang, URLFunc) ->
ServerB = list_to_binary(Server), ServerB = list_to_binary(Server),
UserB = list_to_binary(User), UserB = list_to_binary(User),
US = {UserB, ServerB}, US = {UserB, ServerB},
QueueLenStr = get_offlinemsg_length(ModOffline, User, Server), QueueLenStr = get_offlinemsg_length(User, Server),
FQueueLen = [?AC(URLFunc({users_queue, Prefix, FQueueLen = [?AC(URLFunc({users_queue, Prefix,
User, Server}), User, Server}),
QueueLenStr)], QueueLenStr)],
@ -1707,16 +1706,10 @@ list_given_users(Host, Users, Prefix, Lang, URLFunc) ->
end, Users) end, Users)
)]). )]).
get_offlinemsg_length(ModOffline, User, Server) -> get_offlinemsg_length(User, Server) ->
case ModOffline of case gen_mod:is_loaded(Server, mod_offline) of
none -> "disabled"; false -> "disabled";
_ -> pretty_string_int(ModOffline:get_queue_length(list_to_binary(User), list_to_binary(Server))) true -> pretty_string_int(mod_offline:get_queue_length(list_to_binary(User), list_to_binary(Server)))
end.
get_offlinemsg_module(Server) ->
case [mod_offline] -- gen_mod:loaded_modules(Server) of
[mod_offline] -> none;
[] -> mod_offline
end. end.
us_to_list({User, Server}) -> us_to_list({User, Server}) ->