]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_ctl.erl: Added API for virtual host specific
authorAlexey Shchepin <alexey@process-one.net>
Mon, 20 Feb 2006 04:07:42 +0000 (04:07 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Mon, 20 Feb 2006 04:07:42 +0000 (04:07 +0000)
commands, removed registered-users command
* src/ejabberd_auth.erl: Added processing of registered-users
command
* src/ejabberd_auth_internal.erl: Likewise
* src/ejabberd_auth_ldap.erl: Likewise
* src/ejabberd_auth_odbc.erl: Likewise
* src/ejabberd_app.erl: Added inititalization of ejabberd_ctl
* src/ejabberd_sm.erl: Minor update

SVN Revision: 510

ChangeLog
src/ejabberd_app.erl
src/ejabberd_auth.erl
src/ejabberd_auth_internal.erl
src/ejabberd_auth_ldap.erl
src/ejabberd_auth_odbc.erl
src/ejabberd_ctl.erl
src/ejabberd_sm.erl

index f26f2e0a64c7ef414593d65f66b019f56580a234..8c760f619a08e9734a9166b1c3fc1e331cc1104a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-02-20  Alexey Shchepin  <alexey@sevcom.net>
+
+       * src/ejabberd_ctl.erl: Added API for virtual host specific
+       commands, removed registered-users command
+       * src/ejabberd_auth.erl: Added processing of registered-users
+       command
+       * src/ejabberd_auth_internal.erl: Likewise
+       * src/ejabberd_auth_ldap.erl: Likewise
+       * src/ejabberd_auth_odbc.erl: Likewise
+       * src/ejabberd_app.erl: Added inititalization of ejabberd_ctl
+       * src/ejabberd_sm.erl: Minor update
+
 2006-02-18  Alexey Shchepin  <alexey@sevcom.net>
 
        * src/mod_irc/mod_irc_connection.erl: Added handling for "%", "&"
index 109697470bf2dfffda38439861998a3547a63adb..c1ea274a2f6f916e3944c31a521481f198cf34b5 100644 (file)
@@ -24,6 +24,7 @@ start(normal, _Args) ->
     catch ssl:start(),
     translate:start(),
     acl:start(),
+    ejabberd_ctl:init(),
     gen_mod:start(),
     ejabberd_config:start(),
     Sup = ejabberd_sup:start_link(),
index d89d175631d2abdc1b4694f15c87bec2ee31ce42..045bf2726b053d50b27d2b5073ff20c6208c7b59 100644 (file)
         is_user_exists/2,
         remove_user/2,
         remove_user/3,
-        plain_password_required/1
+        plain_password_required/1,
+        ctl_process_get_registered/3
        ]).
 
 -include("ejabberd.hrl").
+-include("ejabberd_ctl.hrl").
 
 %%%----------------------------------------------------------------------
 %%% API
@@ -77,6 +79,17 @@ remove_user(User, Server) ->
 remove_user(User, Server, Password) ->
     (auth_module(Server)):remove_user(User, Server, Password).
 
+
+ctl_process_get_registered(_Val, Host, ["registered-users"]) ->
+    Users = ejabberd_auth:get_vh_registered_users(Host),
+    NewLine = io_lib:format("~n", []),
+    SUsers = lists:sort(Users),
+    FUsers = lists:map(fun({U, _S}) -> [U, NewLine] end, SUsers),
+    io:format("~s", [FUsers]),
+    {stop, ?STATUS_SUCCESS};
+ctl_process_get_registered(Val, _Host, _Args) ->
+    Val.
+
 %%%----------------------------------------------------------------------
 %%% Internal functions
 %%%----------------------------------------------------------------------
index 1804f3eaaf050014ad3eff9bfd84ccdff66c2c34..62e7654215e8ed344ee1d33de8adefa3e2069eb5 100644 (file)
 %%%----------------------------------------------------------------------
 %%% API
 %%%----------------------------------------------------------------------
-start(_Host) ->
+start(Host) ->
     mnesia:create_table(passwd, [{disc_copies, [node()]},
                                 {attributes, record_info(fields, passwd)}]),
     update_table(),
+    ejabberd_ctl:register_commands(
+      Host,
+      [{"registered-users", "list all registered users"}],
+      ejabberd_auth, ctl_process_get_registered),
     ok.
 
 plain_password_required() ->
index 060b9b44b44e46f6a780f5df98941998ab9100ea..6e454cb80a4bf0e7237b55b1f2d9912233a1de25 100644 (file)
@@ -40,6 +40,10 @@ start(Host) ->
                     LDAPServers, 389, RootDN, Password),
     eldap:start_link(get_eldap_id(Host, ejabberd_bind),
                     LDAPServers, 389, RootDN, Password),
+    ejabberd_ctl:register_commands(
+      Host,
+      [{"registered-users", "list all registered users"}],
+      ejabberd_auth, ctl_process_get_registered),
     ok.
 
 plain_password_required() ->
index a19ffd4e45294885e013d996c37958f993fc0eef..be1c8d4dbfd8b660d447314ab33c4b7905a54b12 100644 (file)
@@ -42,6 +42,10 @@ start(Host) ->
         supervisor,
         [ejabberd_odbc_sup]},
     supervisor:start_child(ejabberd_sup, ChildSpec),
+    ejabberd_ctl:register_commands(
+      Host,
+      [{"registered-users", "list all registered users"}],
+      ejabberd_auth, ctl_process_get_registered),
     ok.
 
 plain_password_required() ->
index b7e9b1f51285a18c94ff96db96270e424596942d..63825e916d6e2b046b03cf2f7f03c47c3916c224 100644 (file)
 -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}) ->
index 2bdfa8faa361fbcfd6c78bbba46b8a59c6f0f1df..46880d013998e88399085fbe6516590c00bdcf2b 100644 (file)
@@ -535,18 +535,18 @@ ctl_process(_Val, ["connected-users"]) ->
     SUSRs = lists:sort(USRs),
     FUSRs = lists:map(fun({U, S, R}) -> [U, $@, S, $/, R, NewLine] end, SUSRs),
     io:format("~s", [FUSRs]),
-    ?STATUS_SUCCESS;
+    {stop, ?STATUS_SUCCESS};
 ctl_process(_Val, ["connected-users-number"]) ->
     N = length(dirty_get_sessions_list()),
     io:format("~p~n", [N]),
-    ?STATUS_SUCCESS;
+    {stop, ?STATUS_SUCCESS};
 ctl_process(_Val, ["user-resources", User, Server]) ->
     Resources =  get_user_resources(User, Server),
     NewLine = io_lib:format("~n", []),
     SResources = lists:sort(Resources),
     FResources = lists:map(fun(R) -> [R, NewLine] end, SResources),
     io:format("~s", [FResources]),
-    ?STATUS_SUCCESS;
+    {stop, ?STATUS_SUCCESS};
 ctl_process(Val, _Args) ->
     Val.