/*******************************************************************************
* Copyright (c) 2015 Red Hat.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.vagrant.ui.commands;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jsch.internal.core.JSchCorePlugin;
import org.eclipse.linuxtools.internal.vagrant.core.VagrantConnection;
import org.eclipse.linuxtools.vagrant.core.IVagrantVM;
import org.eclipse.linuxtools.vagrant.core.VagrantService;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tm.terminal.connector.ssh.launcher.SshLauncherDelegate;
public class SSHVMCommandHandler extends BaseVMCommandHandler {
private static final String JSCH_ID = "org.eclipse.jsch.core"; //$NON-NLS-1$
private static final String KEY = "PRIVATEKEY"; //$NON-NLS-1$
@Override
void executeInJob(final IVagrantVM vm, IProgressMonitor monitor) {
if (vm.ip() == null || vm.port() == 0 || vm.user() == null) {
Display.getDefault()
.syncExec(() -> MessageDialog.openError(Display.getCurrent()
.getActiveShell(),
Messages.SSHVMCommandHandler_failed,
Messages.SSHVMCommandHandler_bad_credentials));
return;
}
// org.eclipse.tm.terminal.connector.ssh.controls.SshWizardConfigurationPanel
Map<String, Object> properties = new HashMap<>();
properties.put("ssh.keep_alive", 300); //$NON-NLS-1$
properties.put("ip.port", vm.port()); //$NON-NLS-1$
properties.put("delegateId", //$NON-NLS-1$
"org.eclipse.tm.terminal.connector.ssh.launcher.ssh"); //$NON-NLS-1$
properties.put("selection", null); //$NON-NLS-1$
properties.put("ssh.password", ""); //$NON-NLS-1$ //$NON-NLS-2$
// TODO: Do this through API later
VagrantConnection conn = (VagrantConnection) VagrantService.getInstance();
if (!vm.identityFile().isEmpty()
&& !conn.isTrackedKey(vm.identityFile())) {
setupKeyPreferences(vm.identityFile());
}
properties.put("tm.terminal.connector.id", //$NON-NLS-1$
"org.eclipse.tm.terminal.connector.ssh.SshConnector"); //$NON-NLS-1$
properties.put("ip.host", vm.ip()); //$NON-NLS-1$
properties.put("ssh.user", vm.user()); //$NON-NLS-1$
properties.put("encoding", null); //$NON-NLS-1$
properties.put("timeout", 0); //$NON-NLS-1$
SshLauncherDelegate delegate = new SshLauncherDelegate();
delegate.execute(properties, null);
}
private void setupKeyPreferences(String identityFile) {
// org.eclipse.jsch.internal.core.IConstants.KEY_PRIVATEKEY
String currentKeys = InstanceScope.INSTANCE.getNode(JSCH_ID).get(KEY, ""); //$NON-NLS-1$
if (currentKeys.isEmpty()) {
currentKeys = DefaultScope.INSTANCE.getNode(JSCH_ID).get(KEY, ""); //$NON-NLS-1$
}
InstanceScope.INSTANCE.getNode(JSCH_ID).put(KEY, currentKeys + ',' + identityFile);
VagrantService.getInstance().addToTrackedKeys(identityFile);
// Ensure keys get reloaded
JSchCorePlugin.getPlugin().setNeedToLoadKeys(true);
}
@Override
String getJobName(final List<IVagrantVM> selectedVMs) {
return Messages.SSHVMCommandHandler_title;
}
@Override
String getTaskName(final IVagrantVM vm) {
return NLS.bind(Messages.SSHVMCommandHandler_msg, new String [] {vm.id(), vm.ip()});
}
}