aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_ctl.erl36
-rw-r--r--src/jd2ejd.erl34
-rw-r--r--src/mod_last.erl10
-rw-r--r--src/mod_last_odbc.erl10
4 files changed, 72 insertions, 18 deletions
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl
index 4d9d35135..216466625 100644
--- a/src/ejabberd_ctl.erl
+++ b/src/ejabberd_ctl.erl
@@ -173,6 +173,34 @@ process(Node, ["install-fallback", Path]) ->
?STATUS_BADRPC
end;
+process(Node, ["import-file", Path]) ->
+ case rpc:call(Node, jd2ejd, import_file, [Path]) of
+ ok ->
+ ?STATUS_SUCCESS;
+ {error, Reason} ->
+ io:format("Can't import jabberd 1.4 spool file ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
+ ?STATUS_ERROR;
+ {badrpc, Reason} ->
+ io:format("Can't import jabberd 1.4 spool file ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
+ ?STATUS_BADRPC
+ end;
+
+process(Node, ["import-dir", Path]) ->
+ case rpc:call(Node, jd2ejd, import_dir, [Path]) of
+ ok ->
+ ?STATUS_SUCCESS;
+ {error, Reason} ->
+ io:format("Can't import jabberd 1.4 spool dir ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
+ ?STATUS_ERROR;
+ {badrpc, Reason} ->
+ io:format("Can't import jabberd 1.4 spool dir ~p at node ~p: ~p~n",
+ [filename:absname(Path), Node, Reason]),
+ ?STATUS_BADRPC
+ end;
+
process(Node, ["registered-users"]) ->
case rpc:call(Node, ejabberd_auth, dirty_get_registered_users, []) of
Users when is_list(Users) ->
@@ -217,12 +245,14 @@ print_usage() ->
" restart\t\t\trestart ejabberd~n"
" reopen-log\t\t\treopen log file~n"
" register user server password\tregister a user~n"
- " unregister user server\t\tunregister a user~n"
- " backup file\t\t\tstore a database backup in file~n"
+ " unregister user server\tunregister a user~n"
+ " backup file\t\t\tstore a database backup to file~n"
" restore file\t\t\trestore a database backup from file~n"
" install-fallback file\t\tinstall a database fallback from file~n"
- " dump file\t\t\tdump a database in a text file~n"
+ " dump file\t\t\tdump a database to a text file~n"
" load file\t\t\trestore a database from a text file~n"
+ " import-file file\t\timport user data from jabberd 1.4 spool file~n"
+ " import-dir dir\t\timport user data from jabberd 1.4 spool directory~n"
" registered-users\t\tlist all registered users~n"
" delete-expired-messages\tdelete expired offline messages from database~n"
"~n"
diff --git a/src/jd2ejd.erl b/src/jd2ejd.erl
index 6f2152b97..86e36a038 100644
--- a/src/jd2ejd.erl
+++ b/src/jd2ejd.erl
@@ -37,19 +37,23 @@ import_file(File) ->
{'EXIT', Reason} ->
?ERROR_MSG(
"Error while processing file \"~s\": ~p~n",
- [File, Reason]);
+ [File, Reason]),
+ {error, Reason};
_ ->
ok
end;
{error, Reason} ->
?ERROR_MSG("Can't parse file \"~s\": ~p~n",
- [File, Reason])
+ [File, Reason]),
+ {error, Reason}
end;
{error, Reason} ->
- ?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason])
+ ?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason]),
+ {error, Reason}
end;
false ->
- ?ERROR_MSG("Incorrect user/server name in file \"~s\"~n", [File])
+ ?ERROR_MSG("Illegal user/server name in file \"~s\"~n", [File]),
+ {error, "illegal user/server"}
end.
@@ -65,11 +69,15 @@ import_dir(Dir) ->
false
end
end, Files),
- lists:foreach(
- fun(FN) ->
- import_file(filename:join([Dir, FN]))
- end, MsgFiles),
- ok.
+ lists:foldl(
+ fun(FN, A) ->
+ Res = import_file(filename:join([Dir, FN])),
+ case {A, Res} of
+ {ok, ok} -> ok;
+ {ok, _} -> {error, "see ejabberd log for details"};
+ _ -> A
+ end
+ end, ok, MsgFiles).
%%%----------------------------------------------------------------------
%%% Internal functions
@@ -99,6 +107,14 @@ xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
?NS_ROSTER ->
catch mod_roster:set_items(User, Server, El),
ok;
+ ?NS_LAST ->
+ TimeStamp = xml:get_attr_s("last", Attrs),
+ Status = xml:get_tag_cdata(El),
+ catch mod_last:store_last_info(User,
+ Server,
+ list_to_integer(TimeStamp),
+ Status),
+ ok;
?NS_VCARD ->
catch mod_vcard:process_sm_iq(
From,
diff --git a/src/mod_last.erl b/src/mod_last.erl
index 8a1bb0539..33c9727a1 100644
--- a/src/mod_last.erl
+++ b/src/mod_last.erl
@@ -17,6 +17,7 @@
process_local_iq/3,
process_sm_iq/3,
on_presence_update/4,
+ store_last_info/4,
remove_user/2]).
-include("ejabberd.hrl").
@@ -118,18 +119,21 @@ get_last(IQ, SubEl, LUser, LServer) ->
on_presence_update(User, Server, _Resource, Status) ->
+ {MegaSecs, Secs, _MicroSecs} = now(),
+ TimeStamp = MegaSecs * 1000000 + Secs,
+ store_last_info(User, Server, TimeStamp, Status).
+
+store_last_info(User, Server, TimeStamp, Status) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
- {MegaSecs, Secs, _MicroSecs} = now(),
- TimeStamp = MegaSecs * 1000000 + Secs,
F = fun() ->
mnesia:write(#last_activity{us = US,
timestamp = TimeStamp,
status = Status})
end,
mnesia:transaction(F).
-
+
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
diff --git a/src/mod_last_odbc.erl b/src/mod_last_odbc.erl
index ef3c656eb..e7577ed40 100644
--- a/src/mod_last_odbc.erl
+++ b/src/mod_last_odbc.erl
@@ -16,7 +16,8 @@
stop/0,
process_local_iq/3,
process_sm_iq/3,
- on_presence_update/3,
+ on_presence_update/4,
+ store_last_info/4,
remove_user/1]).
-include("ejabberd.hrl").
@@ -120,10 +121,13 @@ get_last(IQ, SubEl, LUser) ->
-on_presence_update(User, _Resource, Status) ->
- LUser = jlib:nodeprep(User),
+on_presence_update(User, Server, _Resource, Status) ->
{MegaSecs, Secs, _MicroSecs} = now(),
TimeStamp = MegaSecs * 1000000 + Secs,
+ store_last_info(User, Server, TimeStamp, Status).
+
+store_last_info(User, Server, TimeStamp, Status) ->
+ LUser = jlib:nodeprep(User),
Username = ejabberd_odbc:escape(LUser),
Seconds = ejabberd_odbc:escape(integer_to_list(TimeStamp)),
State = ejabberd_odbc:escape(Status),