rendered paste bodyIndex: src/net/sf/drftpd/master/BaseFtpConnection.java
===================================================================
--- src/net/sf/drftpd/master/BaseFtpConnection.java (revision 1232)
+++ src/net/sf/drftpd/master/BaseFtpConnection.java (working copy)
@@ -144,6 +144,8 @@
env.add("isbanned",""+
((user.getKeyedMap().getObjectDate(UserManagement.BAN_TIME)).getTime() >
System.currentTimeMillis()));
+ env.add("maxspeeddn",user.getMaxTransferSpeedDown());
+ env.add("maxspeedup",user.getMaxTransferSpeedUp());
// } else {
// env.add("user", "<unknown>");
}
Index: src/net/sf/drftpd/master/command/plugins/DataConnectionHandler.java
===================================================================
--- src/net/sf/drftpd/master/command/plugins/DataConnectionHandler.java (revision 1232)
+++ src/net/sf/drftpd/master/command/plugins/DataConnectionHandler.java (working copy)
@@ -1292,10 +1292,12 @@
//transfer
try {
+ long transferSpeedDown = conn.getUserNull().getMaxTransferSpeedDown();
+ long transferSpeedUp = conn.getUserNull().getMaxTransferSpeedUp();
//TODO ABORtable transfers
if (isRetr) {
_transfer.sendFile(_transferFile.getPath(), getType(),
- _resumePosition);
+ _resumePosition,transferSpeedDown);
while (true) {
status = _transfer.getTransferStatus();
@@ -1311,7 +1313,7 @@
}
} else if (isStor) {
_transfer.receiveFile(_transferFile.getPath(), getType(),
- _resumePosition);
+ _resumePosition,transferSpeedUp);
while (true) {
status = _transfer.getTransferStatus();
Index: src/net/sf/drftpd/mirroring/SlaveTransfer.java
===================================================================
--- src/net/sf/drftpd/mirroring/SlaveTransfer.java (revision 1232)
+++ src/net/sf/drftpd/mirroring/SlaveTransfer.java (working copy)
@@ -93,7 +93,7 @@
}
try {
- _destTransfer.receiveFile(_file.getPath(), 'I', 0);
+ _destTransfer.receiveFile(_file.getPath(), 'I', 0,0);
} catch (IOException e1) {
throw new DestinationSlaveException(e1);
} catch (SlaveUnavailableException e1) {
@@ -101,7 +101,7 @@
}
try {
- _srcTransfer.sendFile(_file.getPath(), 'I', 0);
+ _srcTransfer.sendFile(_file.getPath(), 'I', 0,0);
} catch (IOException e2) {
throw new SourceSlaveException(e2);
} catch (SlaveUnavailableException e2) {
Index: src/org/drftpd/usermanager/AbstractUser.java
===================================================================
--- src/org/drftpd/usermanager/AbstractUser.java (revision 1232)
+++ src/org/drftpd/usermanager/AbstractUser.java (working copy)
@@ -94,6 +94,8 @@
*/
protected long[] _uploadedBytes = new long[P_SIZE];
+ private long _maxTransferSpeedDown;
+ private long _maxTransferSpeedUp;
//protected long _uploadedBytes;
//protected long _uploadedBytes[P_DAY];
//protected long _uploadedBytes[P_MONTH];
@@ -201,6 +203,14 @@
public long getDownloadedBytesDay() {
return _downloadedBytes[P_DAY];
}
+
+ public long getMaxTransferSpeedDown() {
+ return _maxTransferSpeedDown;
+ }
+
+ public long getMaxTransferSpeedUp() {
+ return _maxTransferSpeedUp;
+ }
public long getDownloadedBytesForTrialPeriod(int period) {
switch (period) {
@@ -330,6 +340,14 @@
public void setLastReset(long lastReset) {
_lastReset = lastReset;
}
+
+ public void setMaxTransferSpeedDown(long speed) {
+ _maxTransferSpeedDown = speed;
+ }
+
+ public void setMaxTransferSpeedUp(long speed) {
+ _maxTransferSpeedUp = speed;
+ }
// public int getRequests() {
// return _requests;
Index: src/org/drftpd/usermanager/User.java
===================================================================
--- src/org/drftpd/usermanager/User.java (revision 1232)
+++ src/org/drftpd/usermanager/User.java (working copy)
@@ -82,7 +82,9 @@
public abstract List getGroups();
public abstract HostMaskCollection getHostMaskCollection();
-
+ public abstract long getMaxTransferSpeedDown();
+ public abstract long getMaxTransferSpeedUp();
+
/**
* Returns the idleTime.
*
@@ -276,6 +278,8 @@
public abstract void setDownloadedTimeWeek(long millis);
public abstract void setGroup(String group);
+ public abstract void setMaxTransferSpeedDown(long speed);
+ public abstract void setMaxTransferSpeedUp(long speed);
/**
* Sets the idleTime.
Index: src/org/drftpd/slave/Slave.java
===================================================================
--- src/org/drftpd/slave/Slave.java (revision 1232)
+++ src/org/drftpd/slave/Slave.java (working copy)
@@ -46,6 +46,7 @@
import javax.net.ssl.SSLContext;
import net.sf.drftpd.FileExistsException;
+import net.sf.drftpd.ObjectNotFoundException;
import net.sf.drftpd.util.PortRange;
import org.apache.log4j.BasicConfigurator;
@@ -64,8 +65,8 @@
import org.drftpd.slave.async.AsyncCommandArgument;
import org.drftpd.slave.async.AsyncResponse;
import org.drftpd.slave.async.AsyncResponseChecksum;
+import org.drftpd.slave.async.AsyncResponseDiskStatus;
import org.drftpd.slave.async.AsyncResponseDIZFile;
-import org.drftpd.slave.async.AsyncResponseDiskStatus;
import org.drftpd.slave.async.AsyncResponseException;
import org.drftpd.slave.async.AsyncResponseID3Tag;
import org.drftpd.slave.async.AsyncResponseMaxPath;
@@ -110,9 +111,6 @@
InetSocketAddress addr = new InetSocketAddress(PropertyHelper.getProperty(
p, "master.host"),
Integer.parseInt(PropertyHelper.getProperty(p, "master.bindport")));
- // Whatever interface the slave uses to connect to the master, is the
- // interface that the master will report to clients requesting PASV transfers
- // from this slave, unless pasv_addr is set on the master for this slave
logger.info("Connecting to master at " + addr);
String slavename = PropertyHelper.getProperty(p, "slave.name");
@@ -650,7 +648,9 @@
String path = mapPathToRenameQueue(st.nextToken());
String fileName = path.substring(path.lastIndexOf("/") + 1);
String dirName = path.substring(0, path.lastIndexOf("/"));
+ long speed = Long.parseLong(st.nextToken());
Transfer t = getTransfer(transferIndex);
+ t.setTransferSpeed(speed);
sendResponse(new AsyncResponse(ac.getIndex())); // return calling thread
// on master
try {
@@ -739,7 +739,9 @@
TransferIndex transferIndex = new TransferIndex(Integer.parseInt(
st.nextToken()));
String path = mapPathToRenameQueue(st.nextToken());
+ long speed = Long.parseLong(st.nextToken());
Transfer t = getTransfer(transferIndex);
+ t.setTransferSpeed(speed);
sendResponse(new AsyncResponse(ac.getIndex())); // return
// calling thread on master
Index: src/org/drftpd/slave/Transfer.java
===================================================================
--- src/org/drftpd/slave/Transfer.java (revision 1232)
+++ src/org/drftpd/slave/Transfer.java (working copy)
@@ -38,6 +38,7 @@
import org.drftpd.io.AddAsciiOutputStream;
import org.drftpd.slave.async.AsyncResponseDiskStatus;
import org.drftpd.slave.async.AsyncResponseTransferStatus;
+//import org.drftpd.slave.ThrottledInputStream;
import se.mog.io.File;
@@ -54,6 +55,7 @@
private char _direction;
private long _finished = 0;
private InputStream _in;
+ private ThrottledInputStream _int;
private char _mode = 'I';
private OutputStream _out;
private Slave _slave;
@@ -68,12 +70,13 @@
public static final char TRANSFER_UNKNOWN = 'U';
private File _file = null;
private String _pathForUpload = null;
+ private static long _speed;
/**
* Start undefined transfer.
*/
public Transfer(Connection conn, Slave slave, TransferIndex transferIndex) {
- if (conn == null) {
+ if (conn == null) {
throw new RuntimeException();
}
@@ -232,8 +235,10 @@
if (_slave.getBufferSize() > 0) {
_sock.setReceiveBufferSize(_slave.getBufferSize());
}
-
+
+
_in = _sock.getInputStream();
+
synchronized(this) {
_direction = Transfer.TRANSFER_RECEIVING_UPLOAD;
}
@@ -325,6 +330,10 @@
_conn = null;
}
+ public void setTransferSpeed(long speed) {
+ _speed = speed;
+ }
+
/**
* Call sock.connect() and start sending.
*
@@ -360,15 +369,19 @@
byte[] buff = new byte[Math.max(_slave.getBufferSize(), 65535)];
int count;
long currentTime = System.currentTimeMillis();
+ _int = new ThrottledInputStream(_in);
+ _int.setMaxBytesPerSecond(_speed);
+
try {
while (true) {
+
if (_abortReason != null) {
throw new TransferFailedException(
"Transfer was aborted - " + _abortReason,
getTransferStatus());
}
- count = _in.read(buff);
+ count = _int.read(buff);
if (count == -1) {
if (associatedUpload == null) {
break; // done transferring
Index: src/org/drftpd/master/RemoteTransfer.java
===================================================================
--- src/org/drftpd/master/RemoteTransfer.java (revision 1232)
+++ src/org/drftpd/master/RemoteTransfer.java (working copy)
@@ -147,11 +147,12 @@
_rslave.issueAbortToSlave(getTransferIndex(),reason);
}
- public void receiveFile(String path, char type, long position)
+ public void receiveFile(String path, char type, long position, long speed)
throws IOException, SlaveUnavailableException {
_path = path;
+
String index = _rslave.issueReceiveToSlave(path, type, position,
- getTransferIndex());
+ getTransferIndex(),speed);
_state = Transfer.TRANSFER_RECEIVING_UPLOAD;
try {
_rslave.fetchResponse(index);
@@ -160,11 +161,11 @@
}
}
- public void sendFile(String path, char type, long position)
+ public void sendFile(String path, char type, long position, long speed)
throws IOException, SlaveUnavailableException {
_path = path;
String index = _rslave.issueSendToSlave(path, type, position,
- getTransferIndex());
+ getTransferIndex(),speed);
_state = Transfer.TRANSFER_SENDING_DOWNLOAD;
try {
_rslave.fetchResponse(index);
Index: src/org/drftpd/master/RemoteSlave.java
===================================================================
--- src/org/drftpd/master/RemoteSlave.java (revision 1232)
+++ src/org/drftpd/master/RemoteSlave.java (working copy)
@@ -809,10 +809,10 @@
}
public String issueReceiveToSlave(String name, char c, long position,
- TransferIndex tindex) throws SlaveUnavailableException {
+ TransferIndex tindex, long transferSpeed) throws SlaveUnavailableException {
String index = fetchIndex();
sendCommand(new AsyncCommandArgument(index, "receive", c + ","
- + position + "," + tindex + "," + name));
+ + position + "," + tindex + "," + name + "," + transferSpeed));
return index;
}
@@ -1052,10 +1052,10 @@
}
public String issueSendToSlave(String name, char c, long position,
- TransferIndex tindex) throws SlaveUnavailableException {
+ TransferIndex tindex, long transferSpeed) throws SlaveUnavailableException {
String index = fetchIndex();
sendCommand(new AsyncCommandArgument(index, "send", c + "," + position
- + "," + tindex + "," + name));
+ + "," + tindex + "," + name + "," + transferSpeed));
return index;
}
Index: src/org/drftpd/commands/UserManagement.java
===================================================================
--- src/org/drftpd/commands/UserManagement.java (revision 1232)
+++ src/org/drftpd/commands/UserManagement.java (working copy)
@@ -717,7 +717,28 @@
userToChange.getKeyedMap().setObject(UserManagement.TAGLINE, fullCommandArgument);
response = Reply.RESPONSE_200_COMMAND_OK;
+ } else if ("max_dlspeed".equals(command)) {
+ if(commandArguments.length < 1) {
+ throw new ImproperUsageException();
+ }
+
+ logger.info("'" + conn.getUserNull().getName() + "' changed max_dlspeed for'" + userToChange.getName() +
+ "' from '" + userToChange.getMaxTransferSpeedDown() + "' to '" + fullCommandArgument + "'");
+ userToChange.setMaxTransferSpeedDown(Long.parseLong(fullCommandArgument));
+
+ response = Reply.RESPONSE_200_COMMAND_OK;
+ } else if ("max_upspeed".equals(command)) {
+ if(commandArguments.length < 1) {
+ throw new ImproperUsageException();
+ }
+
+ logger.info("'" + conn.getUserNull().getName() + "' changed max_dlspeed for'" + userToChange.getName() +
+ "' from '" + userToChange.getMaxTransferSpeedUp() + "' to '" + fullCommandArgument + "'");
+ userToChange.setMaxTransferSpeedUp(Long.parseLong(fullCommandArgument));
+
+ response = Reply.RESPONSE_200_COMMAND_OK;
} else {
+
throw new ImproperUsageException();
}
Index: src/org/drftpd/commands/UserManagement.properties
===================================================================
--- src/org/drftpd/commands/UserManagement.properties (revision 1232)
+++ src/org/drftpd/commands/UserManagement.properties (working copy)
@@ -15,7 +15,8 @@
help.change.specific=site change <username> <field> <value>\n\
Valid fields: group, created, ratio, idle_time, credits, tagline\n\
num_logins # [opt perIP], comment\n\
- group_slots # [opt leech slots], wkly_allotment
+ group_slots # [opt leech slots], wkly_allotment\n\
+ max_dlspeed, max_upspeed
change.specify=You need to specify a value to change
changeratio.invalidratio=Ratio must be 0 or 3
@@ -57,6 +58,7 @@
Ratio: ${org.drftpd.commands.UserManagement@ratio,-23} Credits: ${credits}\n\
Max logins: ${org.drftpd.commands.UserManagement@maxlogins,-18} From same IP: ${org.drftpd.commands.UserManagement@maxloginsip}\n\
Max sim uploads: ${org.drftpd.commands.UserManagement@maxsimup,-13} Max sim downloads: ${org.drftpd.commands.UserManagement@maxsimdn}\n\
+Max download speed(bytes/sec): ${maxspeeddn} Max upload speed(bytes/sec): ${maxspeedup}\n\
Group / Leech slots: ${org.drftpd.commands.UserManagement@groupslots} ${org.drftpd.commands.UserManagement@leechslots}\n\
Total uploaded: ${uploaded,-14} Total downloaded: ${downloaded}\n\
Times nuked: ${org.drftpd.commands.Nuke@nuked,-17} Bytes nuked: ${org.drftpd.commands.Nuke@nukedBytes}\n\