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:
parent
a977d9c6b6
commit
f65b1837ed
2 changed files with 83 additions and 83 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue