00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.core.process.filetransfer;
00032
00033 import java.util.ArrayList;
00034
00035 import org.objectweb.proactive.core.process.filetransfer.FileTransferDefinition.*;
00036
00037
00046 public class SecureCopyProtocol extends AbstractCopyProtocol {
00047 protected String COMMAND = "scp";
00048 protected String PARAMS = "-pr";
00049
00050 public SecureCopyProtocol(String name) {
00051 super(name);
00052 }
00053
00057 public boolean startFileTransfer() {
00058 int globalReturnCode = 1;
00059
00060 String homocommand = buildHomonymousTransfer();
00061 String[] heterocommand = buildHeteronymousTransfer();
00062
00063
00064 String[] allCommands = new String[(homocommand.length() > 0)
00065 ? (heterocommand.length + 1) : heterocommand.length];
00066
00067 if (homocommand.length() > 0) {
00068 allCommands[allCommands.length - 1] = homocommand;
00069 }
00070 for (int i = 0; i < heterocommand.length; i++)
00071 allCommands[i] = heterocommand[i];
00072
00073 Process[] allProcess = new Process[allCommands.length];
00074
00075
00076 if (logger.isDebugEnabled()) {
00077 logger.debug(homocommand);
00078 for (int i = 0; i < heterocommand.length; i++)
00079 logger.debug(heterocommand[i]);
00080 }
00081
00082
00083
00084
00085
00086 for (int i = 0; i < allProcess.length; i++) {
00087 try {
00088 int returnCode;
00089 allProcess[i] = Runtime.getRuntime().exec(allCommands[i]);
00090 returnCode = allProcess[i].waitFor();
00091 if (returnCode != 0) {
00092 logger.error(getErrorMessage(allProcess[i].getErrorStream()));
00093 } else {
00094 globalReturnCode = returnCode;
00095 }
00096 } catch (Exception e) {
00097 logger.error("Error forking scp");
00098 e.printStackTrace();
00099 }
00100 }
00101
00102 return globalReturnCode == 0;
00103 }
00104
00105 private String buildHomonymousTransfer() {
00106 FileDescription[] files = getHomonymousAll();
00107
00108
00109 if (files.length <= 0) {
00110 return "";
00111 }
00112
00113
00114 StringBuilder sb = new StringBuilder();
00115 sb.append(COMMAND);
00116
00117
00118 sb.append(" ").append(PARAMS);
00119
00120
00121 for (int i = 0; i < files.length; i++) {
00122
00123 String fullfilename = FileTransferWorkShop.buildFilePathString(srcInfoParams,
00124 files[i].getSrcName());
00125
00126
00127 if (!FileTransferWorkShop.isLocalReadable(fullfilename)) {
00128
00129 if (logger.isDebugEnabled()) {
00130 logger.debug("Skipping: " + fullfilename);
00131 }
00132 continue;
00133 }
00134
00135 sb.append(" ");
00136 sb.append(fullfilename);
00137 }
00138
00139 sb.append(" ");
00140 if (dstInfoParams.username.length() > 0) {
00141 sb.append(dstInfoParams.username).append("@");
00142 }
00143 sb.append(dstInfoParams.hostname).append(":");
00144 sb.append(dstInfoParams.getPrefix());
00145
00146 return sb.toString();
00147 }
00148
00149 private String[] buildHeteronymousTransfer() {
00150 FileDescription[] files = getHeteronymousAll();
00151 ArrayList<String> command = new ArrayList<String>();
00152
00153
00154 for (int i = 0; i < files.length; i++) {
00155 String fullfilename = FileTransferWorkShop.buildFilePathString(srcInfoParams,
00156 files[i].getSrcName());
00157
00158
00159 if (!FileTransferWorkShop.isLocalReadable(fullfilename)) {
00160 if (logger.isDebugEnabled()) {
00161 logger.debug("Skipping: " + fullfilename);
00162 }
00163 continue;
00164 }
00165
00166 StringBuilder sb = new StringBuilder();
00167
00168
00169 sb.append(COMMAND).append(" ").append(PARAMS).append(" ");
00170
00171
00172 sb.append(fullfilename);
00173
00174
00175 sb.append(" ");
00176 if (dstInfoParams.username.length() > 0) {
00177 sb.append(dstInfoParams.username).append("@");
00178 }
00179 sb.append(dstInfoParams.hostname).append(":");
00180
00181 sb.append(FileTransferWorkShop.buildFilePathString(dstInfoParams,
00182 files[i].getDestName()));
00183
00184 command.add(sb.toString());
00185 }
00186
00187 return command.toArray(new String[0]);
00188 }
00189
00193 public boolean checkProtocol() {
00194 boolean retval = true;
00195 if (dstInfoParams.hostname.length() <= 0) {
00196 logger.error("Destination hostname not specified");
00197 retval = false;
00198 }
00199
00200 return retval;
00201 }
00202
00203 static public void main(String[] args) {
00204
00205 FileTransferWorkShop fts = new FileTransferWorkShop("scp");
00206
00207 FileTransferDefinition ft1 = new FileTransferDefinition("1");
00208 FileTransferDefinition ft2 = new FileTransferDefinition("2");
00209
00210 ft1.addFile("homofile1", "homofile1");
00211 ft1.addFile("heterofile1A", "heterofile1B");
00212 ft1.addDir("homodir1", "homodir1");
00213 ft1.addDir("heterodir1A", "heterodir1B");
00214
00215 ft2.addFile("homofile2", "homofile2");
00216 ft2.addFile("heterofile2A", "heterofile2B");
00217 ft2.addDir("homodir2", "homodir2");
00218 ft2.addDir("heterodir2A", "heterodir2B");
00219
00220 fts.addFileTransfer(ft1);
00221 fts.addFileTransfer(ft2);
00222 fts.setFileTransferCopyProtocol("processDefault");
00223 fts.dstInfoParams.setInfoParameter("username", "mleyton");
00224 fts.dstInfoParams.setInfoParameter("hostname", "plugrid1.inria.fr");
00225 fts.dstInfoParams.setInfoParameter("prefix",
00226 "/auto/owenii/u/owenii/home/mleyton");
00227 fts.srcInfoParams.setInfoParameter("prefix", "/home/USER");
00228
00229 CopyProtocol[] cp = fts.getCopyProtocols();
00230
00231 for (int i = 0; i < cp.length; i++)
00232 cp[i].startFileTransfer();
00233 }
00234 }