Browse Source

Add progress report to <scp>.

Submitted by:	Rami Ojares


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276288 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 21 years ago
parent
commit
8ec6497d89
6 changed files with 137 additions and 15 deletions
  1. +2
    -1
      CONTRIBUTORS
  2. +38
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java
  3. +15
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java
  4. +5
    -4
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java
  5. +29
    -4
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java
  6. +48
    -6
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java

+ 2
- 1
CONTRIBUTORS View File

@@ -148,8 +148,9 @@ Peter Reilly
Phillip Wells Phillip Wells
Pierre Delisle Pierre Delisle
Pierre Dittgen Pierre Dittgen
Raphael Pierquin
R Handerson R Handerson
Rami Ojares
Raphael Pierquin
Richard Evans Richard Evans
Rick Beton Rick Beton
Robert Anderson Robert Anderson


+ 38
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java View File

@@ -32,6 +32,7 @@ import org.apache.tools.ant.BuildException;
public abstract class AbstractSshMessage { public abstract class AbstractSshMessage {


private Session session; private Session session;
private boolean verbose;
private LogListener listener = new LogListener() { private LogListener listener = new LogListener() {
public void log(String message) { public void log(String message) {
// do nothing; // do nothing;
@@ -39,6 +40,14 @@ public abstract class AbstractSshMessage {
}; };


public AbstractSshMessage(Session session) { public AbstractSshMessage(Session session) {
this(false, session);
}

/**
* @since Ant 1.6.2
*/
public AbstractSshMessage(boolean verbose, Session session) {
this.verbose = verbose;
this.session = session; this.session = session;
} }


@@ -114,4 +123,33 @@ public abstract class AbstractSshMessage {
+ " Average Rate: " + format.format(totalLength / duration) + " Average Rate: " + format.format(totalLength / duration)
+ " B/s"); + " B/s");
} }

/**
* @since Ant 1.6.2
*/
protected final boolean getVerbose() {
return verbose;
}

/*
* Track progress every 10% if 100kb < filesize < 1mb. For larger
* files track progress for every percent transmitted.
*/
protected final int trackProgress(int filesize, int totalLength,
int percentTransmitted) {

int percent = (int) Math.round(Math.floor((totalLength
/ (double)filesize)
* 100));
if (percent > percentTransmitted) {
if (filesize < 1048576 && (percent % 10 != 0)) {
// do not track between tenths
} else {
log("" + percent + "%");
}
}

return percent;
}

} }

+ 15
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java View File

