package io.sloeber.core.tools.uploaders;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ui.console.MessageConsoleStream;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import cc.arduino.packages.BoardPort;
import cc.arduino.packages.ssh.SCP;
import cc.arduino.packages.ssh.SSH;
import cc.arduino.packages.ssh.SSHClientSetupChainRing;
import cc.arduino.packages.ssh.SSHConfigFileSetup;
import cc.arduino.packages.ssh.SSHPwdSetup;
import io.sloeber.core.api.PasswordManager;
import io.sloeber.core.common.Common;
public class SSHUpload implements IRealUpload {
String myHost;
private MessageConsoleStream myHighLevelConsoleStream;
private MessageConsoleStream myOutconsole;
private MessageConsoleStream myErrconsole;
private String myUpLoadTool;
private IProject myProject;
SSHUpload(IProject project, String upLoadTool, MessageConsoleStream HighLevelConsoleStream,
MessageConsoleStream Outconsole, MessageConsoleStream Errconsole, String host) {
this.myHost = host;
this.myHighLevelConsoleStream = HighLevelConsoleStream;
this.myErrconsole = Errconsole;
this.myOutconsole = Outconsole;
this.myUpLoadTool = upLoadTool;
this.myProject = project;
}
@Override
public boolean uploadUsingPreferences(IFile hexFile, boolean usingProgrammer, IProgressMonitor monitor) {
boolean ret = true;
if (usingProgrammer) {
this.myHighLevelConsoleStream.println(Messages.Upload_error_network);
return false;
}
Session session = null;
SCP scp = null;
try {
JSch jSch = new JSch();
SSHClientSetupChainRing sshClientSetupChain = new SSHConfigFileSetup(new SSHPwdSetup());
BoardPort boardPort = new BoardPort();
boardPort.setBoardName(this.myHost);
session = sshClientSetupChain.setup(boardPort, jSch);
if (session != null) {
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); //$NON-NLS-1$ //$NON-NLS-2$
session.connect(30000);
scp = new SCP(session);
SSH ssh = new SSH(session);
this.myHighLevelConsoleStream
.println(Messages.Upload_sending_sketch + hexFile + Messages.Upload_to + this.myHost);
scpFiles(scp, hexFile);
this.myHighLevelConsoleStream.println(Messages.Upload_sketch_on_yun);
String remoteUploadCommand = Common.getBuildEnvironmentVariable(this.myProject,
"A.TOOLS." + this.myUpLoadTool.toUpperCase() + "_REMOTE.UPLOAD.PATTERN", //$NON-NLS-1$ //$NON-NLS-2$
"run-avrdude /tmp/sketch.hex "); //$NON-NLS-1$
this.myHighLevelConsoleStream.println("merge-sketch-with-bootloader.lua /tmp/sketch.hex"); //$NON-NLS-1$
ret = ssh.execSyncCommand("merge-sketch-with-bootloader.lua /tmp/sketch.hex", this.myOutconsole, //$NON-NLS-1$
this.myErrconsole);
this.myHighLevelConsoleStream.println("kill-bridge"); //$NON-NLS-1$
ssh.execSyncCommand("kill-bridge", this.myOutconsole, this.myErrconsole); //$NON-NLS-1$
this.myHighLevelConsoleStream.println(remoteUploadCommand);
ret = ret && ssh.execSyncCommand(remoteUploadCommand, this.myOutconsole, this.myErrconsole);
}
} catch (JSchException e) {
String message = e.getMessage();
String errormessage = new String();
if (Messages.Upload_auth_cancel.equals(message) || Messages.Upload_auth_fail.equals(message)) {
errormessage = new String(Messages.Upload_error_auth_fail) + this.myHost;
// TODO add to ask if if the user wants to remove the password
PasswordManager.ErasePassword(this.myHost);
}
if (e.getMessage().contains(Messages.Upload_connection_refused)) {
errormessage = new String(Messages.Upload_error_connection_refused) + this.myHost;
}
this.myHighLevelConsoleStream.println(errormessage);
this.myHighLevelConsoleStream.println(message);
return false;
} catch (Exception e) {
this.myHighLevelConsoleStream.println(e.getMessage());
return false;
} finally {
if (scp != null) {
scp.close();
}
if (session != null) {
session.disconnect();
}
}
return ret;
}
private void scpFiles(SCP scp, IFile hexFile) throws IOException {
File uploadFile = null;
try {
scp.open();
scp.startFolder("tmp"); //$NON-NLS-1$
uploadFile = hexFile.getLocation().toFile();
scp.sendFile(uploadFile, "sketch.hex"); //$NON-NLS-1$
scp.endFolder();
} catch (IOException e) {
this.myHighLevelConsoleStream.println(Messages.Upload_failed_upload + uploadFile);
throw (e);
} finally {
scp.close();
}
}
}