org.dromara.jpom.ssh.JschSocket Maven / Gradle / Ivy
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Code Technology Studio
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.dromara.jpom.ssh;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Optional;
@Slf4j
class JschSocket extends Socket {
private final Session session;
private Channel channel;
private InputStream inputStream;
private OutputStream outputStream;
JschSocket(Session session) {
this.session = session;
}
@Override
public void connect(SocketAddress endpoint) throws IOException {
connect(0);
}
@Override
public void connect(SocketAddress endpoint, int timeout) throws IOException {
connect(timeout);
}
@Override
public boolean isConnected() {
return channel.isConnected();
}
@Override
public boolean isClosed() {
return channel != null && channel.isClosed();
}
private void connect(int timeout) throws IOException {
try {
// only 18.09 and up
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("docker system dial-stdio");
log.debug("Using dialer command【docker system dial-stdio】");
inputStream = channel.getInputStream();
outputStream = channel.getOutputStream();
channel.connect(timeout);
} catch (JSchException e) {
throw new IOException(e);
}
}
@Override
public synchronized void close() throws IOException {
Optional.ofNullable(channel).ifPresent(Channel::disconnect);
}
@Override
public InputStream getInputStream() {
return inputStream;
}
@Override
public OutputStream getOutputStream() {
return outputStream;
}
}