Шейпер с автоснижением скорости для анлимщиков на основе CBQ

Вопросы по UTM 3.0 и UTM 4.0 (поддержка прекращена)
Закрыто
dios
Сообщения: 42
Зарегистрирован: Сб мар 12, 2005 08:38

Шейпер с автоснижением скорости для анлимщиков на основе CBQ

Сообщение dios »

cbq-unlim.sh

Код: Выделить всё

#!/bin/sh
/usr/bin/php /netup/unlim/cbq-unlim.php
/etc/rc.d/init.d/cbq stop
/etc/rc.d/init.d/cbq compile
/etc/rc.d/init.d/cbq start
config.php

Код: Выделить всё

<?php
$mysql_server="localhost";
$mysql_login="";
$mysql_passwd="";
$dbname="UTM";
$bytes_in_mbyte = '1048576';
if&#40;!mysql_pconnect&#40;$mysql_server, $mysql_login, $mysql_passwd&#41;&#41;
    &#123;
    echo "Error Connect to database ".$dbname."!<br>";
    echo mysql_error&#40;&#41;;
    exit;
&#125;
mysql_select_db&#40;"$dbname"&#41;;
?>
cbq-unlim.php

Код: Выделить всё

<?php
include "config.php";
$cbq_patch="/etc/sysconfig/cbq/";
$local_dev="eth0"; 
$inet_dev="eth2";
$speed_in=128;
$speed_out=128;
$speed_delta=10;

exec&#40;"rm ".$cbq_patch."*"&#41;;
$i=1;
//1009 = id unlim tariff
$result=mysql_query&#40;"select * from users where tariff = 1009"&#41;;
while &#40;$row=mysql_fetch_array&#40;$result&#41;&#41;
&#123;
    $i++;
    $mb_in=0;
    $mb_out=0;
    $fname=$cbq_patch."cbq-".$i.".in";
    $f_in=fopen&#40;$fname,"w"&#41;;
    $fname=$cbq_patch."cbq-".$i.".out";
    $f_out=fopen&#40;$fname,"w"&#41;;
    $uuid=$row&#91;id&#93;;
    $result2=mysql_query&#40;"SELECT SUM&#40; bytes &#41;, t_class FROM traffic_discount_current WHERE uid = '$uuid' and t_class!=1000 GR
OUP BY t_class"&#41;;
    $rate_in=$speed_in;
    $rate_out=$speed_out;
    while &#40;$row2=mysql_fetch_array&#40;$result2&#41;&#41;
    &#123;
        $tclass=$row2&#91;t_class&#93;;
//тут указываются все классы вхдящего трафика
        if &#40;&#40;$tclass=="100"&#41;or&#40;$tclass=="101"&#41;or&#40;$tclass=="110"&#41;or&#40;$tclass=="201"&#41;or&#40;$tclass=="203"&#41;or&#40;$tclass=="204"&#41;or&#40;$tcl
ass=="205"&#41;or&#40;$tclass=="206"&#41;or&#40;$tclass=="207"&#41;or&#40;$tclass=="208"&#41;or&#40;$tclass=="209"&#41;or&#40;$tclass=="210"&#41;or&#40;$tclass=="211"&#41;&#41;
        $mb_in = $mb_in+round&#40;$row2&#91;0&#93;/$bytes_in_mbyte&#41;;

//тут указываются все классы исходящего трафика
        if &#40;&#40;$tclass=="150"&#41;or&#40;$tclass=="151"&#41;or&#40;$tclass=="160"&#41;or&#40;$tclass=="221"&#41;or&#40;$tclass=="223"&#41;or&#40;$tclass=="224"&#41;or&#40;$tcl
ass=="225"&#41;or&#40;$tclass=="226"&#41;or&#40;$tclass=="227"&#41;or&#40;$tclass=="228"&#41;or&#40;$tclass=="229"&#41;or&#40;$tclass=="230"&#41;or&#40;$tclass=="210"&#41;or&#40;$tc
lass=="231"&#41;&#41;
        $mb_out = $mb_out+round&#40;$row2&#91;0&#93;/$bytes_in_mbyte&#41;;

    &#125;
//правила снижения скорости входящего
        if &#40;$mb_in>1024*1&#41; $rate_in=$speed_in-$speed_delta*1;
        if &#40;$mb_in>1024*2&#41; $rate_in=$speed_in-$speed_delta*2;
        if &#40;$mb_in>1024*3&#41; $rate_in=$speed_in-$speed_delta*3;
        if &#40;$mb_in>1024*4&#41; $rate_in=$speed_in-$speed_delta*4;
        if &#40;$mb_in>1024*5&#41; $rate_in=$speed_in-$speed_delta*5;
        if &#40;$mb_in>1024*6&#41; $rate_in=$speed_in-$speed_delta*6;
        if &#40;$mb_in>1024*7&#41; $rate_in=$speed_in-$speed_delta*7;
        if &#40;$mb_in>1024*8&#41; $rate_in=$speed_in-$speed_delta*8;

//правила снижения скорости исходящего
        if &#40;$mb_out>1024*1&#41; $rate_out=$speed_out-$speed_delta*1;
        if &#40;$mb_out>1024*2&#41; $rate_out=$speed_out-$speed_delta*2;
        if &#40;$mb_out>1024*3&#41; $rate_out=$speed_out-$speed_delta*3;
        if &#40;$mb_out>1024*4&#41; $rate_out=$speed_out-$speed_delta*4;
        if &#40;$mb_out>1024*5&#41; $rate_out=$speed_out-$speed_delta*5;
        if &#40;$mb_out>1024*6&#41; $rate_out=$speed_out-$speed_delta*6;
        if &#40;$mb_out>1024*7&#41; $rate_out=$speed_out-$speed_delta*7;
        if &#40;$mb_out>1024*8&#41; $rate_out=$speed_out-$speed_delta*8;

//если в поле radius_attr хранится запись типа 160/128 то скрипт выставляет именно эту скорость для входящего/исходящего

    if &#40;$row&#91;radius_attr&#93;!==""&#41;
    &#123;
        $arr_rate=explode&#40;"/",$row&#91;radius_attr&#93;&#41;;
        $rate_in=$arr_rate&#91;0&#93;;
        $rate_out=$arr_rate&#91;1&#93;;
    &#125;

    fputs  &#40;$f_in,"DEVICE=".$local_dev.",100Mbit,10Mbit\nRATE=".$rate_in."Kbit\nWEIGHT=10Kbit\nPRIO=5\n"&#41;;
    fputs  &#40;$f_out,"DEVICE=".$inet_dev.",100Mbit,10Mbit\nRATE=".$rate_out."Kbit\nWEIGHT=10Kbit\nPRIO=5\n"&#41;;
    $arr_ip=explode&#40;" ",$row&#91;ip&#93;&#41;;
    for&#40;$ai=0;$ai<count&#40;$arr_ip&#41;-1;$ai++&#41;
    &#123;
        fputs  &#40;$f_in,"RULE=".$arr_ip&#91;$ai&#93;."\n"&#41;;
        fputs  &#40;$f_out,"RULE=".$arr_ip&#91;$ai&#93;."\n"&#41;;
    &#125;
&#125;

//создаём правило для локальной сети не ограничивающее скорость для локалки
$fname=$cbq_patch."cbq-1000.out";
$f_out=fopen&#40;$fname,"w"&#41;;
fputs  &#40;$f_out,"DEVICE=".$local_dev.",100Mbit,10Mbit\nRATE=100Mbit\nWEIGHT=10Mbit\nPRIO=5
RULE=192.168.0.0/16,82.138.0.128/25
RULE=82.138.0.128/25,192.168.0.0/16
RULE=192.168.0.0/16,217.78.178.32/27
RULE=217.78.178.32/27,192.168.0.0/16
RULE=192.168.0.0/16,212.45.12.94/32
RULE=212.45.12.94/32,192.168.0.0/16\n"&#41;;
?>
пишем в крон скрипт cbq-unlim.sh

:lol:

ATT
Сообщения: 16
Зарегистрирован: Чт мар 03, 2005 15:07

Сообщение ATT »

Я так скажу - вещь страшно глючная!
У нас работала аналогичная система. При абсолютно не выясненных абстоятельствах периодически - от 1 до 5-10 раз в день\неделю слетала таблица CBQ.
Как результат - все анлимитчики становятся анлимитчиками на максимальной скорости;)

Сейчас уже 4 месяца для безлимитов работает ipfw pipe (BSD)
- полёт отличный.

Так что и вам советую. Чтобы не наступать на наши грабли)))

Закрыто