aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_admin.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_admin.erl')
-rw-r--r--src/ejabberd_admin.erl110
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
%%%