package com.alibaba.jstorm.yarn.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import ch.ethz.ssh2.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Created by fengjian on 16/1/6.
*/
public class SSHOperations {
private String srcHost;
private String dstHost;
private String amHost;
private String user;
private String password;
private String oldPassword;
private static final Log LOG = LogFactory.getLog(SSHOperations.class);
public SSHOperations(String srcHost, String dstHost, String amHost, String user, String password, String oldPassword) {
this.srcHost = srcHost;
this.dstHost = dstHost;
this.amHost = amHost;
this.user = user;
this.password = password;
this.oldPassword = oldPassword;
}
/**
* get remoteFile from specific srcHost and directory
*
* @return true or false
*/
public boolean scpGet(String remoteFile, String localDir, String dst, String instanceName) {
LOG.info("remoteFile:" + remoteFile + " localdir:" + localDir +
" dst:" + dst + " instanceName:" + instanceName);
LOG.info("srchost:" + srcHost + " dsthost:" + dstHost + " amHost:" + amHost);
ScpFrom scpFrom = new ScpFrom(srcHost, user, password);
ScpTo scpTo = new ScpTo(dstHost, user, password);
Exec exec = new Exec(srcHost, user, password);
try {
String execCommand = "cd " + remoteFile + " && cd .. && tar -cf " + instanceName + ".tar "
+ instanceName;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception ex) {
try {
exec = new Exec(srcHost, user, oldPassword);
String execCommand = "cd " + remoteFile + " && cd .. && tar -cf " + instanceName + ".tar "
+ instanceName;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + password);
return false;
}
}
try {
//
if (!amHost.split("/")[1].equals(srcHost) && !amHost.split("/")[0].equals(srcHost)) {
scpFrom.getRemoteFile(remoteFile + ".tar", localDir);
LOG.info("getRemoteFile:" + remoteFile + ".tar");
}
} catch (Exception ex) {
try {
scpFrom = new ScpFrom(srcHost, user, oldPassword);
scpFrom.getRemoteFile(remoteFile + ".tar", localDir);
LOG.info("getRemoteFile:" + remoteFile + ".tar");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + password);
return false;
}
}
try {
if (!amHost.split("/")[1].equals(dstHost) && !amHost.split("/")[0].equals(dstHost)) {
//put file to remote
scpTo.putFile(localDir + instanceName + ".tar", localDir);
LOG.info("putFileToRemote:" + remoteFile + ".tar");
}
} catch (Exception ex) {
try {
scpTo = new ScpTo(srcHost, user, oldPassword);
scpTo.putFile(remoteFile + ".tar", localDir);
LOG.info("putFileToRemote:" + remoteFile + ".tar");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + oldPassword);
return false;
}
}
try {
Exec execRemote = new Exec(dstHost, user, password);
execRemote.execute("cd " + localDir + " && tar -xf " + instanceName + ".tar");
} catch (Exception ex) {
try {
Exec execRemote = new Exec(dstHost, user, oldPassword);
execRemote.execute("cd " + localDir + " && tar -xf " + instanceName + ".tar");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + oldPassword);
return false;
}
}
return true;
}
public boolean mkdir(String dataPath, String containerId) {
Exec exec = new Exec(dstHost, user, password);
String path = dataPath + containerId;
try {
String execCommand = "mkdir " + path;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception ex) {
try {
exec = new Exec(dstHost, user, oldPassword);
String execCommand = "mkdir " + path;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + password);
return false;
}
}
return true;
}
/**
* get remoteFile from specific srcHost and directory
*
* @return true or false
*/
public boolean transferNimbusdata(String dataPath,String preDataPath, String preContainerId, String containerId, String instanceName) {
LOG.info("dataPath:" + dataPath + " preContainerId:" + preContainerId +
" containerId:" + containerId + " instanceName:" + instanceName);
LOG.info("srchost:" + srcHost + " dsthost:" + dstHost + " amHost:" + amHost);
ScpFrom scpFrom = new ScpFrom(srcHost, user, password);
ScpTo scpTo = new ScpTo(dstHost, user, password);
Exec exec = new Exec(srcHost, user, password);
try {
String execCommand = "cd " + preDataPath + preContainerId + " && tar -cf " + instanceName + ".tar "
+ instanceName;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception ex) {
try {
exec = new Exec(srcHost, user, oldPassword);
String execCommand = "cd " + preDataPath + preContainerId + " && tar -cf " + instanceName + ".tar "
+ instanceName;
LOG.info("execCommand1:" + execCommand);
exec.execute(execCommand);
LOG.info("exec success");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + password);
return false;
}
}
try {
//
// if (!amHost.split("/")[1].equals(srcHost) && !amHost.split("/")[0].equals(srcHost)) {
String remoteFile = preDataPath + preContainerId + "/" + instanceName + ".tar";
scpFrom.getRemoteFile(remoteFile, dataPath);
LOG.info("getRemoteFile:" + remoteFile);
// }
} catch (Exception ex) {
try {
scpFrom = new ScpFrom(srcHost, user, oldPassword);
String remoteFile = preDataPath + preContainerId + "/" + instanceName + ".tar";
scpFrom.getRemoteFile(remoteFile, dataPath);
LOG.info("getRemoteFile:" + remoteFile);
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + password + " oldpassword:" + oldPassword);
return false;
}
}
try {
if (!amHost.split("/")[1].equals(dstHost) && !amHost.split("/")[0].equals(dstHost)) {
//put file to remote
String localFile = dataPath + instanceName + ".tar";
scpTo.putFile(localFile, dataPath);
LOG.info("putFileToRemote:" + localFile + " remoteDir:" + dataPath);
}
} catch (Exception ex) {
try {
if (!amHost.split("/")[1].equals(dstHost) && !amHost.split("/")[0].equals(dstHost)) {
scpTo = new ScpTo(dstHost, user, oldPassword);
String localFile = dataPath + instanceName + ".tar";
scpTo.putFile(localFile, dataPath);
LOG.info("putFileToRemote:" + localFile + " remoteDir:" + dataPath);
}
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + oldPassword);
return false;
}
}
try {
Exec execRemote = new Exec(dstHost, user, password);
String fileName = instanceName + ".tar";
LOG.info("cd " + dataPath + " && cp " + fileName + " " + containerId
+ "/ && cd " + containerId + "/ && tar -xf "
+ instanceName + ".tar");
execRemote.execute("cd " + dataPath + " && cp " + fileName + " " + containerId
+ "/ && cd " + containerId + "/ && tar -xf "
+ instanceName + ".tar");
} catch (Exception ex) {
try {
Exec execRemote = new Exec(dstHost, user, oldPassword);
String fileName = instanceName + ".tar";
execRemote.execute("cd " + dataPath + " && cp " + fileName + " " + containerId
+ "/ && cd " + containerId + "/ && tar -xf "
+ instanceName + ".tar");
} catch (Exception eex) {
LOG.error(eex);
LOG.error("username:" + user + " password:" + oldPassword);
return false;
}
}
return true;
}
public boolean GetPreviousData(String path) {
String user = "jian.feng";
String pass = "******";
Connection con = new Connection(srcHost);
try {
con.connect();
// boolean isAuthed = con.authenticateWithPassword(user, pass);
// System.out.println("isAuthed====" + isAuthed);
SCPClient scpClient = con.createSCPClient();
// scpClient.put("localFiles", "remoteDirectory"); //从本地复制文件到远程目录
scpClient.get("remoteFiles", ""); //从远程获取文件
//
// SFTPv3Client sftpClient = new SFTPv3Client(con);
// sftpClient.mkdir("newRemoteDir", 6); //远程新建目录
// sftpClient.rmdir(""); //远程删除目录
//
// sftpClient.createFile("newRemoteFile"); //远程新建文件
// sftpClient.openFileRW("remoteFile"); //远程打开文件,可进行读写
Session session = con.openSession();
session.execCommand("uname -a && date && uptime && who"); //远程执行命令
//显示执行命令后的信息
System.out.println("Here is some information about the remote srcHost:");
InputStream stdout = new StreamGobbler(session.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while (true) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
/* Show exit status, if available (otherwise "null") */
System.out.println("ExitCode: " + session.getExitStatus());
session.close();
con.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}