ip-up:
Код: Выделить всё
#!/bin/sh
#ABillS %DATE% %TIME%
#
# When the ppp link comes up, this script is called with the following
# parameters
# $1 the interface name used by pppd (e.g. ppp3)
# $2 the tty device name
# $3 the tty device speed
# $4 the local IP address for the interface
# $5 the remote IP address
# $6 the parameter specified by the 'ipparam' option to pppd
#
# Uncoment the line below to enable logging
#LOGFILE=/tmp/pppd_log
# This one is for replacing the log
LOGREPLACE=1
if [ "$LOGFILE" == "" ]; then LOGFILE='/dev/null'; fi
if [ "$LOGREPLACE" == "1" ]; then exec 1> "$LOGFILE"; else exec 1>> "$LOGFILE"; fi
INPUT=ifb0;
UBURST="burst 512k"
DBURST="burst 512k"
TCFR="/sbin/tc filter replace"
TCCR="/sbin/tc class replace"
TCQR="/sbin/tc qdisc replace"
TCQD="/sbin/tc qdisc del"
USER=`who|grep "$1\ "|awk '{print $1}'`
# Everything below is fucking scary
QUERY="SELECT s.in_speed, s.out_speed, TIME_FORMAT(i.end,'%H:%i')
FROM \`trafic_tarifs\` AS s, \`intervals\` AS i, \`dv_main\` AS dv, \`users\` AS u
WHERE u.id = '$USER'
AND dv.uid = u.uid
AND dv.tp_id = i.tp_id
AND s.interval_id = i.id
AND i.begin <= NOW()
AND i.end > NOW();"
Q_RESULT=`/bin/echo $QUERY | /usr/bin/mysql -u mysql_user -p -h mysql_host -D abills_db --password=mysql_passwod --silent`
UPSPEED=`/bin/echo $Q_RESULT | /bin/awk '{print $1}'`
DOWNSPEED=`/bin/echo $Q_RESULT | /bin/awk '{print $2}'`
NEXTINT=`/bin/echo $Q_RESULT | /bin/awk '{print $3}'`
TASKS=`at -l | awk '{print $1}'`
for i in $TASKS
do
TASK_TEXT=`at -c $i`
if echo $TASK_TEXT | grep $1 > /dev/null;
then
atrm $i
fi
done
/bin/echo "/etc/ppp/ip-up.d/shaper $1" | at $NEXTINT
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
IP=$5
QDISC_ETH=`tc qdisc show dev $INPUT|grep -v sfq|awk '{print $2}'`
FILTERS=`/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
DOWNSPEED=$(($DOWNSPEED*110/100))
UPSPEED=$(($UPSPEED*105/100))
if [ "$QDISC_ETH" != "htb" ];
then
ip l s $INPUT up
$TCQD dev $INPUT root &>/dev/null
$TCQR dev $INPUT root handle 1: htb default 2 r2q 100
$TCCR dev $INPUT parent 1: classid 1:1 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 2
$TCCR dev $INPUT parent 1: classid 1:2 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 1
$TCQR dev $INPUT parent 1:2 handle 2: sfq perturb 10 quantum 1514
fi
if [ w${debug} = w1 ] ; then
echo "Debug mode"
echo $DOWNSPEED
echo $UPSPEED
echo $FILTERS
fi;
$TCQD dev $1 root
$TCQD dev $1 ingress
##### speed server->client
if [ "$UPSPEED" != "0" ] ;
then
# UPSPEED=$[$UPSPEED*4/3]
URATE=$[$UPSPEED/2]
$TCQR dev $1 root handle 1: htb default 20 r2q 100
$TCCR dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit $UBURST quantum 1514
$TCCR dev $1 parent 1:1 classid 1:10 htb rate ${URATE}kbit ceil ${UPSPEED}kbit $UBURST prio 1 quantum 1514
$TCCR dev $1 parent 1:1 classid 1:20 htb rate ${URATE}kbit ceil ${UPSPEED}kbit $UBURST prio 2 quantum 1514
$TCQR dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1514
$TCQR dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1514
$TCFR dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
$TCFR dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
fi
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
# DOWNSPEED=$[$DOWNSPEED*4/3]
DRATE=$[$DOWNSPEED/2]
$TCQR dev $1 handle ffff: ingress
$TCFR dev $1 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $INPUT
$TCCR dev $INPUT parent 1:1 classid 1:1$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST quantum 1514
$TCCR dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM htb rate ${DRATE}kbit ceil ${DOWNSPEED}kbit $DBURST prio 10 quantum 1514
$TCCR dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM htb rate ${DRATE}kbit ceil ${DOWNSPEED}kbit $DBURST prio 1 quantum 1514
$TCQR dev $INPUT parent 1:2$PPPNUM handle 2$PPPNUM: sfq perturb 10 quantum 1514
$TCQR dev $INPUT parent 1:3$PPPNUM handle 3$PPPNUM: sfq perturb 10 quantum 1514
$TCFR dev $INPUT parent 1: protocol ip prio 1$PPPNUM handle 0x1$PPPNUM u32 match ip src $IP/32 flowid 1:2$PPPNUM
$TCFR dev $INPUT parent 1:2$PPPNUM protocol ip prio 2$PPPNUM handle 0x2$PPPNUM u32 match ip src $IP/32 match ip tos 0x10 0xff flowid 1:3$PPPNUM
$TCFR dev $INPUT parent 1:2$PPPNUM protocol ip prio 3$PPPNUM handle 0x3$PPPNUM u32 match ip src $IP/32 match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 match u16 0x0000 0xfc0 at 2 match u8 0x10 0xff at 33 flowid 1:3$PPPNUM
$TCFR dev $INPUT parent 1:2$PPPNUM protocol ip prio 4$PPPNUM handle 0x4$PPPNUM u32 match ip src $IP/32 match ip protocol 1 0xff flowid 1:3$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters are not yet supported";
fi;
fi
ip-down:
Код: Выделить всё
#!/bin/sh
#ABillS %DATE% %TIME%
#
# When the ppp link comes up, this script is called with the following
# parameters
# $1 the interface name used by pppd (e.g. ppp3)
# $2 the tty device name
# $3 the tty device speed
# $4 the local IP address for the interface
# $5 the remote IP address
# $6 the parameter specified by the 'ipparam' option to pppd
#
# Uncoment the line below to enable logging
#LOGFILE=/tmp/pppd_log
# This one is for replacing the log
LOGREPLACE=1
if [ "$LOGFILE" == "" ]; then LOGFILE='/dev/null'; fi
if [ "$LOGREPLACE" == "1" ]; then exec 1> "$LOGFILE"; else exec 1>> "$LOGFILE"; fi
INPUT=ifb0;
UBURST="burst 512k"
DBURST="burst 64k"
TCFD="/sbin/tc filter del"
TCFR="/sbin/tc filter replace"
TCCR="/sbin/tc class replace"
TCCD="/sbin/tc class del"
TCQR="/sbin/tc qdisc replace"
TCQD="/sbin/tc qdisc del"
TASKS=`at -l | awk '{print $1}'`
for i in $TASKS
do
TASK_TEXT=`at -c $i`
#echo $TASK_TEXT
if echo $TASK_TEXT | grep $1 > /dev/null;
then
atrm $i
fi
done
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
FILTERS=`/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
$TCQD dev $1 root &>/dev/null
$TCQD dev $1 ingress &>/dev/null
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
$TCFD dev $INPUT parent 1:2$PPPNUM protocol ip prio 4$PPPNUM
$TCFD dev $INPUT parent 1:2$PPPNUM protocol ip prio 3$PPPNUM
$TCFD dev $INPUT parent 1:2$PPPNUM protocol ip prio 2$PPPNUM
$TCFD dev $INPUT parent 1: protocol ip prio 1$PPPNUM
$TCQD dev $INPUT parent 1:2$PPPNUM
$TCQD dev $INPUT parent 1:3$PPPNUM
$TCCD dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM
$TCCD dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM
$TCCD dev $INPUT parent 1:1 classid 1:1$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters not supported";
fi;
fi