@Override public void handleClose() throws IOException { boolean debugEnabled = log.isDebugEnabled(); if (debugEnabled) { log.debug("handleClose({}) SSH_MSG_CHANNEL_CLOSE", this); } if (!isEofSent()) { if (debugEnabled) { log.debug("handleClose({}) prevent sending EOF", this); } } if (gracefulState.compareAndSet(GracefulState.Opened, GracefulState.CloseReceived)) { close(false); } else if (gracefulState.compareAndSet(GracefulState.CloseSent, GracefulState.Closed)) { gracefulFuture.setClosed(); } }
@Override public void init(ConnectionService service, Session session, int id) throws IOException { if (log.isDebugEnabled()) { log.debug("init() service={} session={} id={}", service, session, id); } this.service = service; this.sessionInstance = session; this.id = id; signalChannelInitialized(); configureWindow(); initialized.set(true); }
@Override public ChannelStreamPacketWriterResolver resolveChannelStreamPacketWriterResolver() { ChannelStreamPacketWriterResolver resolver = getChannelStreamPacketWriterResolver(); if (resolver != null) { return resolver; } ChannelStreamPacketWriterResolverManager manager = getSession(); return manager.resolveChannelStreamPacketWriterResolver(); }
@Override public String toString() { return getClass().getSimpleName() + "[id=" + getId() + ", recipient=" + getRecipient() + "]" + "-" + getSession(); } }
@Override public void handleExtendedData(Buffer buffer) throws IOException { int ex = buffer.getInt(); // Only accept extended data for stderr if (ex != SshConstants.SSH_EXTENDED_DATA_STDERR) { if (log.isDebugEnabled()) { log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_FAILURE - non STDERR type: {}", this, ex); } Session s = getSession(); Buffer rsp = s.createBuffer(SshConstants.SSH_MSG_CHANNEL_FAILURE, Integer.BYTES); rsp.putInt(getRecipient()); writePacket(rsp); return; } long len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA, buffer.getUInt()); if (log.isDebugEnabled()) { log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_EXTENDED_DATA len={}", this, len); } if (log.isTraceEnabled()) { BufferUtils.dumpHex(getSimplifiedLogger(), BufferUtils.DEFAULT_HEXDUMP_LEVEL, "handleExtendedData(" + this + ")", this, BufferUtils.DEFAULT_HEX_SEPARATOR, buffer.array(), buffer.rpos(), (int) len); } if (isEofSignalled()) { // TODO consider throwing an exception log.warn("handleExtendedData({}) extra {} bytes sent after EOF", this, len); } doWriteExtendedData(buffer.array(), buffer.rpos(), len); }
@Override public void handleData(Buffer buffer) throws IOException { long len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_DATA, buffer.getUInt()); if (log.isDebugEnabled()) { log.debug("handleData({}) SSH_MSG_CHANNEL_DATA len={}", this, len); } if (log.isTraceEnabled()) { BufferUtils.dumpHex(getSimplifiedLogger(), BufferUtils.DEFAULT_HEXDUMP_LEVEL, "handleData(" + this + ")", this, BufferUtils.DEFAULT_HEX_SEPARATOR, buffer.array(), buffer.rpos(), (int) len); } if (isEofSignalled()) { // TODO consider throwing an exception log.warn("handleData({}) extra {} bytes sent after EOF", this, len); } doWriteData(buffer.array(), buffer.rpos(), len); }
@Override protected Closeable getInnerCloseable() { return builder() .sequential(new GracefulChannelCloseable(), getExecutorService()) .run(toString(), () -> { if (service != null) { service.unregisterChannel(AbstractChannel.this); } }) .build(); }
Session s = getSession(); Buffer buffer = s.createBuffer(SshConstants.SSH_MSG_CHANNEL_CLOSE, Short.SIZE); buffer.putInt(getRecipient()); CloseableExecutorService service = getExecutorService(); if ((service != null) && (!service.isShutdown())) { Collection<?> running = service.shutdownNow();
protected void invokeChannelSignaller(Invoker<ChannelListener, Void> invoker) throws Throwable { Session session = getSession(); FactoryManager manager = (session == null) ? null : session.getFactoryManager(); ChannelListener[] listeners = { (manager == null) ? null : manager.getChannelListenerProxy(), (session == null) ? null : session.getChannelListenerProxy(), getChannelListenerProxy() }; Throwable err = null; for (ChannelListener l : listeners) { if (l == null) { continue; } try { invoker.invoke(l); } catch (Throwable t) { err = GenericUtils.accumulateException(err, t); } } if (err != null) { throw err; } }
AbstractChannel channel = getChannel(); if (!isOpen()) { throw new SshChannelClosedException(channel.getId(), "flush(" + this + ") length=" + bufferLength + " - stream is already closed"); Session session = channel.getSession(); boolean traceEnabled = log.isTraceEnabled(); while (bufferLength > 0) {
protected AbstractChannel(String discriminator, boolean client, Collection<? extends RequestHandler<Channel>> handlers, CloseableExecutorService executorService) { super(discriminator); gracefulFuture = new DefaultCloseFuture(discriminator, lock); localWindow = new Window(this, null, client, true); remoteWindow = new Window(this, null, client, false); channelListenerProxy = EventListenerUtils.proxyWrapper(ChannelListener.class, getClass().getClassLoader(), channelListeners); executor = executorService; addRequestHandlers(handlers); }
@Override public void handleExtendedData(Buffer buffer) throws IOException { int ex = buffer.getInt(); // Only accept extended data for stderr if (ex != SshConstants.SSH_EXTENDED_DATA_STDERR) { if (log.isDebugEnabled()) { log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_FAILURE - non STDERR type: {}", this, ex); } Session s = getSession(); Buffer rsp = s.createBuffer(SshConstants.SSH_MSG_CHANNEL_FAILURE, Integer.BYTES); rsp.putInt(getRecipient()); writePacket(rsp); return; } long len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA, buffer.getUInt()); if (log.isDebugEnabled()) { log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_EXTENDED_DATA len={}", this, len); } if (log.isTraceEnabled()) { BufferUtils.dumpHex(getSimplifiedLogger(), BufferUtils.DEFAULT_HEXDUMP_LEVEL, "handleExtendedData(" + this + ")", this, BufferUtils.DEFAULT_HEX_SEPARATOR, buffer.array(), buffer.rpos(), (int) len); } if (isEofSignalled()) { // TODO consider throwing an exception log.warn("handleExtendedData({}) extra {} bytes sent after EOF", this, len); } doWriteExtendedData(buffer.array(), buffer.rpos(), len); }
@Override public void handleData(Buffer buffer) throws IOException { long len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_DATA, buffer.getUInt()); if (log.isDebugEnabled()) { log.debug("handleData({}) SSH_MSG_CHANNEL_DATA len={}", this, len); } if (log.isTraceEnabled()) { BufferUtils.dumpHex(getSimplifiedLogger(), BufferUtils.DEFAULT_HEXDUMP_LEVEL, "handleData(" + this + ")", this, BufferUtils.DEFAULT_HEX_SEPARATOR, buffer.array(), buffer.rpos(), (int) len); } if (isEofSignalled()) { // TODO consider throwing an exception log.warn("handleData({}) extra {} bytes sent after EOF", this, len); } doWriteData(buffer.array(), buffer.rpos(), len); }
@Override public String toString() { return getClass().getSimpleName() + "[id=" + getId() + ", recipient=" + getRecipient() + "]" + "-" + getSession(); } }
@Override protected Closeable getInnerCloseable() { return builder() .sequential(new GracefulChannelCloseable(), getExecutorService()) .run(toString(), () -> { if (service != null) { service.unregisterChannel(AbstractChannel.this); } }) .build(); }
Session s = getSession(); Buffer buffer = s.createBuffer(SshConstants.SSH_MSG_CHANNEL_CLOSE, Short.SIZE); buffer.putInt(getRecipient()); CloseableExecutorService service = getExecutorService(); if ((service != null) && (!service.isShutdown())) { Collection<?> running = service.shutdownNow();
protected void invokeChannelSignaller(Invoker<ChannelListener, Void> invoker) throws Throwable { Session session = getSession(); FactoryManager manager = (session == null) ? null : session.getFactoryManager(); ChannelListener[] listeners = { (manager == null) ? null : manager.getChannelListenerProxy(), (session == null) ? null : session.getChannelListenerProxy(), getChannelListenerProxy() }; Throwable err = null; for (ChannelListener l : listeners) { if (l == null) { continue; } try { invoker.invoke(l); } catch (Throwable t) { err = GenericUtils.accumulateException(err, t); } } if (err != null) { throw err; } }
AbstractChannel channel = getChannel(); if (!isOpen()) { throw new SshChannelClosedException(channel.getId(), "flush(" + this + ") length=" + bufferLength + " - stream is already closed"); Session session = channel.getSession(); boolean traceEnabled = log.isTraceEnabled(); while (bufferLength > 0) {
protected AbstractChannel(String discriminator, boolean client, Collection<? extends RequestHandler<Channel>> handlers, CloseableExecutorService executorService) { super(discriminator); gracefulFuture = new DefaultCloseFuture(discriminator, lock); localWindow = new Window(this, null, client, true); remoteWindow = new Window(this, null, client, false); channelListenerProxy = EventListenerUtils.proxyWrapper( ChannelListener.class, getClass().getClassLoader(), channelListeners); executor = executorService; addRequestHandlers(handlers); }
@Override public ChannelStreamPacketWriterResolver resolveChannelStreamPacketWriterResolver() { ChannelStreamPacketWriterResolver resolver = getChannelStreamPacketWriterResolver(); if (resolver != null) { return resolver; } ChannelStreamPacketWriterResolverManager manager = getSession(); return manager.resolveChannelStreamPacketWriterResolver(); }