You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2019/10/17 06:02:42 UTC
[mina-sshd] 02/06: Log more session related information in CLI
client/server code if verbosity enabled
This is an automated email from the ASF dual-hosted git repository.
lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit 4832f6b3af6a4b7e09ae405d51f0d8f5a91f9e09
Author: Lyor Goldstein <lg...@apache.org>
AuthorDate: Wed Oct 16 07:57:31 2019 +0300
Log more session related information in CLI client/server code if verbosity enabled
---
.../main/java/org/apache/sshd/cli/CliSupport.java | 115 +++++++++++++++++++--
1 file changed, 105 insertions(+), 10 deletions(-)
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/CliSupport.java b/sshd-cli/src/main/java/org/apache/sshd/cli/CliSupport.java
index 783c219..3b6e417 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/CliSupport.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/CliSupport.java
@@ -20,7 +20,10 @@ package org.apache.sshd.cli;
import java.io.IOException;
import java.io.PrintStream;
+import java.io.PrintWriter;
import java.net.SocketAddress;
+import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.logging.Level;
@@ -35,6 +38,9 @@ import org.apache.sshd.common.io.IoAcceptor;
import org.apache.sshd.common.io.IoConnector;
import org.apache.sshd.common.io.IoServiceEventListener;
import org.apache.sshd.common.io.IoServiceFactoryFactory;
+import org.apache.sshd.common.kex.KexProposalOption;
+import org.apache.sshd.common.session.Session;
+import org.apache.sshd.common.session.SessionListener;
import org.apache.sshd.common.util.GenericUtils;
/**
@@ -131,9 +137,27 @@ public abstract class CliSupport {
return manager;
}
- manager.setIoServiceEventListener(new IoServiceEventListener() {
- private final PrintStream out = Level.INFO.equals(level) ? stderr : stdout;
+ PrintStream out = Level.INFO.equals(level) ? stderr : stdout;
+ manager.setIoServiceEventListener(createLoggingIoServiceEventListener(out));
+ manager.addSessionListener(createLoggingSessionListener(out));
+ return manager;
+ }
+
+ public static void printStackTrace(Appendable out, Throwable reason) {
+ if ((reason == null) || (out == null)) {
+ return;
+ }
+ if (out instanceof PrintStream) {
+ reason.printStackTrace((PrintStream) out);
+ } else if (out instanceof PrintWriter) {
+ reason.printStackTrace((PrintWriter) out);
+ }
+ }
+
+ @SuppressWarnings("checkstyle:anoninnerlength")
+ public static IoServiceEventListener createLoggingIoServiceEventListener(Appendable out) {
+ return new IoServiceEventListener() {
@Override
public void connectionEstablished(
IoConnector connector, SocketAddress local, AttributeRepository context, SocketAddress remote)
@@ -141,7 +165,7 @@ public abstract class CliSupport {
out.append("Connection established via ").append(Objects.toString(connector))
.append("- local=").append(Objects.toString(local))
.append(", remote=").append(Objects.toString(remote))
- .println();
+ .append(System.lineSeparator());
}
@Override
@@ -152,8 +176,9 @@ public abstract class CliSupport {
.append(" - local=").append(Objects.toString(local))
.append(", remote=").append(Objects.toString(remote))
.append(": (").append(reason.getClass().getSimpleName()).append(')')
- .append(" ").println(reason.getMessage());
- reason.printStackTrace(out);
+ .append(' ').append(reason.getMessage())
+ .append(System.lineSeparator());
+ printStackTrace(out, reason);
}
@Override
@@ -163,7 +188,7 @@ public abstract class CliSupport {
.append(" - local=").append(Objects.toString(local))
.append(", remote=").append(Objects.toString(remote))
.append(", service=").append(Objects.toString(service))
- .println();
+ .append(System.lineSeparator());
}
@Override
@@ -175,12 +200,82 @@ public abstract class CliSupport {
.append(", remote=").append(Objects.toString(remote))
.append(", service=").append(Objects.toString(service))
.append(": (").append(reason.getClass().getSimpleName()).append(')')
- .append(" ").println(reason.getMessage());
- reason.printStackTrace(out);
+ .append(' ').append(reason.getMessage())
+ .append(System.lineSeparator());
+ printStackTrace(out, reason);
}
- });
+ };
+ }
- return manager;
+ @SuppressWarnings("checkstyle:anoninnerlength")
+ public static SessionListener createLoggingSessionListener(Appendable out) {
+ return new SessionListener() {
+ @Override
+ public void sessionPeerIdentificationReceived(
+ Session session, String version, List<String> extraLines) {
+ try {
+ out.append(Objects.toString(session))
+ .append(" peer identification=").append(version)
+ .append(System.lineSeparator());
+ if (GenericUtils.isNotEmpty(extraLines)) {
+ for (String l : extraLines) {
+ out.append(" => ").append(l).append(System.lineSeparator());
+ }
+ }
+ } catch (IOException e) {
+ // ignored
+ }
+ }
+
+ @Override
+ public void sessionNegotiationEnd(Session session,
+ Map<KexProposalOption, String> clientProposal,
+ Map<KexProposalOption, String> serverProposal,
+ Map<KexProposalOption, String> negotiatedOptions,
+ Throwable reason) {
+ if (reason != null) {
+ return;
+ }
+
+ try {
+ out.append(Objects.toString(session))
+ .append(" KEX negotiation results:")
+ .append(System.lineSeparator());
+ for (KexProposalOption opt : KexProposalOption.VALUES) {
+ String value = negotiatedOptions.get(opt);
+ out.append(" ").append(opt.getDescription())
+ .append(": ").append(value)
+ .append(System.lineSeparator());
+ }
+ } catch (IOException e) {
+ // ignored
+ }
+ }
+
+ @Override
+ public void sessionException(Session session, Throwable t) {
+ try {
+ out.append(Objects.toString(session))
+ .append(' ').append(t.getClass().getSimpleName())
+ .append(": ").append(t.getMessage())
+ .append(System.lineSeparator());
+ printStackTrace(out, t);
+ } catch (IOException e) {
+ // ignored
+ }
+ }
+
+ @Override
+ public void sessionClosed(Session session) {
+ try {
+ out.append(Objects.toString(session))
+ .append(" closed")
+ .append(System.lineSeparator());
+ } catch (IOException e) {
+ // ignored
+ }
+ }
+ };
}
public static Level resolveLoggingVerbosity(String... args) {