]> git.argeo.org Git - gpl/argeo-slc.git/blob - cms/org.argeo.slc.support/src/org/argeo/slc/jsch/AbstractJschTask.java
Remove unused.
[gpl/argeo-slc.git] / cms / org.argeo.slc.support / src / org / argeo / slc / jsch / AbstractJschTask.java
1 package org.argeo.slc.jsch;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.security.PrivilegedAction;
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.argeo.slc.SlcException;
10
11 import com.jcraft.jsch.JSch;
12 import com.jcraft.jsch.JSchException;
13 import com.jcraft.jsch.Logger;
14 import com.jcraft.jsch.Session;
15 import com.jcraft.jsch.UserAuthGSSAPIWithMIC;
16
17 public abstract class AbstractJschTask implements Runnable {
18 private final Log log = LogFactory.getLog(getClass());
19
20 private SshTarget sshTarget;
21
22 protected Session openSession() {
23 if (sshTarget.getSession() != null) {
24 Session session = sshTarget.getSession();
25 if (session.isConnected()) {
26 if (log.isTraceEnabled())
27 log.debug("Using cached session to " + getSshTarget() + " via SSH");
28 return session;
29 }
30 }
31
32 try {
33 JSch jsch = new JSch();
34 if (sshTarget.getUsePrivateKey() && sshTarget.getLocalPrivateKey().exists())
35 jsch.addIdentity(sshTarget.getLocalPrivateKey().getAbsolutePath());
36 Session session = jsch.getSession(getSshTarget().getUser(), getSshTarget().getHost(),
37 getSshTarget().getPort());
38
39 session.setUserInfo(getSshTarget().getUserInfo());
40 session.setConfig("userauth.gssapi-with-mic", UserAuthGSSAPIWithMIC.class.getName());
41 session.setServerAliveInterval(1000);
42 session.connect();
43 if (log.isTraceEnabled())
44 log.trace("Connected to " + getSshTarget() + " via SSH");
45 if (sshTarget.getSession() != null) {
46 if (log.isTraceEnabled())
47 log.trace("The cached session to " + getSshTarget() + " was disconnected and was reset.");
48 sshTarget.setSession(session);
49 }
50 return session;
51 } catch (JSchException e) {
52 if (sshTarget.getUserInfo() instanceof SimpleUserInfo)
53 ((SimpleUserInfo) sshTarget.getUserInfo()).reset();
54 throw new SlcException("Could not open session to " + getSshTarget(), e);
55 }
56 }
57
58 public void run() {
59 Session session = openSession();
60 try {
61 run(session);
62 } finally {
63 if (sshTarget != null && sshTarget.getSession() == null) {
64 session.disconnect();
65 if (log.isTraceEnabled())
66 log.trace("Disconnected from " + getSshTarget() + " via SSH");
67 }
68 }
69 }
70
71 abstract void run(Session session);
72
73 protected int checkAck(InputStream in) throws IOException {
74 int b = in.read();
75 // b may be 0 for success,
76 // 1 for error,
77 // 2 for fatal error,
78 // -1
79 if (b == 0)
80 return b;
81 else if (b == -1)
82 return b;// throw new SlcException("SSH ack returned -1");
83 else if (b == 1 || b == 2) {
84 StringBuffer sb = new StringBuffer();
85 int c;
86 do {
87 c = in.read();
88 sb.append((char) c);
89 } while (c != '\n');
90 if (b == 1) { // error
91 throw new SlcException("SSH ack error: " + sb.toString());
92 }
93 if (b == 2) { // fatal error
94 throw new SlcException("SSH fatal error: " + sb.toString());
95 }
96 }
97 return b;
98 }
99
100 public SshTarget getSshTarget() {
101 if (sshTarget == null)
102 throw new SlcException("No SSH target defined.");
103 return sshTarget;
104 }
105
106 public void setSshTarget(SshTarget sshTarget) {
107 this.sshTarget = sshTarget;
108 }
109
110 PrivilegedAction<Void> asPrivilegedAction() {
111 return new PrivilegedAction<Void>() {
112 public Void run() {
113 AbstractJschTask.this.run();
114 return null;
115 }
116 };
117 }
118
119 static {
120 JSch.setLogger(new JschLogger());
121 }
122
123 private static class JschLogger implements Logger {
124 private final Log log = LogFactory.getLog(JschLogger.class);
125
126 // TODO better support levels
127 @Override
128 public boolean isEnabled(int level) {
129 if (log.isTraceEnabled())
130 return true;
131 return false;
132 }
133
134 @Override
135 public void log(int level, String message) {
136 log.trace(message);
137 }
138
139 }
140 }