Advertisement
Guest User

Untitled

a guest
Oct 25th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.66 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. readonly SCRIPT_NAME="AutoBWPingModFQE"
  4.  
  5. #Settings
  6. pingC=5 #Ping quantity
  7. pingZ=120 #Optimal ping
  8. pingIP=8.8.8.8 #Ping IP
  9. WspolGora=133 #Ping factor upper limit in %
  10. WspolDol=50 #Ping factor lower limit in %
  11. download_lower_limit=4 #Download lower limit in Mbps
  12. download_upper_limit=120 #Download upper limit in Mbps
  13. transfactor=33 #Transmission speed in %
  14.  
  15. #Constants
  16. pingS=0 #Starting value for average ping, currently not used
  17. counter=0 #Counter
  18.  
  19. ping_based_speed() {
  20.  
  21. echo Ping IP: $pingIP
  22. while [ "$counter" -lt $pingC ] ; do
  23. pingtest=$(ping -c 1 $pingIP | grep 'bytes from' | awk '{print $7}' | sed s/time=//)
  24. pingtest=${pingtest%.*}
  25. pingS=$((pingS+$pingtest))
  26. counter=$((counter+1))
  27. echo Ping: $pingtest ms
  28. sleep 1
  29. done
  30.  
  31. pingS=$((pingS / $pingC))
  32. echo Average from $pingC pings $pingS ms
  33.  
  34. pingZ=$(echo " scale=2; $pingZ / $pingS * 100 " | bc -l)
  35. pingZ=${pingZ%.*}
  36.  
  37. if [ $pingZ -lt $WspolDol ]; then
  38. pingZ=$WspolDol
  39. echo Limiting ping factor to $(echo " scale=2; $WspolDol / 100 " | bc -l) "(lower limit)"
  40. elif [ $pingZ -gt $WspolGora ]; then
  41. pingZ=$WspolGora
  42. echo Limiting ping factor to $(echo " scale=2; $WspolGora / 100 " | bc -l) "(upper limit)"
  43. fi
  44.  
  45. pingZ=$(echo " scale=2; $pingZ / 100 " | bc -l)
  46. echo Ping factor $pingZ
  47.  
  48. old_Kbps_down=$(nvram get qos_ibw)
  49. echo QOS Download old $old_Kbps_down Kbps
  50. Kbps_down=$(echo " $old_Kbps_down * $pingZ " | bc -l)
  51. Kbps_down=${Kbps_down%.*}
  52. echo QOS Download new $Kbps_down Kbps
  53. }
  54.  
  55. update_via_TC_down() {
  56. #read parameters for tc
  57. PARMS=""
  58. OVERHEAD=$(nvram get qos_overhead)
  59. if [ ! -z "$OVERHEAD" ] && [ "$OVERHEAD" -gt "0" ] ; then
  60. ATM=$(nvram get qos_atm)
  61. if [ "$ATM" == "1" ] ; then
  62. PARMS="overhead $OVERHEAD linklayer atm "
  63. else
  64. PARMS="overhead $OVERHEAD linklayer ethernet "
  65. fi
  66. fi
  67.  
  68. #Calculate scale factor based on new/old speeds. This factor will be used to scale class rates & ceils
  69. #If old speeds are 0, just set the scale factor to 1 (cannot divide by 0)
  70. # if [ "$old_Kbps_up" -eq "0" ]; then
  71. # uscale_factor=1.0
  72. # else
  73. # uscale_factor=$( echo "$Kbps_up/$old_Kbps_up" | bc -l )
  74. # fi
  75. if [ "$old_Kbps_down" -eq "0" ]; then
  76. dscale_factor=1.0
  77. else
  78. dscale_factor=$( echo "$Kbps_down/$old_Kbps_down" | bc -l )
  79. fi
  80.  
  81. printf "%s %8.3f %8.3f\n" "Scaling by" $dscale_factor
  82.  
  83. echo
  84. echo " ====================================== DOWNLOAD ======================================"
  85. echo " ----------------- RATE ----------------- ----------------- CEIL -----------------"
  86. echo "Class Previous (Kbps) New (Kbps) Previous (Kbps) New (Kbps) "
  87. echo "----- ------------------- ------------------- ------------------- -------------------"
  88. while read -r line;
  89. do
  90. class=$( echo ${line} | sed -n -e 's/.*class htb 1://p' | cut -d' ' -f1 )
  91. prio=$( echo ${class} | cut -c 2 )
  92.  
  93. prevRate=$( echo ${line} | awk -F"rate |K?M?G?bit" '{print $2}' )
  94. prevCeil=$( echo ${line} | awk -F"ceil |K?M?G?bit" '{print $3}' )
  95. rateUnit=$( echo ${line} | cut -d' ' -f11)
  96. rateUnit=${rateUnit//[0-9]/}
  97. ceilUnit=$( echo ${line} | cut -d' ' -f15)
  98. ceilUnit=${ceilUnit//[0-9]/}
  99. if [ "$rateUnit" = "bit" ]; then
  100. prevRate=$( echo "$prevRate*0.001" | bc -l)
  101. fi
  102. if [ "$rateUnit" = "Mbit" ]; then
  103. prevRate=$( echo "$prevRate*1000" | bc -l)
  104. fi
  105. if [ "$rateUnit" = "Gbit" ]; then
  106. prevRate=$( echo "$prevRate*1000000" | bc -l)
  107. fi
  108.  
  109. if [ "$ceilUnit" = "bit" ]; then
  110. prevCeil=$( echo "$prevCeil*0.001" | bc -l)
  111. fi
  112. if [ "$ceilUnit" = "Mbit" ]; then
  113. prevCeil=$( echo "$prevCeil*1000" | bc -l)
  114. fi
  115. if [ "$ceilUnit" = "Gbit" ]; then
  116. prevCeil=$( echo "$prevCeil*1000000" | bc -l)
  117. fi
  118.  
  119. Burst=$( echo ${line} | sed -n -e 's/.* burst \([a-zA-Z0-9]*\).*/\1/p' )
  120. Cburst=$( echo ${line} | sed -n -e 's/.*cburst \([a-zA-Z0-9]*\).*/\1/p' )
  121.  
  122. Rate=$(echo "$prevRate*$dscale_factor" | bc -l)
  123. Ceil=$(echo "$prevCeil*$dscale_factor" | bc -l)
  124.  
  125. printf "%2.0f %10.1f %10.1f %10.1f %10.1f\n" $class $prevRate $Rate $prevCeil $Ceil
  126.  
  127. #Debug
  128. #echo -e "$line\n class=$class\n prio=$prio\n Rate=$Rate\n Ceil=$Ceil\n Burst=$Burst\n Cburst=$Cburst\n"
  129.  
  130. #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}"
  131. Rate=$(echo $Rate | cut -d. -f1)
  132. Ceil=$(echo $Ceil | cut -d. -f1)
  133.  
  134. 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}
  135.  
  136. done <<EOF
  137. $( tc class show dev br0 | grep "parent 1:1 " )
  138. EOF
  139. }
  140.  
  141. update_via_restart_qos_flexqos_check(){
  142. service restart_qos >/dev/null 2>&1
  143. /jffs/addons/flexqos/flexqos.sh -check &
  144. }
  145.  
  146. checking_and_applying_limits() {
  147.  
  148. download_lower_limit=$(echo "$download_lower_limit*1024" | bc -l)
  149. download_upper_limit=$(echo "$download_upper_limit*1024" | bc -l)
  150.  
  151. if [ $Kbps_down -lt $download_upper_limit ]; then
  152. if [ $Kbps_down -lt $download_lower_limit ]; then
  153. nvram set qos_ibw=$download_lower_limit
  154. nvram commit
  155. update_via_TC_down # for testing change to update_via_restart_qos_flexqos_check
  156. logger -t $SCRIPT_NAME QOS Download set to $download_lower_limit Kbps "(LOW LIMIT)", average from $pingC pings $pingS ms
  157. echo $SCRIPT_NAME 1 QOS Download set to $download_lower_limit Kbps "(LOW LIMIT!!!)", average from $pingC pings $pingS ms
  158. else
  159. nvram set qos_ibw=$Kbps_down
  160. nvram commit
  161. update_via_TC_down # for testing change to update_via_restart_qos_flexqos_check
  162. logger -t $SCRIPT_NAME QOS Download set to $Kbps_down Kbps, average from $pingC pings $pingS ms
  163. echo $SCRIPT_NAME 2 QOS Download set to $Kbps_down Kbps, average from $pingC pings $pingS ms
  164. fi
  165. else
  166. logger -t $SCRIPT_NAME "QOS Download doesn't change, average from" $pingC pings $pingS ms
  167. echo $SCRIPT_NAME 3 "QOS Download doesn't change, average from" $pingC pings $pingS ms
  168. fi
  169. }
  170.  
  171. #Limiting Transmission Download
  172. translimit() {
  173. transfactor=$(echo " 100 / $transfactor " | bc -l)
  174. transfactor=${transfactor%.*}
  175. Kbps_downtrans=$(echo " $Kbps_down / $transfactor / 8 " | bc -l)
  176. Kbps_downtrans=${Kbps_downtrans%.*}
  177. echo Limit transmission: $Kbps_downtrans
  178. transmission-remote -d $Kbps_downtrans > /dev/null 2>&1
  179. }
  180.  
  181. #Saving recent download limit to file
  182. saving_to_file() {
  183. QOSD=$(nvram get qos_ibw)
  184. QOSD=$(echo "scale=0; $QOSD / 1024;" | bc -l)
  185. echo QOSD: "$QOSD" Mbps > /mnt/Trans/Finished/qos.txt
  186. }
  187.  
  188. ########### START HERE ###########
  189.  
  190. ping_based_speed
  191. checking_and_applying_limits
  192. translimit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement