Index: 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", ""); } 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 \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\