Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- readonly SCRIPT_NAME="AutoBWPingModFQE"
- #Settings
- pingC=5 #Ping quantity
- pingZ=120 #Optimal ping
- pingIP=8.8.8.8 #Ping IP
- WspolGora=133 #Ping factor upper limit in %
- WspolDol=50 #Ping factor lower limit in %
- download_lower_limit=4 #Download lower limit in Mbps
- download_upper_limit=120 #Download upper limit in Mbps
- transfactor=33 #Transmission speed in %
- #Constants
- pingS=0 #Starting value for average ping, currently not used
- counter=0 #Counter
- ping_based_speed() {
- echo Ping IP: $pingIP
- while [ "$counter" -lt $pingC ] ; do
- pingtest=$(ping -c 1 $pingIP | grep 'bytes from' | awk '{print $7}' | sed s/time=//)
- pingtest=${pingtest%.*}
- pingS=$((pingS+$pingtest))
- counter=$((counter+1))
- echo Ping: $pingtest ms
- sleep 1
- done
- pingS=$((pingS / $pingC))
- echo Average from $pingC pings $pingS ms
- pingZ=$(echo " scale=2; $pingZ / $pingS * 100 " | bc -l)
- pingZ=${pingZ%.*}
- if [ $pingZ -lt $WspolDol ]; then
- pingZ=$WspolDol
- echo Limiting ping factor to $(echo " scale=2; $WspolDol / 100 " | bc -l) "(lower limit)"
- elif [ $pingZ -gt $WspolGora ]; then
- pingZ=$WspolGora
- echo Limiting ping factor to $(echo " scale=2; $WspolGora / 100 " | bc -l) "(upper limit)"
- fi
- pingZ=$(echo " scale=2; $pingZ / 100 " | bc -l)
- echo Ping factor $pingZ
- old_Kbps_down=$(nvram get qos_ibw)
- echo QOS Download old $old_Kbps_down Kbps
- Kbps_down=$(echo " $old_Kbps_down * $pingZ " | bc -l)
- Kbps_down=${Kbps_down%.*}
- echo QOS Download new $Kbps_down Kbps
- }
- update_via_TC_down() {
- #read parameters for tc
- PARMS=""
- OVERHEAD=$(nvram get qos_overhead)
- if [ ! -z "$OVERHEAD" ] && [ "$OVERHEAD" -gt "0" ] ; then
- ATM=$(nvram get qos_atm)
- if [ "$ATM" == "1" ] ; then
- PARMS="overhead $OVERHEAD linklayer atm "
- else
- PARMS="overhead $OVERHEAD linklayer ethernet "
- fi
- fi
- #Calculate scale factor based on new/old speeds. This factor will be used to scale class rates & ceils
- #If old speeds are 0, just set the scale factor to 1 (cannot divide by 0)
- # if [ "$old_Kbps_up" -eq "0" ]; then
- # uscale_factor=1.0
- # else
- # uscale_factor=$( echo "$Kbps_up/$old_Kbps_up" | bc -l )
- # fi
- if [ "$old_Kbps_down" -eq "0" ]; then
- dscale_factor=1.0
- else
- dscale_factor=$( echo "$Kbps_down/$old_Kbps_down" | bc -l )
- fi
- printf "%s %8.3f %8.3f\n" "Scaling by" $dscale_factor
- echo
- echo " ====================================== DOWNLOAD ======================================"
- echo " ----------------- RATE ----------------- ----------------- CEIL -----------------"
- echo "Class Previous (Kbps) New (Kbps) Previous (Kbps) New (Kbps) "
- echo "----- ------------------- ------------------- ------------------- -------------------"
- while read -r line;
- do
- class=$( echo ${line} | sed -n -e 's/.*class htb 1://p' | cut -d' ' -f1 )
- prio=$( echo ${class} | cut -c 2 )
- prevRate=$( echo ${line} | awk -F"rate |K?M?G?bit" '{print $2}' )
- prevCeil=$( echo ${line} | awk -F"ceil |K?M?G?bit" '{print $3}' )
- rateUnit=$( echo ${line} | cut -d' ' -f11)
- rateUnit=${rateUnit//[0-9]/}
- ceilUnit=$( echo ${line} | cut -d' ' -f15)
- ceilUnit=${ceilUnit//[0-9]/}
- if [ "$rateUnit" = "bit" ]; then
- prevRate=$( echo "$prevRate*0.001" | bc -l)
- fi
- if [ "$rateUnit" = "Mbit" ]; then
- prevRate=$( echo "$prevRate*1000" | bc -l)
- fi
- if [ "$rateUnit" = "Gbit" ]; then
- prevRate=$( echo "$prevRate*1000000" | bc -l)
- fi
- if [ "$ceilUnit" = "bit" ]; then
- prevCeil=$( echo "$prevCeil*0.001" | bc -l)
- fi
- if [ "$ceilUnit" = "Mbit" ]; then
- prevCeil=$( echo "$prevCeil*1000" | bc -l)
- fi
- if [ "$ceilUnit" = "Gbit" ]; then
- prevCeil=$( echo "$prevCeil*1000000" | bc -l)
- fi
- Burst=$( echo ${line} | sed -n -e 's/.* burst \([a-zA-Z0-9]*\).*/\1/p' )
- Cburst=$( echo ${line} | sed -n -e 's/.*cburst \([a-zA-Z0-9]*\).*/\1/p' )
- Rate=$(echo "$prevRate*$dscale_factor" | bc -l)
- Ceil=$(echo "$prevCeil*$dscale_factor" | bc -l)
- printf "%2.0f %10.1f %10.1f %10.1f %10.1f\n" $class $prevRate $Rate $prevCeil $Ceil
- #Debug
- #echo -e "$line\n class=$class\n prio=$prio\n Rate=$Rate\n Ceil=$Ceil\n Burst=$Burst\n Cburst=$Cburst\n"
- #echo -e "tc class change dev br0 parent 1:1 classid 1:${class} htb ${PARMS}prio ${prio} rate ${Rate}Kbit ceil ${Ceil}Kbit burst ${Burst} cburst ${Cburst}"
- Rate=$(echo $Rate | cut -d. -f1)
- Ceil=$(echo $Ceil | cut -d. -f1)
- tc class change dev br0 parent 1:1 classid 1:${class} htb ${PARMS}prio ${prio} rate ${Rate}Kbit ceil ${Ceil}Kbit burst ${Burst} cburst ${Cburst}
- done <<EOF
- $( tc class show dev br0 | grep "parent 1:1 " )
- EOF
- }
- update_via_restart_qos_flexqos_check(){
- service restart_qos >/dev/null 2>&1
- /jffs/addons/flexqos/flexqos.sh -check &
- }
- checking_and_applying_limits() {
- download_lower_limit=$(echo "$download_lower_limit*1024" | bc -l)
- download_upper_limit=$(echo "$download_upper_limit*1024" | bc -l)
- if [ $Kbps_down -lt $download_upper_limit ]; then
- if [ $Kbps_down -lt $download_lower_limit ]; then
- nvram set qos_ibw=$download_lower_limit
- nvram commit
- update_via_TC_down # for testing change to update_via_restart_qos_flexqos_check
- logger -t $SCRIPT_NAME QOS Download set to $download_lower_limit Kbps "(LOW LIMIT)", average from $pingC pings $pingS ms
- echo $SCRIPT_NAME 1 QOS Download set to $download_lower_limit Kbps "(LOW LIMIT!!!)", average from $pingC pings $pingS ms
- else
- nvram set qos_ibw=$Kbps_down
- nvram commit
- update_via_TC_down # for testing change to update_via_restart_qos_flexqos_check
- logger -t $SCRIPT_NAME QOS Download set to $Kbps_down Kbps, average from $pingC pings $pingS ms
- echo $SCRIPT_NAME 2 QOS Download set to $Kbps_down Kbps, average from $pingC pings $pingS ms
- fi
- else
- logger -t $SCRIPT_NAME "QOS Download doesn't change, average from" $pingC pings $pingS ms
- echo $SCRIPT_NAME 3 "QOS Download doesn't change, average from" $pingC pings $pingS ms
- fi
- }
- #Limiting Transmission Download
- translimit() {
- transfactor=$(echo " 100 / $transfactor " | bc -l)
- transfactor=${transfactor%.*}
- Kbps_downtrans=$(echo " $Kbps_down / $transfactor / 8 " | bc -l)
- Kbps_downtrans=${Kbps_downtrans%.*}
- echo Limit transmission: $Kbps_downtrans
- transmission-remote -d $Kbps_downtrans > /dev/null 2>&1
- }
- #Saving recent download limit to file
- saving_to_file() {
- QOSD=$(nvram get qos_ibw)
- QOSD=$(echo "scale=0; $QOSD / 1024;" | bc -l)
- echo QOSD: "$QOSD" Mbps > /mnt/Trans/Finished/qos.txt
- }
- ########### START HERE ###########
- ping_based_speed
- checking_and_applying_limits
- translimit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement