This script will drop the user's download speed by 1/4 of it's assigned speed.
i.e. if a user is assigned of 128000/256000 then the 256000 is divided intto 4 and it will be deducted from the download speed.
i.e 256000 / 4 = 64000
256000 - 64000 = 192000
Hence, the new speed is now 128000/192000
Here how it works.
the PPPoE user was originally assigned of 128000/512000 bandwidth, in less than 30 minutes of online time, the user already downloaded a size of more than 10MB, the script will reduce his speed down to 128000/384000.
the same user was now online for more 30 minutes but less than 1 hour and downloaded more than 15MB, the speed will now be reduced to 128000/288000
again, the same user is now online for more than 1 hour but less than 5 hour and downloaded more than 50mb, the speed will now be dropped to
128000/216000
you can expand the code to reduced more based on your FAP policy.
i hope you liked it!.
Code: Select all
:foreach i in=[/ppp active find] \
do= { \
:set sName [/interface get $i name]
:set sTotalBytes [/queue simple get $sName total-bytes] ; \
:set sUptime [/ppp active get $i uptime]
:set mLimit [/queue simple get $sName max-limit]
:set slashpos [:pic [:find $mLimit "/"]]
:set mdSize [:pic $mLimit [:tonum(([:tonum($slashpos)] +1))] 30]
:set mPart ([:pic $mLimit [:tonum(([:tonum($slashpos)] +1))] 30] / 4)
:set muSize [:pic $mLimit 0 $slashpos]
:if ($sUptime < 30m && $sTotalBytes >10240000) \
do={ \
:set NewSpeed ($muSize . "/" . ($mdSize - $mPart))
:log info ("SPEED " . $sName . " exceeds 10 Mega Bytes and has been online for " . $sUptime . " reducing speed to " . $NewSpeed )
/queue simple set $sName limit-at=$NewSpeed max-limit=$NewSpeed
:log info ("SPEED " . $sName . " Total Download:" . [:tostr($sTotalBytes)] . " and has been online for " . $sUptime )
}
:if ( $sUptime >30m && $sUptime < 1h && $sTotalBytes >15360000) \
do={ \
:set NewSpeed ($muSize . "/" . ($mdSize - $mPart))
:log info ("SPEED " . $sName . " exceeds 15 Mega Bytes and has been online for " . $sUptime . " reducing speed to " . $NewSpeed )
/queue simple set $sName limit-at=$NewSpeed max-limit=$NewSpeed
:log info ("SPEED " . $sName . " Total Download:" . [:tostr($sTotalBytes)] . " and has been online for " . $sUptime )
}
:if ( $sUptime >1h && $sUptime < 5h && $sTotalBytes > 51200000) \
do={ \
:set NewSpeed ($muSize . "/" . ($mdSize - $mPart))
:log info ("SPEED " . $sName . " exceeds 50 Mega Bytes and has been online for " . $sUptime . " reducing speed to " . $NewSpeed )
/queue simple set $sName limit-at=$NewSpeed max-limit=$NewSpeed
:log info ("SPEED " . $sName . " Total Download:" . [:tostr($sTotalBytes)] . " and has been online for " . $sUptime )
}
}
any comments are welcome.