diff options
Diffstat (limited to 'src/ejabberd_admin.erl')
| -rw-r--r-- | src/ejabberd_admin.erl | 110 |
1 files changed, 108 insertions, 2 deletions
diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 40c8b8dca..294697f51 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -30,6 +30,7 @@ -export([start/0, stop/0, %% Server status/0, reopen_log/0, + stop_migrate/1, migrate/1, stop_kindly/2, send_service_message_all_mucs/2, %% Erlang update_list/0, update/1, @@ -47,7 +48,9 @@ install_fallback_mnesia/1, dump_to_textfile/1, dump_to_textfile/2, mnesia_change_nodename/4, - restore/1 % Still used by some modules + restore/1, % Still used by some modules + moderate_room_history/2, + persist_recent_messages/0 ]). -include("ejabberd.hrl"). @@ -92,6 +95,17 @@ commands() -> module = ?MODULE, function = stop_kindly, args = [{delay, integer}, {announcement, string}], result = {res, rescode}}, + #ejabberd_commands{name = migrate, tags = [server], + desc = "Try to migrate C2S/BOSH/MUC sessions to other nodes", + module = ?MODULE, function = migrate, + args = [{delay, integer}], + result = {res, rescode}}, + #ejabberd_commands{name = stop_migrate, tags = [server], + desc = "Try to migrate C2S/BOSH/MUC sessions to other" + "nodes and then stop", + module = ?MODULE, function = stop_migrate, + args = [{delay, integer}], + result = {res, rescode}}, #ejabberd_commands{name = get_loglevel, tags = [logs, server], desc = "Get the current loglevel", module = ejabberd_loglevel, function = get, @@ -200,9 +214,40 @@ commands() -> #ejabberd_commands{name = install_fallback, tags = [mnesia], desc = "Install the database from a fallback file", module = ?MODULE, function = install_fallback_mnesia, - args = [{file, string}], result = {res, restuple}} + args = [{file, string}], result = {res, restuple}}, + #ejabberd_commands{name = moderate_room_history, tags = [server], + desc = "Clean messages from the short-term MUC storage", + module = ?MODULE, function = moderate_room_history, + args = [{room, string}, {nick, string}], + result = {res, restuple}}, + #ejabberd_commands{name = persist_recent_messages, tags = [server], + desc = "Force recent muc messages to be savd on DB", + module = ?MODULE, function = persist_recent_messages, + args = [], + result = {res, restuple}} ]. +%%% +%%% MUC moderation +%%% +%%% Same room can be replicated into different nodes, +%%% call all of them. +moderate_room_history(Room, Nick) -> + {Res, BadNodes} = rpc:multicall(mod_muc, moderate_room_history, [Room, Nick], 5000), + B = case BadNodes of + [] -> + ""; + _ -> + io_lib:format("Bad nodes: ~p", [BadNodes]) + end, + {ok, io_lib:format("Deleted: ~p ~s", [Res, B])}. + +persist_recent_messages() -> + Saved = [ {Host, mod_muc:persist_recent_messages(Host)} || Host <- ?MYHOSTS], + R = lists:map(fun({Host, {RoomsPersisted, Messages}}) -> + io_lib:format("Host '~s' , ~p messages persisted in ~p rooms\n", [Host, Messages, RoomsPersisted]) + end, Saved), + {ok,io_lib:format("~s", [R])}. %%% %%% Server management @@ -294,6 +339,67 @@ send_service_message_all_mucs(Subject, AnnouncementText) -> ?MYHOSTS). %%% +%%% Migrate w/o stopping +%%% +migrate(DelaySeconds) -> + WaitingDesc = io_lib:format("Starting migration, this will take ~p seconds", + [DelaySeconds]), + Steps = [ + {"Stopping ejabberd port listeners", + ejabberd_listener, stop_listeners, []}, + {WaitingDesc, ejabberd_cluster, shutdown_migrate, + [DelaySeconds * 1000]} + ], + NumberLast = length(Steps), + TimestampStart = calendar:datetime_to_gregorian_seconds({date(), time()}), + lists:foldl( + fun({Desc, Mod, Func, Args}, NumberThis) -> + SecondsDiff = + calendar:datetime_to_gregorian_seconds({date(), time()}) + - TimestampStart, + io:format("[~p/~p ~ps] ~s... ", + [NumberThis, NumberLast, SecondsDiff, Desc]), + Result = apply(Mod, Func, Args), + io:format("~p~n", [Result]), + NumberThis+1 + end, + 1, + Steps), + ok. + +%%% +%%% Migrate and stop +%%% +stop_migrate(DelaySeconds) -> + WaitingDesc = io_lib:format("Starting migration, this will take ~p seconds", + [DelaySeconds]), + Steps = [ + {"Stopping ejabberd port listeners", + ejabberd_listener, stop_listeners, []}, + {WaitingDesc, ejabberd_cluster, shutdown_migrate, + [DelaySeconds * 1000]}, + {"Stopping ejabberd", application, stop, [ejabberd]}, + {"Stopping Mnesia", mnesia, stop, []}, + {"Stopping Erlang node", init, stop, []} + ], + NumberLast = length(Steps), + TimestampStart = calendar:datetime_to_gregorian_seconds({date(), time()}), + lists:foldl( + fun({Desc, Mod, Func, Args}, NumberThis) -> + SecondsDiff = + calendar:datetime_to_gregorian_seconds({date(), time()}) + - TimestampStart, + io:format("[~p/~p ~ps] ~s... ", + [NumberThis, NumberLast, SecondsDiff, Desc]), + Result = apply(Mod, Func, Args), + io:format("~p~n", [Result]), + NumberThis+1 + end, + 1, + Steps), + ok. + +%%% %%% ejabberd_update %%% |
