1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

Fix local command proxy

Was broken by d5cb7731db

Change-Id: I26ec14d832150d20dfefa19b614299a495897bf5
This commit is contained in:
Roland Schulz 2015-04-01 17:23:25 -04:00
parent a977d9c6b6
commit f65b1837ed
2 changed files with 83 additions and 83 deletions

View file

@ -24,8 +24,8 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.IRemoteProcessService;
import org.eclipse.remote.core.IRemoteProcess; import org.eclipse.remote.core.IRemoteProcess;
import org.eclipse.remote.core.IRemoteProcessService;
import org.eclipse.remote.core.IRemoteServicesManager; import org.eclipse.remote.core.IRemoteServicesManager;
import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.messages.Messages; import org.eclipse.remote.internal.jsch.core.messages.Messages;
@ -60,7 +60,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#close() * @see com.jcraft.jsch.Proxy#close()
*/ */
@Override @Override
@ -70,106 +70,106 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#connect(com.jcraft.jsch.SocketFactory, java.lang.String, int, int) * @see com.jcraft.jsch.Proxy#connect(com.jcraft.jsch.SocketFactory, java.lang.String, int, int)
*/ */
@Override @Override
public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws IOException { public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws IOException {
assert !connectCalled : "connect should only be called once"; //$NON-NLS-1$ assert !connectCalled : "connect should only be called once"; //$NON-NLS-1$
try { connectCalled = true;
if (timeout == 0) {
timeout = 10000; // default to 10s
}
final int waitTime = 50;
final int waitSteps = timeout / waitTime;
SubMonitor subMon = SubMonitor.convert(monitor, waitSteps * 2);
final SubMonitor childMon = subMon.newChild(waitSteps);
if (connection == null) { if (timeout == 0) {
IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class); timeout = 10000; // default to 10s
connection = (JSchConnection) manager.getLocalConnectionType().getConnections().get(0); }
} final int waitTime = 50;
final int waitSteps = timeout / waitTime;
SubMonitor subMon = SubMonitor.convert(monitor, waitSteps * 2);
final SubMonitor childMon = subMon.newChild(waitSteps);
if (connection != null) {
// Open connection if it isn't already opened // Open connection if it isn't already opened
try { try {
connection.openMinimal(childMon); connection.openMinimal(childMon);
} catch (RemoteConnectionException e) { } catch (RemoteConnectionException e) {
throw new IOException(e); throw new IOException(e);
} }
subMon.setWorkRemaining(waitSteps); }
subMon.setWorkRemaining(waitSteps);
// Start command // Start command
command = command.replace("%h", host); //$NON-NLS-1$ command = command.replace("%h", host); //$NON-NLS-1$
command = command.replace("%p", Integer.toString(port)); //$NON-NLS-1$ command = command.replace("%p", Integer.toString(port)); //$NON-NLS-1$
List<String> cmd = new ArgumentParser(command).getTokenList(); List<String> cmd = new ArgumentParser(command).getTokenList();
JSchProcessBuilder processBuilder = (JSchProcessBuilder) connection.getRemoteConnection()
.getService(IRemoteProcessService.class).getProcessBuilder(cmd); if (connection != null) {
JSchProcessBuilder processBuilder = (JSchProcessBuilder) connection.getProcessBuilder(cmd);
processBuilder.setPreamble(false); processBuilder.setPreamble(false);
process = processBuilder.start(); process = processBuilder.start();
} else {
process = Activator.getService(IRemoteServicesManager.class).getLocalConnectionType().getConnections().get(0).
getService(IRemoteProcessService.class).getProcessBuilder(cmd).start();
}
// Wait on command to produce stdout output // Wait on command to produce stdout output
long endTime = System.currentTimeMillis() + timeout; long endTime = System.currentTimeMillis() + timeout;
boolean bOutputAvailable, bProcessComplete, bTimedOut, bCanceled; boolean bOutputAvailable, bProcessComplete, bTimedOut, bCanceled;
do { do {
try { try {
Thread.sleep(waitTime); Thread.sleep(waitTime);
subMon.worked(1); subMon.worked(1);
} catch (InterruptedException e) { } catch (InterruptedException e) {
/* ignore */ /* ignore */
} }
bOutputAvailable = (getInputStream().available() != 0); bOutputAvailable = (getInputStream().available() != 0);
bProcessComplete = process.isCompleted(); bProcessComplete = process.isCompleted();
bTimedOut = System.currentTimeMillis() > endTime; bTimedOut = System.currentTimeMillis() > endTime;
bCanceled = subMon.isCanceled(); bCanceled = subMon.isCanceled();
} while (!bOutputAvailable && !bProcessComplete && !bTimedOut && !bCanceled); } while (!bOutputAvailable && !bProcessComplete && !bTimedOut && !bCanceled);
// If no output was produced before process died, throw an exception with the stderr output // If no output was produced before process died, throw an exception with the stderr output
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
if (getInputStream().available() == 0 || process.isCompleted()) { if (getInputStream().available() == 0 || process.isCompleted()) {
String msg = ""; //$NON-NLS-1$ String msg = ""; //$NON-NLS-1$
while (bufferedReader.ready()) { while (bufferedReader.ready()) {
msg += (char) bufferedReader.read(); msg += (char) bufferedReader.read();
} }
msg = msg.trim(); msg = msg.trim();
if (!process.isCompleted()) { if (!process.isCompleted()) {
process.destroy(); process.destroy();
}
String cause = Messages.JSchConnectionProxyFactory_failed;
if (bTimedOut) {
cause = Messages.JSchConnectionProxyFactory_timedOut;
} else if (bCanceled) {
cause = Messages.JSchConnectionProxyFactory_wasCanceled;
}
throw new IOException(MessageFormat.format(Messages.JSchConnectionProxyFactory_ProxyCommandFailed, command,
cause, msg));
} }
// Dump the stderr to log String cause = Messages.JSchConnectionProxyFactory_failed;
new Thread() { if (bTimedOut) {
@Override cause = Messages.JSchConnectionProxyFactory_timedOut;
public void run() { } else if (bCanceled) {
final ILog log = Activator.getDefault().getLog(); cause = Messages.JSchConnectionProxyFactory_wasCanceled;
String line; }
try { throw new IOException(MessageFormat.format(Messages.JSchConnectionProxyFactory_ProxyCommandFailed, command,
while ((line = bufferedReader.readLine()) != null) { cause, msg));
log.log(new Status(IStatus.INFO, Activator.getUniqueIdentifier(), IStatus.OK, line, null));
}
} catch (IOException e) {
Activator.log(e);
}
};
}.start();
} finally {
connectCalled = true;
} }
// Dump the stderr to log
new Thread() {
@Override
public void run() {
final ILog log = Activator.getDefault().getLog();
String line;
try {
while ((line = bufferedReader.readLine()) != null) {
log.log(new Status(IStatus.INFO, Activator.getUniqueIdentifier(), IStatus.OK, line, null));
}
} catch (IOException e) {
Activator.log(e);
}
};
}.start();
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getInputStream() * @see com.jcraft.jsch.Proxy#getInputStream()
*/ */
@Override @Override
@ -179,7 +179,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getOutputStream() * @see com.jcraft.jsch.Proxy#getOutputStream()
*/ */
@Override @Override
@ -189,7 +189,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getSocket() * @see com.jcraft.jsch.Proxy#getSocket()
*/ */
@Override @Override
@ -214,7 +214,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#close() * @see com.jcraft.jsch.Proxy#close()
*/ */
@Override @Override
@ -224,7 +224,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#connect(com.jcraft.jsch.SocketFactory, java.lang.String, int, int) * @see com.jcraft.jsch.Proxy#connect(com.jcraft.jsch.SocketFactory, java.lang.String, int, int)
*/ */
@Override @Override
@ -246,7 +246,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getInputStream() * @see com.jcraft.jsch.Proxy#getInputStream()
*/ */
@Override @Override
@ -261,7 +261,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getOutputStream() * @see com.jcraft.jsch.Proxy#getOutputStream()
*/ */
@Override @Override
@ -276,7 +276,7 @@ public class JSchConnectionProxyFactory {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see com.jcraft.jsch.Proxy#getSocket() * @see com.jcraft.jsch.Proxy#getSocket()
*/ */
@Override @Override

View file

@ -91,7 +91,7 @@ public class JSchProcessBuilder extends AbstractRemoteProcessBuilder {
@Override @Override
public IRemoteProcess start(int flags) throws IOException { public IRemoteProcess start(int flags) throws IOException {
if (!fConnection.isOpen()) { if (!fConnection.hasOpenSession()) {
throw new IOException(Messages.JSchProcessBuilder_Connection_is_not_open); throw new IOException(Messages.JSchProcessBuilder_Connection_is_not_open);
} }