/** FTP over SSH
*
* Requires jcraft/jsch
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import com.jcraft.jsch.*;
import javaforce.*;
public class SiteSFTP extends SiteFTP implements SftpProgressMonitor {
private ChannelSftp channel;
private Session jschsession;
private JSch jsch;
private class MyUserInfo implements UserInfo {
public String password;
public MyUserInfo(String password) {this.password = password;}
public String getPassword(){
return password;
}
public boolean promptYesNo(String str){
return true;
}
public String getPassphrase(){ return null; }
public boolean promptPassphrase(String message){ return true; }
public boolean promptPassword(String message){ return true; }
public void showMessage(String message){
JFLog.log(message);
}
}
@Override
public boolean connect(SiteDetails sd) {
try {
jsch = new JSch();
setStatus("Connecting...");
jschsession = jsch.getSession(sd.username, sd.host, Integer.valueOf(sd.port));
//System.out.println("session = " + jschsession);
if (sd.sshKey.length() == 0) {
jschsession.setPassword(sd.password);
jschsession.setUserInfo(new MyUserInfo(sd.password));
} else {
JFLog.log("using key:" + sd.sshKey);
jsch.addIdentity(sd.sshKey);
java.util.Properties config = new java.util.Properties ();
config.put("StrictHostKeyChecking", "no");
jschsession.setConfig(config);
}
setStatus("Login...");
jschsession.connect(30000);
channel = (ChannelSftp) jschsession.openChannel("sftp");
//System.out.println("channel = " + channel);
channel.connect(30000);
if (sd.remoteDir.length() > 0) {
channel.cd(sd.remoteDir);
}
remote_ls();
setStatus(null);
} catch (Exception e) {
JF.showMessage("Error", "Error:" + e);
JFLog.log(e);
closeSite();
return false;
}
return true;
}
@Override
public void disconnect() {
try {
channel.disconnect();
jschsession.disconnect();
} catch (Exception e) {}
}
@Override
public String remote_pwd() {
String wd;
try {
wd = channel.pwd();
int i1 = wd.indexOf("\"");
if (i1 != -1) {
//the reply is ["path" is your current location]
int i2 = wd.lastIndexOf("\"");
if (i1 == i2) return "/";
wd = wd.substring(i1+1, i2);
}
} catch (Exception e) {
return "/";
}
return wd;
}
@Override
public void remote_ls() {
try {
String wd = remote_pwd();
remoteDir.setText(wd);
remoteDir.setText(wd);
Vector<ChannelSftp.LsEntry> ls;
ls = channel.ls(".");
String lsstr = "";
for(int a=0;a<ls.size();a++) {
lsstr += ls.get(a).toString() + "\n";
}
parseRemote(wd, lsstr);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void remote_chdir(String path) {
try {
channel.cd(path);
remote_ls();
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void download_file(File remote, File local) {
total = 0;
try {
FileOutputStream fos = new FileOutputStream(local);
//BUG : no progress!
channel.get(remote.getName(), fos, this);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void upload_file(File local, File remote) {
total = 0;
try {
FileInputStream fis = new FileInputStream(local);
//BUG : no progress!
channel.put(fis, remote.getName(), this);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void abort() {
aborted = true;
//TODO : channel.abort() ?
}
@Override
public void remote_mkdir(String file) {
try {
channel.mkdir(file);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void remote_delete_file(String file) {
try {
channel.rm(file);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void remote_delete_folder(String file) {
try {
channel.rmdir(file);
//update remoteTree
int idx = file.lastIndexOf("/");
if (idx != -1) file = file.substring(idx+1);
for(int a=0;a<remoteTag.getChildCount();a++) {
XML.XMLTag child = remoteTag.getChildAt(a);
if (child.getName().equals(file)) {
remoteFolders.deleteTag(child);
break;
}
}
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void remote_rename(String from, String to) {
try {
channel.rename(from, to);
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
@Override
public void setPerms(int value, String remoteFile) {
try {
channel.chmod(value, remoteFile);
remote_chdir("."); //refresh
} catch (Exception e) {
setStatus("Error:" + e);
JFLog.log(e);
addLog("Error:" + e);
}
}
private int total;
//SftpProgressMonitor
public void init(int op, String src, String dest, long max) {
// JFLog.log("sftp:init");
total = 0;
}
public boolean count(long l) {
// JFLog.log("sftp:count:" + l);
total += l;
setProgress(total);
return true; //continue operation
}
public void end() {
}
}