1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00
Signed-off-by: Greg Watson <g.watson@computer.org>
This commit is contained in:
Greg Watson 2014-01-27 18:15:25 -05:00
parent 7bd13e741b
commit acbd43742d
8 changed files with 81 additions and 103 deletions

View file

@ -23,6 +23,7 @@ import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jsch.core.IJSchService;
import org.eclipse.osgi.util.NLS;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteConnectionChangeEvent;
import org.eclipse.remote.core.IRemoteConnectionChangeListener;
@ -49,8 +50,6 @@ import com.jcraft.jsch.UserInfo;
* @since 5.0
*/
public class JSchConnection implements IRemoteConnection {
private final boolean logging = false;
/**
* Class to supply credentials from connection attributes without user interaction.
*/
@ -62,6 +61,22 @@ public class JSchConnection implements IRemoteConnection {
fAuthenticator = authenticator;
}
@Override
public String getPassphrase() {
if (logging) {
System.out.println("getPassphrase"); //$NON-NLS-1$
}
return JSchConnection.this.getPassphrase();
}
@Override
public String getPassword() {
if (logging) {
System.out.println("getPassword"); //$NON-NLS-1$
}
return JSchConnection.this.getPassword();
}
@Override
public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt,
boolean[] echo) {
@ -81,19 +96,22 @@ public class JSchConnection implements IRemoteConnection {
}
@Override
public String getPassphrase() {
public boolean promptPassphrase(String message) {
if (logging) {
System.out.println("getPassphrase"); //$NON-NLS-1$
System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
}
return JSchConnection.this.getPassphrase();
}
@Override
public String getPassword() {
if (logging) {
System.out.println("getPassword"); //$NON-NLS-1$
if (firstTry && !getPassphrase().equals("")) { //$NON-NLS-1$
firstTry = false;
return true;
}
return JSchConnection.this.getPassword();
if (fAuthenticator != null) {
PasswordAuthentication auth = fAuthenticator.prompt(null, message);
if (auth == null) {
return false;
}
fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, new String(auth.getPassword()));
}
return true;
}
@Override
@ -116,25 +134,6 @@ public class JSchConnection implements IRemoteConnection {
return true;
}
@Override
public boolean promptPassphrase(String message) {
if (logging) {
System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
}
if (firstTry && !getPassphrase().equals("")) { //$NON-NLS-1$
firstTry = false;
return true;
}
if (fAuthenticator != null) {
PasswordAuthentication auth = fAuthenticator.prompt(null, message);
if (auth == null) {
return false;
}
fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, new String(auth.getPassword()));
}
return true;
}
@Override
public boolean promptYesNo(String message) {
if (logging) {
@ -160,6 +159,8 @@ public class JSchConnection implements IRemoteConnection {
}
}
private final boolean logging = false;
public static final int DEFAULT_PORT = 22;
public static final int DEFAULT_TIMEOUT = 5;
public static final boolean DEFAULT_IS_PASSWORD = true;
@ -273,6 +274,22 @@ public class JSchConnection implements IRemoteConnection {
return getName().compareTo(o.getName());
}
/**
* Execute the command and return the result as a string.
*
* @param cmd
* command to execute
* @param monitor
* progress monitor
* @return result of command
* @throws RemoteConnectionException
*/
private String executeCommand(String cmd, IProgressMonitor monitor) throws RemoteConnectionException {
ExecCommand exec = new ExecCommand(this);
monitor.subTask(NLS.bind(Messages.JSchConnection_Executing_command, cmd));
return exec.setCommand(cmd).getResult(monitor).trim();
}
/**
* Notify all fListeners when this connection's status changes.
*
@ -439,9 +456,8 @@ public class JSchConnection implements IRemoteConnection {
*/
private String getCwd(IProgressMonitor monitor) {
SubMonitor subMon = SubMonitor.convert(monitor, 10);
ExecCommand exec = new ExecCommand(this);
try {
return exec.setCommand("pwd").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
return executeCommand("pwd", subMon.newChild(10)); //$NON-NLS-1$
} catch (RemoteConnectionException e) {
// Ignore
}
@ -660,8 +676,7 @@ public class JSchConnection implements IRemoteConnection {
private void loadEnv(IProgressMonitor monitor) throws RemoteConnectionException {
SubMonitor subMon = SubMonitor.convert(monitor, 10);
ExecCommand exec = new ExecCommand(this);
String env = exec.setCommand("printenv").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
String env = executeCommand("printenv", subMon.newChild(10)); //$NON-NLS-1$
String[] vars = env.split("\n"); //$NON-NLS-1$
for (String var : vars) {
String[] kv = var.split("="); //$NON-NLS-1$
@ -728,31 +743,30 @@ public class JSchConnection implements IRemoteConnection {
fProperties.put(LINE_SEPARATOR_PROPERTY, "\n"); //$NON-NLS-1$
fProperties.put(USER_HOME_PROPERTY, getWorkingDirectory());
ExecCommand exec = new ExecCommand(this);
String osVersion;
String osArch;
String osName = exec.setCommand("uname").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
String osName = executeCommand("uname", subMon.newChild(10)); //$NON-NLS-1$
if (osName.equalsIgnoreCase("Linux")) { //$NON-NLS-1$
osArch = exec.setCommand("uname -m").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osVersion = exec.setCommand("uname -r").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
osVersion = executeCommand("uname -r", subMon.newChild(10)); //$NON-NLS-1$
} else if (osName.equalsIgnoreCase("Darwin")) { //$NON-NLS-1$
osName = exec.setCommand("sw_vers -productName").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osVersion = exec.setCommand("sw_vers -productVersion").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osArch = exec.setCommand("uname -m").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osName = executeCommand("sw_vers -productName", subMon.newChild(10)); //$NON-NLS-1$
osVersion = executeCommand("sw_vers -productVersion", subMon.newChild(10)); //$NON-NLS-1$
osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
if (osArch.equalsIgnoreCase("i386")) { //$NON-NLS-1$
String opt = exec.setCommand("sysctl -n hw.optional.x86_64").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
String opt = executeCommand("sysctl -n hw.optional.x86_64", subMon.newChild(10)); //$NON-NLS-1$
if (opt.equals("1")) { //$NON-NLS-1$
osArch = "x86_64"; //$NON-NLS-1$
}
}
} else if (osName.equalsIgnoreCase("AIX")) { //$NON-NLS-1$
osArch = exec.setCommand("uname -p").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osVersion = exec.setCommand("oslevel").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
osArch = executeCommand("uname -p", subMon.newChild(10)); //$NON-NLS-1$
osVersion = executeCommand("oslevel", subMon.newChild(10)); //$NON-NLS-1$
if (osArch.equalsIgnoreCase("powerpc")) { //$NON-NLS-1$
/* Make the architecture match what Linux produces: either ppc or ppc64 */
osArch = "ppc"; //$NON-NLS-1$
/* Get Kernel type either 32-bit or 64-bit */
String opt = exec.setCommand("prtconf -k").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
String opt = executeCommand("prtconf -k", subMon.newChild(10)); //$NON-NLS-1$
if (opt.indexOf("64-bit") > 0) { //$NON-NLS-1$
osArch += "64"; //$NON-NLS-1$
}

View file

@ -12,6 +12,7 @@
package org.eclipse.remote.internal.jsch.core.commands;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@ -45,6 +46,9 @@ import com.jcraft.jsch.SftpProgressMonitor;
public abstract class AbstractRemoteCommand<T> {
protected static class CommandProgressMonitor implements SftpProgressMonitor {
private final IProgressMonitor fMonitor;
private double fWorkPercentFactor;
private Long fMaxWorkKB;
private long fWorkToDate;
public CommandProgressMonitor(IProgressMonitor monitor) {
fMonitor = monitor;
@ -52,6 +56,13 @@ public abstract class AbstractRemoteCommand<T> {
@Override
public boolean count(long count) {
fWorkToDate += count;
Long workToDateKB = new Long(fWorkToDate / 1024L);
Double workPercent = new Double(fWorkPercentFactor * fWorkToDate);
String subDesc = MessageFormat.format(Messages.AbstractRemoteCommand_format,
new Object[] { workToDateKB, fMaxWorkKB, workPercent });
fMonitor.subTask(subDesc);
fMonitor.worked((int) count);
return !(fMonitor.isCanceled());
}
@ -63,9 +74,10 @@ public abstract class AbstractRemoteCommand<T> {
@Override
public void init(int op, String src, String dest, long max) {
String srcFile = new Path(src).lastSegment();
String desc = srcFile;
fMonitor.beginTask(desc, (int) max);
fWorkPercentFactor = 1.0 / max;
fMaxWorkKB = new Long(max / 1024L);
fWorkToDate = 0;
fMonitor.beginTask(new Path(src).lastSegment(), (int) max);
}
}

View file

@ -11,7 +11,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSchException;
@ -60,7 +59,6 @@ public class ChildInfosCommand extends AbstractRemoteCommand<IFileInfo[]> {
}
};
try {
subMon.subTask(Messages.ChildInfosCommand_Get_file_attributes);
return c.getResult(subMon.newChild(10));
} catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage());

View file

@ -7,7 +7,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
@ -34,7 +33,6 @@ public class FetchInfoCommand extends AbstractRemoteCommand<IFileInfo> {
};
SftpATTRS attrs;
try {
subMon.subTask(Messages.FetchInfoCommand_Fetch_info);
attrs = c.getResult(subMon.newChild(10));
return convertToFileInfo(fRemotePath, attrs, subMon.newChild(10));
} catch (SftpException e) {

View file

@ -6,7 +6,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
@ -45,7 +44,6 @@ public class MkdirCommand extends AbstractRemoteCommand<Void> {
}
};
try {
subMon.subTask(Messages.MkdirCommand_Create_directory);
c.getResult(subMon.newChild(10));
} catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage());

View file

@ -7,7 +7,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
@ -63,7 +62,6 @@ public class PutInfoCommand extends AbstractRemoteCommand<Void> {
}
};
try {
subMon.subTask(Messages.PutInfoCommand_Change_permissions);
c.getResult(subMon.newChild(10));
} catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage());
@ -80,7 +78,6 @@ public class PutInfoCommand extends AbstractRemoteCommand<Void> {
}
};
try {
subMon.subTask(Messages.PutInfoCommand_Set_modified_time);
c.getResult(subMon.newChild(10));
} catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage());

View file

@ -16,21 +16,18 @@ import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
private static final String BUNDLE_ID = "org.eclipse.remote.internal.jsch.core.messages.messages"; //$NON-NLS-1$
public static String AbstractRemoteCommand_Execution_exception;
public static String AbstractRemoteCommand_format;
public static String AbstractRemoteCommand_Get_symlink_target;
public static String AbstractRemoteCommand_Operation_cancelled_by_user;
public static String AuthInfo_Authentication_message;
public static String ChildInfosCommand_Get_file_attributes;
public static String DeleteCommand_Remove_file;
public static String ExecCommand_Exec_command;
public static String FetchInfoCommand_Fetch_info;
public static String GetInputStreamCommand_Get_input_stream;
public static String JSchConnection_Connection_was_cancelled;
public static String JSchConnection_connectionNotOpen;
public static String JSchConnection_Executing_command;
public static String JSchConnection_remote_address_must_be_set;
public static String JSchConnection_remotePort;
public static String RemoteToolsConnection_open;
public static String JSchConnection_forwarding;
public static String JSchConnection_Remote_host_does_not_support_sftp;
public static String JSchConnection_Unable_to_open_sftp_channel;
@ -46,22 +43,6 @@ public class Messages extends NLS {
public static String JschFileStore_No_remote_services_found_for_URI;
public static String JschFileStore_The_file_of_name_already_exists;
public static String JschFileStore_The_parent_of_directory_does_not_exist;
public static String MkdirCommand_Create_directory;
public static String PutInfoCommand_Change_permissions;
public static String PutInfoCommand_Set_modified_time;
public static String RemoteToolsFileStore_0;
public static String RemoteToolsFileStore_1;
public static String RemoteToolsFileStore_2;
public static String RemoteToolsFileStore_3;
public static String RemoteToolsFileStore_4;
public static String RemoteToolsFileStore_5;
public static String RemoteToolsFileStore_6;
public static String RemoteToolsFileStore_7;
public static String RemoteToolsFileStore_8;
public static String RemoteToolsFileStore_10;
public static String RemoteToolsFileStore_12;
public static String RemoteToolsFileStore_13;
public static String RemoteToolsFileStore_14;
static {
// load message values from bundle file

View file

@ -8,20 +8,16 @@
# Contributors:
# IBM Corporation - initial implementation
###############################################################################
AbstractRemoteCommand_format={0,number,integer} KB of {1,number,integer} KB complete ({2,number,percent})
AbstractRemoteCommand_Get_symlink_target=Get symlink target
AbstractRemoteCommand_Operation_cancelled_by_user=Operation cancelled by user
AbstractRemoteCommand_Execution_exception=Execution exception
AuthInfo_Authentication_message=Authentication Message
ChildInfosCommand_Get_file_attributes=Get file attributes
DeleteCommand_Remove_file=Remove file
ExecCommand_Exec_command=Executing command "{0}"
FetchInfoCommand_Fetch_info=Fetch info
GetInputStreamCommand_Get_input_stream=Get input stream
JSchConnection_Connection_was_cancelled=Connection was cancelled
JSchConnection_connectionNotOpen=Connection is not open
JSchConnection_Executing_command=Executing command "{0}"
JSchConnection_remote_address_must_be_set=Remote address must be set before opening connection
JSchConnection_remotePort=Could not allocate remote port
RemoteToolsConnection_open=Opening connection...
JSchConnection_forwarding=Setting up remote forwarding
JSchConnection_Remote_host_does_not_support_sftp=Remote host does not support sftp. Remote functionality requires sftp to be enabled
JSchConnection_Unable_to_open_sftp_channel=Unable to open sftp channel: check sftp is enabled on remote host
@ -37,19 +33,3 @@ JschFileStore_Is_a_directory={0} is a directory
JschFileStore_No_remote_services_found_for_URI=No remote services found for URI: "{0}"
JschFileStore_The_file_of_name_already_exists=A file of name {0} already exists
JschFileStore_The_parent_of_directory_does_not_exist=The parent of directory {0} does not exist
MkdirCommand_Create_directory=Create directory
PutInfoCommand_Change_permissions=Change permissions
PutInfoCommand_Set_modified_time=Set modified time
RemoteToolsFileStore_0=Could not delete file {0}
RemoteToolsFileStore_1=The parent of directory {0} does not exist
RemoteToolsFileStore_2=The directory {0} could not be created
RemoteToolsFileStore_3={0} is a directory
RemoteToolsFileStore_4=Could not get input stream for {0}
RemoteToolsFileStore_5=Service failed to initialize
RemoteToolsFileStore_6=Could not open output stream
RemoteToolsFileStore_7=Invalid URI format
RemoteToolsFileStore_8=Invalid connection name: {0}
RemoteToolsFileStore_10=Unable to open connection: {0}
RemoteToolsFileStore_12=Operation was cancelled by user
RemoteToolsFileStore_13=A file of name {0} already exists
RemoteToolsFileStore_14=File doesn't exist: {0}