summaryrefslogtreecommitdiff
path: root/lib/ssh/src/ssh_info.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssh/src/ssh_info.erl')
-rw-r--r--lib/ssh/src/ssh_info.erl160
1 files changed, 73 insertions, 87 deletions
diff --git a/lib/ssh/src/ssh_info.erl b/lib/ssh/src/ssh_info.erl
index 79cd95e422..583274d44c 100644
--- a/lib/ssh/src/ssh_info.erl
+++ b/lib/ssh/src/ssh_info.erl
@@ -34,8 +34,10 @@
-include("ssh_connect.hrl").
print() ->
- io:format("~s", [string()]).
+ print(fun io:format/2).
+print(F) when is_function(F,2) ->
+ F("~s", [string()]);
print(File) when is_list(File) ->
{ok,D} = file:open(File, [write]),
print(D),
@@ -51,10 +53,10 @@ string() ->
print_general(),
io_lib:nl(),
underline("Client part", $=),
- print_clients(),
+ lists:map(fun print_system/1, children(sshc_sup)),
io_lib:nl(),
underline("Server part", $=),
- print_servers(),
+ lists:map(fun print_system/1, children(sshd_sup)),
io_lib:nl(),
underline("Supervisors", $=),
walk_sups(ssh_sup),
@@ -66,6 +68,8 @@ string() ->
%%%================================================================
+-define(inc(N), (N+4)).
+
-define(INDENT, " ").
print_general() ->
@@ -74,105 +78,87 @@ print_general() ->
io_lib:format('This printout is generated ~s. ~n',[datetime()])
].
-print_clients() ->
- try
- lists:map(fun print_client/1,
- supervisor:which_children(sshc_sup))
- catch
- C:E ->
- io_lib:format('***print_clients FAILED: ~p:~p~n',[C,E])
- end.
-print_client({undefined,Pid,supervisor,[ssh_connection_handler]}) ->
- {{Local,Remote},_Str} = ssh_connection_handler:get_print_info(Pid),
- [io_lib:format(?INDENT"Local: ~s Remote: ~s ConnectionRef = ~p~n",
- [fmt_host_port(Local), fmt_host_port(Remote), Pid]),
- case channels(Pid) of
- {ok,Channels=[_|_]} ->
- [print_ch(ChPid) || #channel{user=ChPid} <- Channels];
- _ ->
- io_lib:format(?INDENT?INDENT?INDENT"No channels~n",[])
- end];
+print_system({{server,ssh_system_sup,Addr,Port,Profile}, Pid, supervisor, [ssh_system_sup]}) ->
+ [io_lib:format(?INDENT"Local: ~s (~p children) Profile ~p~n",
+ [fmt_host_port({Addr,Port}),
+ ssh_acceptor:number_of_connections(Pid),
+ Profile
+ ]),
+ lists:map(fun print_subsystem/1, children(Pid))
+ ];
+print_system({{client,ssh_system_sup,Addr,Port,Profile}, Pid, supervisor, [ssh_system_sup]}) ->
+ [io_lib:format(?INDENT"Local: ~s Profile ~p~n",
+ [fmt_host_port({Addr,Port}),
+ Profile
+ ]),
+ lists:map(fun print_subsystem/1, children(Pid))
+ ];
+print_system({_, _Pid, worker, [ssh_controller]}) ->
+ ""; % io_lib:format(?INDENT"Controller~n",[]);
+print_system(_X) ->
+ io_lib:format(?INDENT"nyi system ~p~n",[_X]).
+
+
+
+
+print_subsystem({{ssh_acceptor_sup,_Addr,_Port,_Profile}, _Pid, supervisor, [ssh_acceptor_sup]}) ->
+ io_lib:format(?INDENT?INDENT"Acceptor~n",[]);
+print_subsystem({Ref,Pid,supervisor,[ssh_subsystem_sup]}) when is_reference(Ref),
+ is_pid(Pid) ->
+ Cs = children(Pid),
+ [
+ lists:map(
+ fun(Sup) ->
+ [print_conn(P) || {undefined,P,worker,[ssh_connection_handler]} <- children(Sup)]
+ end,
+ [P || {_Ref,P,supervisor,[ssh_connection_sup]} <- Cs]),
+
+ lists:map(
+ fun(Sup) ->
+ [print_ch(M,P) || {_Ref,P,worker,[M]} <- children(Sup),
+ lists:member(M, [ssh_channel,
+ ssh_channel_sup,
+ ssh_client_channel,
+ ssh_daemon_channel,
+ ssh_server_channel
+ ])]
+ end,
+ [P || {_Ref,P,supervisor,[ssh_channel_sup]} <- Cs]),
+
+ lists:map(
+ fun(Sup) ->
+ [io_lib:format(?INDENT?INDENT?INDENT"TCP/IP fwd acceptor: ~p~n", [Pa])
+ || {undefined,Pa,worker,[ssh_tcpip_forward_acceptor]} <- children(Sup)]
+ end,
+ [P || {_Ref,P,supervisor,[ssh_tcpip_forward_acceptor_sup]} <- Cs])
+ ];
-print_client(Other) ->
- io_lib:format(" [[Other 1: ~p]]~n",[Other]).
+print_subsystem(_X) ->
+ io_lib:format(?INDENT?INDENT"nyi subsystem ~p~n",[_X]).
-%%%================================================================
-print_servers() ->
+print_conn(Pid) ->
try
- lists:map(fun print_server/1,
- supervisor:which_children(sshd_sup))
+ {{_Local,Remote},StrM} = ssh_connection_handler:get_print_info(Pid),
+ io_lib:format(?INDENT?INDENT"Remote: ~s ConnectionRef = ~p ~s~n",[fmt_host_port(Remote),Pid,StrM])
catch
- C:E ->
- io_lib:format('***print_servers FAILED: ~p:~p~n',[C,E])
- end.
-
+ C:E ->
+ io_lib:format('****print_conn FAILED for ConnPid ~p: ~p:~p~n',[Pid, C, E])
+ end.
+
-print_server({{server,ssh_system_sup,LocalHost,LocalPort,Profile},Pid,supervisor,[ssh_system_sup]}) when is_pid(Pid) ->
- Children = supervisor:which_children(Pid),
- [io_lib:format(?INDENT"Listen: ~s (~p children) Profile ~p",[fmt_host_port({LocalHost,LocalPort}),
- ssh_acceptor:number_of_connections(Pid),
- Profile]),
- case [AccPid
- || {{ssh_acceptor_sup,_LocalHost,_LocalPort,_Profile}, AccPid, supervisor, [ssh_acceptor_sup]}
- <- Children] of
- AcceptorPids = [_|_] ->
- [io_lib:format(" [Acceptor Pid", []),
- [io_lib:format(" ~p",[AccPid]) || AccPid <- AcceptorPids],
- io_lib:format("]~n", [])
- ];
- [] ->
- io_lib:nl()
- end,
- lists:map(fun print_system_sup/1,
- supervisor:which_children(Pid))
- ].
-
-
-print_system_sup({Ref,Pid,supervisor,[ssh_subsystem_sup]}) when is_reference(Ref),
- is_pid(Pid) ->
- lists:map(fun print_channels/1,
- supervisor:which_children(Pid));
-
-print_system_sup({{ssh_acceptor_sup,_LocalHost,_LocalPort,_Profile}, Pid, supervisor, [ssh_acceptor_sup]}) when is_pid(Pid) ->
- [].
-
-
-
-print_channels({{server,ssh_server_channel_sup,_,_},Pid,supervisor,[ssh_server_channel_sup]}) when is_pid(Pid) ->
- Children = supervisor:which_children(Pid),
- ChannelPids = [P || {R,P,worker,[ssh_server_channel]} <- Children,
- is_pid(P),
- is_reference(R)],
- case ChannelPids of
- [] -> io_lib:format(?INDENT?INDENT"No channels~n",[]);
- [Ch1Pid|_] ->
- {{ConnManager,_}, _Str} = ssh_server_channel:get_print_info(Ch1Pid),
- {{_,Remote},_} = ssh_connection_handler:get_print_info(ConnManager),
- [io_lib:format(?INDENT?INDENT"Remote: ~s ConnectionRef = ~p~n",[fmt_host_port(Remote),ConnManager]),
- lists:map(fun print_ch/1, ChannelPids)
- ]
- end;
-print_channels({{server,ssh_connection_sup,_,_},Pid,supervisor,[ssh_connection_sup]}) when is_pid(Pid) ->
- []. % The supervisor of the connections socket owning process
-
-print_ch(Pid) ->
+print_ch(CBmod, Pid) ->
try
- {{ConnManager,ChannelID}, Str} = ssh_server_channel:get_print_info(Pid),
- {_LocalRemote,StrM} = ssh_connection_handler:get_print_info(ConnManager),
- io_lib:format(?INDENT?INDENT?INDENT"ch ~p ~p: ~s ~s~n",[ChannelID, Pid, StrM, Str])
+ {{_ConnManager,ChannelID}, Str} = ssh_server_channel:get_print_info(Pid),
+ io_lib:format(?INDENT?INDENT?INDENT"ch ~p ~p ~p: ~s~n",[ChannelID, Pid, CBmod, Str])
catch
C:E ->
io_lib:format('****print_ch FAILED for ChanPid ~p: ~p:~p~n',[Pid, C, E])
end.
-
%%%================================================================
--define(inc(N), (N+4)).
-
walk_sups(StartPid) ->
- io_lib:format("Start at ~p, ~s.~n",[StartPid,dead_or_alive(StartPid)]),
walk_sups(children(StartPid), _Indent=?inc(0)).
walk_sups([H={_,Pid,_,_}|T], Indent) ->