diff options
Diffstat (limited to 'src/ejabberd_ctl.erl')
-rw-r--r-- | src/ejabberd_ctl.erl | 98 |
1 files changed, 73 insertions, 25 deletions
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index b7e9b1f51..63825e916 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -10,9 +10,12 @@ -author('alexey@sevcom.net'). -export([start/0, + init/0, process/1, register_commands/3, - unregister_commands/3]). + register_commands/4, + unregister_commands/3, + unregister_commands/4]). -include("ejabberd_ctl.hrl"). @@ -34,6 +37,10 @@ start() -> halt(?STATUS_USAGE) end. +init() -> + ets:new(ejabberd_ctl_cmds, [named_table, set, public]), + ets:new(ejabberd_ctl_host_cmds, [named_table, set, public]). + process(["status"]) -> {InternalStatus, ProvidedStatus} = init:get_status(), @@ -147,29 +154,28 @@ process(["import-dir", Path]) -> ?STATUS_ERROR end; -process(["registered-users"]) -> - case ejabberd_auth:dirty_get_registered_users() of - Users when is_list(Users) -> - NewLine = io_lib:format("~n", []), - SUsers = lists:sort(Users), - FUsers = lists:map(fun({U, S}) -> [U, $@, S, NewLine] end, SUsers), - io:format("~s", [FUsers]), - ?STATUS_SUCCESS; - {error, Reason} -> - io:format("Can't get list of registered users at node ~p: ~p~n", - [node(), Reason]), - ?STATUS_ERROR - end; - process(["delete-expired-messages"]) -> mod_offline:remove_expired_messages(), ?STATUS_SUCCESS; +process(["vhost", H | Args]) -> + case jlib:nameprep(H) of + false -> + io:format("Bad hostname: ~p~n", [H]), + ?STATUS_ERROR; + Host -> + case ejabberd_hooks:run_fold( + ejabberd_ctl_process, Host, false, [Host, Args]) of + false -> + print_vhost_usage(Host), + ?STATUS_USAGE; + Status -> + Status + end + end; + process(Args) -> - case ejabberd_hooks:run_fold( - ejabberd_ctl_process, - false, - [Args]) of + case ejabberd_hooks:run_fold(ejabberd_ctl_process, false, [Args]) of false -> print_usage(), ?STATUS_USAGE; @@ -179,7 +185,6 @@ process(Args) -> print_usage() -> - catch ets:new(ejabberd_ctl_cmds, [named_table, ordered_set, public]), CmdDescs = [{"status", "get ejabberd status"}, {"stop", "stop ejabberd"}, @@ -194,8 +199,8 @@ print_usage() -> {"load file", "restore a database from a text file"}, {"import-file file", "import user data from jabberd 1.4 spool file"}, {"import-dir dir", "import user data from jabberd 1.4 spool directory"}, - {"registered-users", "list all registered users"}, - {"delete-expired-messages", "delete expired offline messages from database"}] ++ + {"delete-expired-messages", "delete expired offline messages from database"}, + {"vhost host ...", "execute host-specific commands"}] ++ ets:tab2list(ejabberd_ctl_cmds), MaxCmdLen = lists:max(lists:map( @@ -206,7 +211,7 @@ print_usage() -> FmtCmdDescs = lists:map( fun({Cmd, Desc}) -> - [" ", Cmd, string:chars($\s, MaxCmdLen - length(Cmd) + 1), + [" ", Cmd, string:chars($\s, MaxCmdLen - length(Cmd) + 2), Desc, NewLine] end, CmdDescs), io:format( @@ -219,15 +224,49 @@ print_usage() -> " ejabberdctl ejabberd@host restart~n" ). +print_vhost_usage(Host) -> + CmdDescs = + ets:select(ejabberd_ctl_host_cmds, + [{{Host, '$1', '$2'}, [], [{{'$1', '$2'}}]}]), + MaxCmdLen = + if + CmdDescs == [] -> + 0; + true -> + lists:max(lists:map( + fun({Cmd, _Desc}) -> + length(Cmd) + end, CmdDescs)) + end, + NewLine = io_lib:format("~n", []), + FmtCmdDescs = + lists:map( + fun({Cmd, Desc}) -> + [" ", Cmd, string:chars($\s, MaxCmdLen - length(Cmd) + 2), + Desc, NewLine] + end, CmdDescs), + io:format( + "Usage: ejabberdctl node vhost host command~n" + "~n" + "Available commands:~n" + ++ FmtCmdDescs ++ + "~n" + ). + register_commands(CmdDescs, Module, Function) -> - catch ets:new(ejabberd_ctl_cmds, [named_table, ordered_set, public]), ets:insert(ejabberd_ctl_cmds, CmdDescs), ejabberd_hooks:add(ejabberd_ctl_process, Module, Function, 50), ok. +register_commands(Host, CmdDescs, Module, Function) -> + ets:insert(ejabberd_ctl_host_cmds, + [{Host, Cmd, Desc} || {Cmd, Desc} <- CmdDescs]), + ejabberd_hooks:add(ejabberd_ctl_process, Host, + Module, Function, 50), + ok. + unregister_commands(CmdDescs, Module, Function) -> - catch ets:new(ejabberd_ctl_cmds, [named_table, ordered_set, public]), lists:foreach(fun(CmdDesc) -> ets:delete_object(ejabberd_ctl_cmds, CmdDesc) end, CmdDescs), @@ -235,6 +274,15 @@ unregister_commands(CmdDescs, Module, Function) -> Module, Function, 50), ok. +unregister_commands(Host, CmdDescs, Module, Function) -> + lists:foreach(fun({Cmd, Desc}) -> + ets:delete_object(ejabberd_ctl_host_cmds, + {Host, Cmd, Desc}) + end, CmdDescs), + ejabberd_hooks:delete(ejabberd_ctl_process, + Module, Function, 50), + ok. + dump_to_textfile(File) -> dump_to_textfile(mnesia:system_info(is_running), file:open(File, write)). dump_to_textfile(yes, {ok, F}) -> |