diff options
author | Badlop <badlop@process-one.net> | 2009-05-19 09:38:17 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2009-05-19 09:38:17 +0000 |
commit | b5964c2a5fc6da605c23aa2a3e30582b7a091ae5 (patch) | |
tree | dac4f69d27520163805c2ac502fe61daea0dcbce | |
parent | * src/eldap/eldap.erl: log warnings on unsuccessful LDAP bind attempts. Incre... (diff) |
Added API function to get current S2S connections with information
get_info_s2s_connections(Type) returns a list of incoming (or outgoing)
S2S connections with information for each one including IP address,
port number, TLS options... (thanks to Juan Pablo Carlino)
SVN Revision: 2088
-rw-r--r-- | src/ejabberd_s2s.erl | 31 | ||||
-rw-r--r-- | src/ejabberd_s2s_in.erl | 29 | ||||
-rw-r--r-- | src/ejabberd_s2s_out.erl | 36 |
3 files changed, 96 insertions, 0 deletions
diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index ec4011bd4..d1c6303b7 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -46,6 +46,8 @@ %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). +%% ejabberd API +-export([get_info_s2s_connections/1]). -include("ejabberd.hrl"). -include("jlib.hrl"). @@ -494,3 +496,32 @@ allow_host(MyServer, S2SHost) -> _ -> true %% The default s2s policy is allow end end. + +%% Get information about S2S connections of the specified type. +%% @spec (Type) -> [Info] +%% where Type = in | out +%% Info = [{InfoName::atom(), InfoValue::any()}] +get_info_s2s_connections(Type) -> + ChildType = case Type of + in -> ejabberd_s2s_in_sup; + out -> ejabberd_s2s_out_sup + end, + Connections = supervisor:which_children(ChildType), + get_s2s_info(Connections,Type). + +get_s2s_info(Connections,Type)-> + complete_s2s_info(Connections,Type,[]). +complete_s2s_info([],_,Result)-> + Result; +complete_s2s_info([Connection|T],Type,Result)-> + {_,PID,_,_}=Connection, + State = get_s2s_state(PID), + complete_s2s_info(T,Type,[State|Result]). + +get_s2s_state(S2sPid)-> + Infos = case gen_fsm:sync_send_all_state_event(S2sPid,get_state_infos) of + {state_infos, Is} -> [{status, open} | Is]; + {noproc,_} -> [{status, closed}]; %% Connection closed + {badrpc,_} -> [{status, error}] + end, + [{s2s_pid, S2sPid} | Infos]. diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index d938fe7ef..e25ebd98f 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -518,6 +518,35 @@ stream_established(closed, StateData) -> %%---------------------------------------------------------------------- handle_event(_Event, StateName, StateData) -> {next_state, StateName, StateData}. +%%---------------------------------------------------------------------- +%% Func: handle_sync_event/4 +%% Returns: The associated StateData for this connection +%% {reply, Reply, NextStateName, NextStateData} +%% Reply = {state_infos, [{InfoName::atom(), InfoValue::any()] +%%---------------------------------------------------------------------- +handle_sync_event(get_state_infos, _From, StateName, StateData) -> + SockMod = StateData#state.sockmod, + {Addr,Port} = try SockMod:peername(StateData#state.socket) of + {ok, {A,P}} -> {A,P}; + {error, _} -> {unknown,unknown} + catch + _:_ -> {unknown,unknown} + end, + Infos = [ + {direction, in}, + {statename, StateName}, + {addr, Addr}, + {port, Port}, + {streamid, StateData#state.streamid}, + {tls, StateData#state.tls}, + {tls_enabled, StateData#state.tls_enabled}, + {tls_options, StateData#state.tls_options}, + {authenticated, StateData#state.authenticated}, + {shaper, StateData#state.shaper}, + {sockmod, SockMod} + ], + Reply = {state_infos, Infos}, + {reply,Reply,StateName,StateData}; %%---------------------------------------------------------------------- %% Func: handle_sync_event/4 diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index f325d71e6..338bc9669 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -745,6 +745,42 @@ handle_event(_Event, StateName, StateData) -> %%---------------------------------------------------------------------- %% Func: handle_sync_event/4 +%% Returns: The associated StateData for this connection +%% {reply, Reply, NextStateName, NextStateData} +%% Reply = {state_infos, [{InfoName::atom(), InfoValue::any()] +%%---------------------------------------------------------------------- +handle_sync_event(get_state_infos, _From, StateName, StateData) -> + {Addr,Port} = try ejabberd_socket:peername(StateData#state.socket) of + {ok, {A,P}} -> {A,P}; + {error, _} -> {unknown,unknown} + catch + _:_ -> + {unknown,unknown} + end, + Infos = [ + {direction, out}, + {statename, StateName}, + {addr, Addr}, + {port, Port}, + {streamid, StateData#state.streamid}, + {use_v10, StateData#state.use_v10}, + {tls, StateData#state.tls}, + {tls_required, StateData#state.tls_required}, + {tls_enabled, StateData#state.tls_enabled}, + {tls_options, StateData#state.tls_options}, + {authenticated, StateData#state.authenticated}, + {db_enabled, StateData#state.db_enabled}, + {try_auth, StateData#state.try_auth}, + {myname, StateData#state.myname}, + {server, StateData#state.server}, + {delay_to_retry, StateData#state.delay_to_retry}, + {verify, StateData#state.verify} + ], + Reply = {state_infos, Infos}, + {reply,Reply,StateName,StateData}; + +%%---------------------------------------------------------------------- +%% Func: handle_sync_event/4 %% Returns: {next_state, NextStateName, NextStateData} | %% {next_state, NextStateName, NextStateData, Timeout} | %% {reply, Reply, NextStateName, NextStateData} | |