Adjust firewall script, handle bittorrent throttle
[rahunas] / tools / bandwidth.sh.in
1 #!/bin/sh
2 # File: bandwidth.sh
3 # Description: The bandwidth shaper wrapper script for RahuNAS
4
5 PATH=/sbin:/bin:/usr/sbin:/usr/bin:@prefix@/sbin:@prefix@/bin
6 prefix=@prefix@
7 exec_prefix=@exec_prefix@
8
9 TC=/sbin/tc
10 IP=/sbin/ip
11
12 INIT=@sysconfdir@/default/rahunas
13 RUN=@localstatedir@/run/rahunas-bandwidth
14
15 # Interface Speed (Kbit), Default: 100 Mbps
16 INTERFACE_SPEED=102400
17
18 SHAPING_DOWN_INF=imq0
19 SHAPING_UP_INF=imq1
20
21 INTERFACE_ID=9999
22 BITTORRENT_ID=9998
23
24 MESSAGE=""
25
26 test -f $INIT || exit 0
27 . $INIT
28
29 test "$RUN_DAEMON" = "yes" || exit 0
30 test -f $RAHUNAS_CONFIG || exit 1
31
32 set -e
33
34 get_config_value () {
35   section=$1
36   key=$2
37   file=$3
38
39   cat $file | sed -e "0,/$section = {/ ! { /}/,/$section = {/ ! s/^/>>/ }" | grep "^>>" | sed -e "s/^>>//g" | grep -w "$key" | cut -d= -f2 | sed "s/^ *\(.*[^ ]\) *$/\1/" | sed 's/"//g'
40 }
41
42 BANDWIDTH_SHAPE=`get_config_value main bandwidth_shape $RAHUNAS_CONFIG`
43 BITTORRENT_DOWNLOAD_MAX=`get_config_value main bittorrent_download_max $RAHUNAS_CONFIG`
44 BITTORRENT_UPLOAD_MAX=`get_config_value main bittorrent_upload_max $RAHUNAS_CONFIG` 
45
46 test "$BANDWIDTH_SHAPE" = "yes" || exit 0 
47
48 interface_setting () {
49   case "$1" in
50     start)
51       # Interface Downlink
52       $TC qdisc add dev $SHAPING_DOWN_INF root handle 1: htb \
53         default ${INTERFACE_ID} 
54       $TC class add dev $SHAPING_DOWN_INF parent 1: classid 1:${INTERFACE_ID} \
55         htb rate ${INTERFACE_SPEED}Kbit
56
57       # Interface Uplink
58       $TC qdisc add dev $SHAPING_UP_INF root handle 2: htb \
59         default ${INTERFACE_ID} 
60       $TC class add dev $SHAPING_UP_INF parent 2: classid 2:${INTERFACE_ID} \
61         htb rate ${INTERFACE_SPEED}Kbit
62       ;;
63   stop)
64       # Interface Downlink
65       $TC qdisc del dev $SHAPING_DOWN_INF root
66
67       # Interface Uplink
68       $TC qdisc del dev $SHAPING_UP_INF root
69       ;;
70   esac
71 }
72
73 bittorrent_setting () {
74   case "$1" in
75     start)
76       # BITTORRENT Download throttling
77       $TC class add dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} \
78         classid 1:${BITTORRENT_ID} htb rate ${BITTORRENT_DOWNLOAD_MAX}Kbit
79       $TC qdisc add dev $SHAPING_DOWN_INF parent 1:${BITTORRENT_ID} \
80         handle ${BITTORRENT_ID}: sfq perturb 10
81       $TC filter add dev $SHAPING_DOWN_INF parent 1: protocol ip prio 1 \
82         handle 0x3 fw classid 1:${BITTORRENT_ID}
83
84       # BITTORRENT Upload throttling
85       $TC class add dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} \
86         classid 2:${BITTORRENT_ID} htb rate ${BITTORRENT_UPLOAD_MAX}Kbit
87       $TC qdisc add dev $SHAPING_UP_INF parent 2:${BITTORRENT_ID} \
88         handle ${BITTORRENT_ID}: sfq perturb 10
89       $TC filter add dev $SHAPING_UP_INF parent 2: protocol ip prio 1 \
90         handle 0x3 fw classid 2:${BITTORRENT_ID}
91       ;;
92     stop)
93       ;;
94   esac
95 }
96
97 start () {
98   if [ ! -e $RUN ]; then
99     interface_setting start
100     bittorrent_setting start
101     MESSAGE="Start OK"
102     touch $RUN
103   fi
104 }
105
106 stop () {
107   if [ -e $RUN ]; then
108     interface_setting stop
109     bittorrent_setting stop
110     MESSAGE="Stop OK"
111     rm -f $RUN
112   fi
113 }
114
115 usage_add() {
116   echo "Usage: $1 add ID IP DOWNSPEED UPSPEED"
117   echo "         ID - ID number from 1 to 9900"
118   echo "         IP - IPv4 Address"
119   echo "  DOWNSPEED - Download speed (bits/s)"
120   echo "    UPSPEED - Upload speed (bits/s)"
121 }
122
123 usage_del() {
124   echo "Usage: $1 del ID"
125   echo "         ID - ID number from 1 to 9900"
126 }
127
128 usage() {
129   echo "Usage: $1 {start|stop|restart|add|del}"
130   echo "       $1 add --help"
131   echo "       $1 del --help"
132 }
133
134 bw_add() {
135   ID=$1
136   IP=$2
137   DOWNSPEED=$3
138   UPSPEED=$4
139   MESSAGE="Add shaping slot id: $ID for $IP with D/U=$DOWNSPEED/$UPSPEED bits/s"
140
141   # Downlink
142   $TC class add dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} \
143     classid 1:${ID} htb rate ${DOWNSPEED}bit ceil ${DOWNSPEED}bit
144   $TC filter add dev $SHAPING_DOWN_INF parent 1: \
145     protocol ip prio 2 u32 match ip dst ${IP}/32 flowid 1:${ID}
146
147   # Uplink
148   $TC class add dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} \
149     classid 2:${ID} htb rate ${UPSPEED}bit ceil ${UPSPEED}bit
150   $TC filter add dev $SHAPING_UP_INF parent 2: \
151     protocol ip prio 2 u32 match ip src ${IP}/32 flowid 2:${ID}
152 }
153
154 bw_del() {
155   ID=$1
156   MESSAGE="Delete shaping slot id: $ID"
157
158   # Filter Removal
159   # Downlink/Uplink
160   DOWN_HANDLE=`$TC filter show dev $SHAPING_DOWN_INF | grep -w "flowid 1:${ID} " | awk '{print $10}'`
161   UP_HANDLE=`$TC filter show dev $SHAPING_UP_INF | grep -w "flowid 2:${ID} " | awk '{print $10}'`
162   $TC filter del dev $SHAPING_DOWN_INF parent 1: \
163     prio 2 handle ${DOWN_HANDLE} u32
164   $TC filter del dev $SHAPING_UP_INF parent 2: \
165     prio 2 handle ${UP_HANDLE} u32
166
167   # Class Removal
168   # Downlink/Uplink
169   $TC class del dev $SHAPING_DOWN_INF parent 1:${INTERFACE_ID} classid 1:${ID}
170   $TC class del dev $SHAPING_UP_INF parent 2:${INTERFACE_ID} classid 2:${ID}
171 }
172
173 N=@sysconfdir@/rahunas/bandwidth.sh
174
175 case "$1" in
176   start)
177     start || true 
178     test -n "$MESSAGE" || MESSAGE="NOT COMPLETED"
179     echo $MESSAGE
180     ;;
181   stop)
182     stop || true
183     test -n "$MESSAGE" || MESSAGE="NOT COMPLETED"
184     echo $MESSAGE
185
186     ;;
187   restart)
188     stop || true
189     test -n "$MESSAGE" || MESSAGE="NOT COMPLETED"
190     echo $MESSAGE
191
192     start || true
193     test -n "$MESSAGE" || MESSAGE="NOT COMPLETED"
194     echo $MESSAGE
195
196     ;;
197   add)
198     if [ "$2" = "--help" ]; then
199       usage_add $N
200       exit 3
201     fi
202
203     if [ $# != 5 ]; then
204       echo "Error: too few arguments"
205       usage_add $N
206       exit 1
207     fi
208
209     bw_add $2 $3 $4 $5 || true
210     echo $MESSAGE
211     ;;
212   del)
213     if [ "$2" = "--help" ]; then
214       usage_del $N
215       exit 3
216     fi
217
218     if [ $# != 2 ]; then
219       echo "Error: too few arguments"
220       usage_del $N
221       exit 1
222     fi
223
224     bw_del $2 || true
225     echo $MESSAGE
226     ;;
227   *)
228     usage $N
229     exit 3
230     ;;
231 esac 
232
233 exit 0