+package org.argeo.slc.jsch;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
+import org.springframework.core.io.Resource;
+import org.springframework.util.StringUtils;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.Session;
+
+public class SshShell extends AbstractJschTask {
+ private final static Log log = LogFactory.getLog(SshShell.class);
+ private Resource input;
+
+ @Override
+ void run(Session session) {
+ try {
+ final Channel channel = session.openChannel("shell");
+
+ // Enable agent-forwarding.
+ // ((ChannelShell)channel).setAgentForwarding(true);
+
+ // channel.setInputStream(System.in);
+ // channel.setInputStream(input.getInputStream());
+ /*
+ * // a hack for MS-DOS prompt on Windows.
+ * channel.setInputStream(new FilterInputStream(System.in){ public
+ * int read(byte[] b, int off, int len)throws IOException{ return
+ * in.read(b, off, (len>1024?1024:len)); } });
+ */
+
+ // channel.setOutputStream(System.out);
+
+ /*
+ * // Choose the pty-type "vt102".
+ * ((ChannelShell)channel).setPtyType("vt102");
+ */
+
+ /*
+ * // Set environment variable "LANG" as "ja_JP.eucJP".
+ * ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
+ */
+
+ // Writer thread
+ final BufferedWriter writer = new BufferedWriter(
+ new OutputStreamWriter(channel.getOutputStream()));
+
+ // channel.connect();
+ channel.connect(3 * 1000);
+
+ // while (!channel.isConnected())
+ // try {
+ // Thread.sleep(500);
+ // } catch (InterruptedException e1) {
+ // // silent
+ // }
+
+ Thread writerThread = new Thread("Shell writer " + getSshTarget()) {
+
+ @Override
+ public void run() {
+
+ if (log.isDebugEnabled())
+ log.debug("Start writing to shell");
+
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(input
+ .getInputStream()));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ if (!StringUtils.hasText(line))
+ continue;
+ writer.write(line);
+ writer.newLine();
+ }
+ writer.append("exit");
+ writer.newLine();
+ writer.flush();
+ // channel.disconnect();
+ } catch (IOException e) {
+ throw new SlcException("Cannot write to shell on "
+ + getSshTarget(), e);
+ } finally {
+ IOUtils.closeQuietly(reader);
+ }
+ }
+ };
+ writerThread.start();
+
+ BufferedReader execIn = null;
+ try {
+ execIn = new BufferedReader(new InputStreamReader(channel
+ .getInputStream()));
+ String line = null;
+ while ((line = execIn.readLine()) != null) {
+ if (!line.trim().equals(""))
+ log.info(line);
+ }
+ } catch (Exception e) {
+ throw new SlcException("Cannot read from shell on "
+ + getSshTarget(), e);
+ } finally {
+ IOUtils.closeQuietly(execIn);
+ }
+
+ } catch (Exception e) {
+ throw new SlcException("Cannot use SSH shell on " + getSshTarget(),
+ e);
+ }
+ }
+
+ public void setInput(Resource input) {
+ this.input = input;
+ }
+
+}