diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_ctl.erl | 36 | ||||
-rw-r--r-- | src/jd2ejd.erl | 34 | ||||
-rw-r--r-- | src/mod_last.erl | 10 | ||||
-rw-r--r-- | src/mod_last_odbc.erl | 10 |
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), |