@@ -40,6 +40,7 @@ public abstract class SSHBase extends Task implements LogListener {
private String knownHosts; private String knownHosts;
private int port = SSH_PORT; private int port = SSH_PORT;
private boolean failOnError = true; private boolean failOnError = true;
private boolean verbose;
private SSHUserInfo userInfo; private SSHUserInfo userInfo;


/** /**
@@ -71,6 +72,20 @@ public abstract class SSHBase extends Task implements LogListener {
return failOnError; return failOnError;
} }


/**
* @since Ant 1.6.2
*/
public void setVerbose(boolean failure) {
verbose = failure;
}

/**
* @since Ant 1.6.2
*/
public boolean getVerbose() {
return verbose;
}

/** /**
* Username known to remote host. * Username known to remote host.
* *


+ 5
- 4
src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java View File

@@ -140,7 +140,7 @@ public class Scp extends SSHBase {
try { try {
session = openSession(); session = openSession();
ScpFromMessage message = ScpFromMessage message =
new ScpFromMessage(session, file,
new ScpFromMessage(getVerbose(), session, file,
getProject().resolveFile(toPath), getProject().resolveFile(toPath),
fromSshUri.endsWith("*")); fromSshUri.endsWith("*"));
log("Receiving file: " + file); log("Receiving file: " + file);
@@ -169,7 +169,8 @@ public class Scp extends SSHBase {
} }
if (!list.isEmpty()) { if (!list.isEmpty()) {
session = openSession(); session = openSession();
ScpToMessage message = new ScpToMessage(session, list, file);
ScpToMessage message = new ScpToMessage(getVerbose(), session,
list, file);
message.setLogListener(this); message.setLogListener(this);
message.execute(); message.execute();
} }
@@ -188,8 +189,8 @@ public class Scp extends SSHBase {
try { try {
session = openSession(); session = openSession();
ScpToMessage message = ScpToMessage message =
new ScpToMessage(session, getProject().resolveFile(fromPath),
file);
new ScpToMessage(getVerbose(), session,
getProject().resolveFile(fromPath), file);
message.setLogListener(this); message.setLogListener(this);
message.execute(); message.execute();
} finally { } finally {


+ 29
- 4
src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java View File

@@ -38,14 +38,25 @@ public class ScpFromMessage extends AbstractSshMessage {
private File localFile; private File localFile;
private boolean isRecursive = false; private boolean isRecursive = false;


/**
* @since Ant 1.6.2
*/
public ScpFromMessage(boolean verbose,
Session session,
String aRemoteFile,
File aLocalFile,
boolean recursive) {
super(verbose, session);
this.remoteFile = aRemoteFile;
this.localFile = aLocalFile;
this.isRecursive = recursive;
}

public ScpFromMessage(Session session, public ScpFromMessage(Session session,
String aRemoteFile, String aRemoteFile,
File aLocalFile, File aLocalFile,
boolean recursive) { boolean recursive) {
super(session);
this.remoteFile = aRemoteFile;
this.localFile = aLocalFile;
this.isRecursive = recursive;
this(false, session, aRemoteFile, aLocalFile, recursive);
} }


public void execute() throws IOException, JSchException { public void execute() throws IOException, JSchException {
@@ -153,6 +164,14 @@ public class ScpFromMessage extends AbstractSshMessage {
int length; int length;
int totalLength = 0; int totalLength = 0;
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();

// only track progress for files larger than 100kb in verbose mode
boolean trackProgress = getVerbose() && filesize > 102400;
// since filesize keeps on decreasing we have to store the
// initial filesize
int initFilesize = filesize;
int percentTransmitted = 0;

try { try {
while (true) { while (true) {
length = in.read(buf, 0, length = in.read(buf, 0,
@@ -166,6 +185,12 @@ public class ScpFromMessage extends AbstractSshMessage {
if (filesize == 0) { if (filesize == 0) {
break; break;
} }

if (trackProgress) {
percentTransmitted = trackProgress(initFilesize,
totalLength,
percentTransmitted);
}
} }
} finally { } finally {
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();


+ 48
- 6
src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java View File

@@ -36,22 +36,50 @@ public class ScpToMessage extends AbstractSshMessage {
private String remotePath; private String remotePath;
private List directoryList; private List directoryList;


public ScpToMessage(Session session,
/**
* @since Ant 1.6.2
*/
public ScpToMessage(boolean verbose,
Session session,
File aLocalFile, File aLocalFile,
String aRemotePath) { String aRemotePath) {
super(session);
this(verbose, session, aRemotePath);


this.localFile = aLocalFile; this.localFile = aLocalFile;
}

/**
* @since Ant 1.6.2
*/
public ScpToMessage(boolean verbose,
Session session,
List aDirectoryList,
String aRemotePath) {
this(verbose, session, aRemotePath);

this.directoryList = aDirectoryList;
}

/**
* @since Ant 1.6.2
*/
private ScpToMessage(boolean verbose,
Session session,
String aRemotePath) {
super(verbose, session);
this.remotePath = aRemotePath; this.remotePath = aRemotePath;
} }


public ScpToMessage(Session session,
File aLocalFile,
String aRemotePath) {
this(false, session, aLocalFile, aRemotePath);
}

public ScpToMessage(Session session, public ScpToMessage(Session session,
List aDirectoryList, List aDirectoryList,
String aRemotePath) { String aRemotePath) {
super(session);

this.directoryList = aDirectoryList;
this.remotePath = aRemotePath;
this(false, session, aDirectoryList, aRemotePath);
} }


public void execute() throws IOException, JSchException { public void execute() throws IOException, JSchException {
@@ -150,6 +178,14 @@ public class ScpToMessage extends AbstractSshMessage {
byte[] buf = new byte[BUFFER_SIZE]; byte[] buf = new byte[BUFFER_SIZE];
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
int totalLength = 0; int totalLength = 0;

// only track progress for files larger than 100kb in verbose mode
boolean trackProgress = getVerbose() && filesize > 102400;
// since filesize keeps on decreasing we have to store the
// initial filesize
int initFilesize = filesize;
int percentTransmitted = 0;

try { try {
log("Sending: " + localFile.getName() + " : " + localFile.length()); log("Sending: " + localFile.getName() + " : " + localFile.length());
while (true) { while (true) {
@@ -159,6 +195,12 @@ public class ScpToMessage extends AbstractSshMessage {
} }
out.write(buf, 0, len); out.write(buf, 0, len);
totalLength += len; totalLength += len;

if (trackProgress) {
percentTransmitted = trackProgress(initFilesize,
totalLength,
percentTransmitted);
}
} }
out.flush(); out.flush();
sendAck(out); sendAck(out);


Loading…
Cancel
Save