aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2005-04-26 23:11:16 +0000
committerAlexey Shchepin <alexey@process-one.net>2005-04-26 23:11:16 +0000
commitb6956566313c98de98d4f32d8903c21d067169e6 (patch)
treeac2828a91ec97b6a62ff98799600934210ee3868
parent* contrib/extract_translations/: A tool for extracting of (diff)
* src/ejabberd_ctl.erl: Better spelling, now prints full file
paths, fixed checking of mnesia:install_fallback result, now "dump" command dumps only persistent tables SVN Revision: 331
-rw-r--r--ChangeLog4
-rw-r--r--src/ejabberd_ctl.erl97
2 files changed, 70 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index b7bfdb5d4..d337265bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2005-04-27 Alexey Shchepin <alexey@sevcom.net>
+ * src/ejabberd_ctl.erl: Better spelling, now prints full file
+ paths, fixed checking of mnesia:install_fallback result, now
+ "dump" command dumps only persistent tables
+
* contrib/extract_translations/: A tool for extracting of
translation strings from ejabberd code (thanks to Sergei Golovan)
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl
index 32f78aeb9..4d9d35135 100644
--- a/src/ejabberd_ctl.erl
+++ b/src/ejabberd_ctl.erl
@@ -9,7 +9,7 @@
-module(ejabberd_ctl).
-author('alexey@sevcom.net').
--export([start/0]).
+-export([start/0, dump_to_textfile/1]).
-define(STATUS_SUCCESS, 0).
-define(STATUS_ERROR, 1).
@@ -75,15 +75,15 @@ process(Node, ["register", User, Server, Password]) ->
{atomic, ok} ->
?STATUS_SUCCESS;
{atomic, exists} ->
- io:format("User ~p already registered on node ~p~n",
+ io:format("User ~p already registered at node ~p~n",
[User ++ "@" ++ Server, Node]),
?STATUS_ERROR;
{error, Reason} ->
- io:format("Can't register user ~p on node ~p: ~p~n",
+ io:format("Can't register user ~p at node ~p: ~p~n",
[User ++ "@" ++ Server, Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't register user ~p on node ~p: ~p~n",
+ io:format("Can't register user ~p at node ~p: ~p~n",
[User ++ "@" ++ Server, Node, Reason]),
?STATUS_BADRPC
end;
@@ -91,11 +91,11 @@ process(Node, ["register", User, Server, Password]) ->
process(Node, ["unregister", User, Server]) ->
case rpc:call(Node, ejabberd_auth, remove_user, [User, Server]) of
{error, Reason} ->
- io:format("Can't unregister user ~p on node ~p: ~p~n",
+ io:format("Can't unregister user ~p at node ~p: ~p~n",
[User ++ "@" ++ Server, Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't unregister user ~p on node ~p: ~p~n",
+ io:format("Can't unregister user ~p at node ~p: ~p~n",
[User ++ "@" ++ Server, Node, Reason]),
?STATUS_BADRPC;
_ ->
@@ -107,40 +107,40 @@ process(Node, ["backup", Path]) ->
ok ->
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't store backup in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't store backup in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't store backup in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't store backup in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_BADRPC
end;
process(Node, ["dump", Path]) ->
- case rpc:call(Node, mnesia, dump_to_textfile, [Path]) of
+ case rpc:call(Node, ejabberd_ctl, dump_to_textfile, [Path]) of
ok ->
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't store dump in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't store dump in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't store dump in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't store dump in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_BADRPC
end;
process(Node, ["load", Path]) ->
case rpc:call(Node, mnesia, load_textfile, [Path]) of
- ok ->
+ {atomic, ok} ->
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't load dump in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't load dump in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't load dump in ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't load dump in ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_BADRPC
end;
@@ -150,26 +150,26 @@ process(Node, ["restore", Path]) ->
{atomic, _} ->
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't restore backup from ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't restore backup from ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't restore backup from ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't restore backup from ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_BADRPC
end;
process(Node, ["install-fallback", Path]) ->
case rpc:call(Node, mnesia, install_fallback, [Path]) of
- {atomic, ok} ->
+ ok ->
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't install fallback from ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't install fallback from ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't install fallback from ~p on node ~p: ~p~n",
- [Path, Node, Reason]),
+ io:format("Can't install fallback from ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
?STATUS_BADRPC
end;
@@ -182,11 +182,11 @@ process(Node, ["registered-users"]) ->
io:format("~s", [FUsers]),
?STATUS_SUCCESS;
{error, Reason} ->
- io:format("Can't get list of registered users on node ~p: ~p~n",
+ io:format("Can't get list of registered users at node ~p: ~p~n",
[Node, Reason]),
?STATUS_ERROR;
{badrpc, Reason} ->
- io:format("Can't get list of registered users on node ~p: ~p~n",
+ io:format("Can't get list of registered users at node ~p: ~p~n",
[Node, Reason]),
?STATUS_BADRPC
end;
@@ -229,3 +229,38 @@ print_usage() ->
"Example:~n"
" ejabberdctl ejabberd@host restart~n"
).
+
+dump_to_textfile(File) ->
+ dump_to_textfile(mnesia:system_info(is_running), file:open(File, write)).
+dump_to_textfile(yes, {ok, F}) ->
+ Tabs1 = lists:delete(schema, mnesia:system_info(local_tables)),
+ Tabs = lists:filter(
+ fun(T) ->
+ case mnesia:table_info(T, storage_type) of
+ disc_copies -> true;
+ disc_only_copies -> true;
+ _ -> false
+ end
+ end, Tabs1),
+ Defs = lists:map(
+ fun(T) -> {T, [{record_name, mnesia:table_info(T, record_name)},
+ {attributes, mnesia:table_info(T, attributes)}]}
+ end,
+ Tabs),
+ io:format(F, "~p.~n", [{tables, Defs}]),
+ lists:foreach(fun(T) -> dump_tab(F, T) end, Tabs),
+ file:close(F);
+dump_to_textfile(_, {ok, F}) ->
+ file:close(F),
+ {error, mnesia_not_running};
+dump_to_textfile(_, {error, Reason}) ->
+ {error, Reason}.
+
+
+dump_tab(F, T) ->
+ W = mnesia:table_info(T, wild_pattern),
+ {atomic,All} = mnesia:transaction(
+ fun() -> mnesia:match_object(T, W, read) end),
+ lists:foreach(
+ fun(Term) -> io:format(F,"~p.~n", [setelement(1, Term, T)]) end, All).
+