Готовое решение для Cisco+Netup Shaping!!!

Технические вопросы по UTM 5.0
Ответить
Minime
Сообщения: 17
Зарегистрирован: Чт ноя 26, 2009 08:47

Готовое решение для Cisco+Netup Shaping!!!

Сообщение Minime »

Насобирал тут на коленке наконец-то рабочее решение. Подключаемся, дорабатываем!!!!

shaper.php

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

<?php
require&#40;"config.inc.php"&#41;; 
require&#40;"Database.class.php"&#41;; 
$db = new Database&#40;DB_SERVER, DB_USER, DB_PASS, DB_DATABASE&#41;; 
$db->connect&#40;&#41;; 


function sendcisco&#40;$command_clear,$command_add&#41;&#123;
//ПОДКЛЮЧАЕМЫЕ МОДУЛИ
require 'Cisco.php';
///////////////////////////////////////////////////////////////////
//КОНФИГРУРАЦИЯ
$cisco_hostname = '11.11.11.11';	//ХОСТ
$cisco_username = '1';	//ЮЗЕР
$cisco_password = 'pass';	//ПАРОЛЬ
$cisco_enpasswd = 'enablepassword'; //ПАРОЛЬ НА ENABLE
///////////////////////////////////////////////////////////////////

//КОННЕКТИМСЯ
$cisco = new Cisco&#40;$cisco_hostname,$cisco_password,$cisco_username&#41;;
$cisco->connect&#40;&#41;;
$cisco -> enable&#40;$cisco_enpasswd&#41;;
///////////////////////////////////////////////////////////////////
$cisco -> sendcommand&#40;$command_clear,$command_add&#41;;
$cisco -> disable&#40;&#41;;
sleep&#40;3&#41;;
&#125;






function gethourtraff&#40;$db&#41; &#123;
//ОПРЕДЕЛЯЕМ ТЕКУЩИЙ ПРОМЕЖУТОК ВРЕМЕНИ
$time_now=time&#40;&#41;;
$time_past=&#40;$time_now-3600&#41;;

$sql = 'SELECT'
        . ' uname, account_id, SUM&#40;bytes&#41; bytes,'
        . ' inet_ntoa&#40;case when ipid > 0 then ipid else 4294967296+ipid end&#41; ipid'
        . ' FROM discount_transactions_iptraffic_all'
        . ' INNER JOIN ip_groups'
        . ' ON discount_transactions_iptraffic_all.ipid = ip_groups.ip AND ip_groups.is_deleted = 0'
        . ' WHERE discount_transactions_iptraffic_all.discount_date>='.$time_past
        . ' AND discount_transactions_iptraffic_all.discount_date <='.$time_now
        . ' AND discount_transactions_iptraffic_all.t_class="1"'
        . ' GROUP BY account_id,ipid'
        . ' ORDER BY account_id,ipid'; 
		
$rows = $db->query&#40;$sql&#41;;
$sql_delete = "DELETE FROM `".TABLE_TEMP."` WHERE 1=1"; 
$db->query&#40;$sql_delete&#41;;

while &#40;$record = $db->fetch_array&#40;$rows&#41;&#41; &#123;
	$data&#91;'login'&#93; = $record&#91;'uname'&#93;;
	$data&#91;'ip'&#93; = $record&#91;'ipid'&#93;; 
	$data&#91;'downloaded'&#93; = $record&#91;'bytes'&#93;/1048576; // query_insert&#40;&#41; will auto escape it for us 
	$db->query_insert&#40;"myshaper_temp", $data&#41;;
	&#125;
&#125;

function shape_user&#40;$db,$username,$ip,$acl_new,$acl_new_name,$acl_old,$acl_old_name,$sp_new,$sp_old,$next_speed&#41;&#123;
print&#40;"SHAPING USER ".$username." FROM ".$sp_old." TO ".$sp_new."\n"&#41;;
print&#40;"---------->>> clear access-template ".$acl_old." ".$acl_old_name." any host ".$ip."\n"&#41;;
print&#40;"---------->>> access-template ".$acl_new." ".$acl_new_name." any host ".$ip."\n"&#41;;
$command_clear = "clear access-template ".$acl_old." ".$acl_old_name." any host ".$ip;
$command_add = "access-template ".$acl_new." ".$acl_new_name." any host ".$ip;

sendcisco&#40;$command_clear,$command_add&#41;;
print&#40;"CHANGING CURRENT USER SPEED TO ".$next_speed." IN DATABASE\n"&#41;;
$data&#91;'currspeed'&#93; = $next_speed;
$db->query_update&#40;TABLE_USERS, $data, "login='".$username."'"&#41;;
&#125;

function unshape_user&#40;$db,$username,$ip,$acl_new,$acl_new_name,$acl_old,$acl_old_name,$sp_new,$sp_old,$next_speed&#41;&#123;
print&#40;"UNSHAPING USER ".$username." FROM ".$sp_old." TO ".$sp_new."\n"&#41;;
print&#40;"---------->>> clear access-template ".$acl_old." shaper1 any host ".$ip."\n"&#41;;
print&#40;"---------->>> access-template ".$acl_new." shaper1 any host ".$ip."\n"&#41;;
$command_clear = "clear access-template ".$acl_old." ".$acl_old_name." any host ".$ip;
$command_add = "access-template ".$acl_new." ".$acl_new_name." any host ".$ip;

sendcisco&#40;$command_clear,$command_add&#41;;
print&#40;"CHANGING CURRENT USER SPEED TO ".$next_speed." IN DATABASE\n"&#41;;
$data&#91;'currspeed'&#93; = $next_speed;
$db->query_update&#40;TABLE_USERS, $data, "login='".$username."'"&#41;;
&#125;

function checkusercurrenttraff&#40;$db,$username&#41;&#123;
$sql_check_user_traff = 'SELECT * FROM `myshaper_temp` WHERE login = \''.$username.'\'';
$rows = $db->query&#40;$sql_check_user_traff&#41;;
while &#40;$record = $db->fetch_array&#40;$rows&#41;&#41; &#123;
	$data&#91;'ip'&#93; = $record&#91;'ip'&#93;;
	$data&#91;'downloaded'&#93; = $record&#91;'downloaded'&#93;; 
&#125;
return $data;
&#125;

function checkuser&#40;$db,$username&#41;&#123;

$sql_check = 'SELECT * FROM `myshaper_users` WHERE login = \''.$username.'\'';
$rows = $db->query&#40;$sql_check&#41;;
while &#40;$record = $db->fetch_array&#40;$rows&#41;&#41; &#123;
	$data&#91;'login'&#93; = $record&#91;'login'&#93;;
	$data&#91;'currspeed'&#93; = $record&#91;'currspeed'&#93;; 
	$data&#91;'lim0'&#93; = $record&#91;'lim0'&#93;;
	$data&#91;'sp0'&#93; = $record&#91;'sp0'&#93;;
	$data&#91;'acl0'&#93; = $record&#91;'acl0'&#93;;
	$data&#91;'acl0name'&#93; = $record&#91;'acl0name'&#93;;
	$data&#91;'lim1'&#93; = $record&#91;'lim1'&#93;;
	$data&#91;'sp1'&#93; = $record&#91;'sp1'&#93;;
	$data&#91;'acl1'&#93; = $record&#91;'acl1'&#93;;
	$data&#91;'acl1name'&#93; = $record&#91;'acl1name'&#93;;
	$data&#91;'lim2'&#93; = $record&#91;'lim2'&#93;;
	$data&#91;'sp2'&#93; = $record&#91;'sp2'&#93;;
	$data&#91;'acl2'&#93; = $record&#91;'acl2'&#93;;
	$data&#91;'acl2name'&#93; = $record&#91;'acl2name'&#93;;
	print&#40;"+++++++++++++++++++++++++++++++++++++++++++++\n"&#41;;
	print&#40;"CHECKING USER ".$username." ...\n"&#41;;
	
	if &#40;$data&#91;'currspeed'&#93; == 'sp0'&#41;&#58;
		print&#40;"CURRENT USER SPEED&#58; ".$data&#91;'sp0'&#93;." &#40;".$data&#91;'currspeed'&#93;."&#41;\n"&#41;;
		print&#40;"TRAFFIC LIMIT FOR USER ON SPPED-0 IS&#58; ".$data&#91;'lim0'&#93;." MEGABYTES\n"&#41;;
		$ip_downloaded = checkusercurrenttraff&#40;$db,$username&#41;;
		print&#40;"USER DOWNLOADED IN THIS HOUR&#58; ".$ip_downloaded&#91;'downloaded'&#93;."\n"&#41;;
		print&#40;"USER IP ADDRESS IS&#58; ".$ip_downloaded&#91;'ip'&#93;."\n"&#41;;
			if &#40;$ip_downloaded&#91;'downloaded'&#93; > $data&#91;'lim0'&#93;&#41;&#58;
			print&#40;"+0+ USER DOWNLOADED _".$ip_downloaded&#91;'downloaded'&#93;."_ THAT IS MORE THAN CURRENT LIMIT ".$data&#91;'lim0'&#93;." +0+\n"&#41;;
			shape_user&#40;$db,$username,$ip_downloaded&#91;'ip'&#93;,$data&#91;'acl1'&#93;,$data&#91;'acl1name'&#93;,$data&#91;'acl0'&#93;,$data&#91;'acl0name'&#93;,$data&#91;'sp1'&#93;,$data&#91;'sp0'&#93;,'sp1'&#41;;
			else&#58;
			print&#40;"-0- USER DOWNLOADED _".$ip_downloaded&#91;'downloaded'&#93;."_ THAT IS OK!!! - CURRENT LIMIT ".$data&#91;'lim0'&#93;." -0-\n"&#41;;
			endif;
		endif;
	
		if &#40;$data&#91;'currspeed'&#93; == 'sp1'&#41;&#58;
		print&#40;"CURRENT USER SPEED&#58; ".$data&#91;'sp1'&#93;." &#40;".$data&#91;'currspeed'&#93;."&#41;\n"&#41;;
		print&#40;"TRAFFIC LIMIT FOR USER ON SPPED-1 IS&#58; ".$data&#91;'lim1'&#93;." MEGABYTES\n"&#41;;
		$ip_downloaded = checkusercurrenttraff&#40;$db,$username&#41;;
		print&#40;"USER DOWNLOADED IN THIS HOUR&#58; ".$ip_downloaded&#91;'downloaded'&#93;."\n"&#41;;
		print&#40;"USER IP ADDRESS IS&#58; ".$ip_downloaded&#91;'ip'&#93;."\n"&#41;;
			if &#40;$ip_downloaded&#91;'downloaded'&#93; > $data&#91;'lim1'&#93;&#41;&#58;
			print&#40;"+1+ USER DOWNLOADED _".$ip_downloaded&#91;'downloaded'&#93;."_ THAT IS MORE THAN CURRENT LIMIT ".$data&#91;'lim1'&#93;." +1+\n"&#41;;
			shape_user&#40;$db,$username,$ip_downloaded&#91;'ip'&#93;,$data&#91;'acl2'&#93;,$data&#91;'acl2name'&#93;,$data&#91;'acl1'&#93;,$data&#91;'acl1name'&#93;,$data&#91;'sp2'&#93;,$data&#91;'sp1'&#93;,'sp2'&#41;;
			else&#58;
			print&#40;"-1- USER DOWNLOADED _".$ip_downloaded&#91;'downloaded'&#93;."_ THAT IS GOOD!!! - CURRENT LIMIT ".$data&#91;'lim1'&#93;." -1-\n"&#41;;
			unshape_user&#40;$db,$username,$ip_downloaded&#91;'ip'&#93;,$data&#91;'acl0'&#93;,$data&#91;'acl0name'&#93;,$data&#91;'acl1'&#93;,$data&#91;'acl1name'&#93;,$data&#91;'sp0'&#93;,$data&#91;'sp1'&#93;,'sp0'&#41;;
			endif;
		endif;
		
		if &#40;$data&#91;'currspeed'&#93; == 'sp2'&#41;&#58;
		print&#40;"CURRENT USER SPEED&#58; ".$data&#91;'sp2'&#93;." &#40;".$data&#91;'currspeed'&#93;."&#41;\n"&#41;;
		print&#40;"TRAFFIC LIMIT FOR USER ON SPPED-2 IS&#58; ".$data&#91;'lim2'&#93;." MEGABYTES\n"&#41;;
		$ip_downloaded = checkusercurrenttraff&#40;$db,$username&#41;;
		print&#40;"USER DOWNLOADED IN THIS HOUR&#58; ".$ip_downloaded&#91;'downloaded'&#93;."\n"&#41;;
		print&#40;"USER IP ADDRESS IS&#58; ".$ip_downloaded&#91;'ip'&#93;."\n"&#41;;
			if &#40;$ip_downloaded&#91;'downloaded'&#93; > $data&#91;'lim2'&#93;&#41;&#58;
			print&#40;"+2+ USER IS SUPERDOWNLOADER _".$ip_downloaded&#91;'downloaded'&#93;."_ CONTINUING USING _LOWEST_ SPEED ".$data&#91;'lim2'&#93;." +2+\n"&#41;;
			else&#58;
			print&#40;"-2- USER DOWNLOADED _".$ip_downloaded&#91;'downloaded'&#93;."_ THAT IS GOOD!!! - CURRENT LIMIT ".$data&#91;'lim2'&#93;." -2-\n"&#41;;
			unshape_user&#40;$db,$username,$ip_downloaded&#91;'ip'&#93;,$data&#91;'acl1'&#93;,$data&#91;'acl1name'&#93;,$data&#91;'acl2'&#93;,$data&#91;'acl2name'&#93;,$data&#91;'sp1'&#93;,$data&#91;'sp2'&#93;,'sp1'&#41;;
			endif;
		endif;
&#125;
print&#40;"+++++++++++++++++++++++++++++++++++++++++++++\n"&#41;;
&#125;

gethourtraff&#40;$db&#41;;
checkuser&#40;$db,'test'&#41;;


$db->close&#40;&#41;;

?>
Cisco.php

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

<?php

class Cisco 
&#123;

    private $_hostname;
    private $_password;
    private $_username;
    private $_connection;
    private $_data;
    private $_timeout;
    private $_prompt;
	 
	public function getUserTraffic&#40;$user_interface&#41;
	&#123;
		$this->_send&#40;"sh int ".$user_interface." | in underruns"&#41;;
		$this->_readTo&#40;$this->_prompt&#41;;
		$result = array&#40;&#41;;
		$this->_data = explode&#40;"\r\n", $this->_data&#41;;
		array_pop&#40;$this->_data&#41;;
		$temp = $this->_data&#91;1&#93;;
		$temp = sscanf&#40;$temp, "%d %s %s %d %s %d %s"&#41;;
		$bytes = $temp&#91;3&#93;;
		$megabytes = $bytes/1048576;
		//TEST
		$string = $user_interface."&#58;".$megabytes."\n";
		return $string;
		//return $megabytes;
	&#125;
	
	public function sendcommand&#40;$command_clear,$command_add&#41;&#123;
	$this->_send&#40;$command_clear&#41;;
	sleep&#40;1&#41;;
	$this->_send&#40;$command_add&#41;;
	&#125;
	
    public function __construct&#40;$hostname, $password, $username = "", $timeout = 10&#41; 
    &#123;
        $this->_hostname = $hostname;
        $this->_password = $password;
        $this->_username = $username;
        $this->_timeout = $timeout;
    &#125; // __construct

    /**
     * Подключаемся к устройству
     */
    public function connect&#40;&#41; 
    &#123;
        $this->_connection = fsockopen&#40;$this->_hostname, 23, $errno, $errstr, $this->_timeout&#41;;
        if &#40;$this->_connection === false&#41; &#123;
            die&#40;"Error&#58; Connection Failed for $this->_hostname\n"&#41;;
        &#125; // if
        stream_set_timeout&#40;$this->_connection, $this->_timeout&#41;;
        $this->_readTo&#40;'&#58;'&#41;;
        if &#40;substr&#40;$this->_data, -9&#41; == 'Username&#58;'&#41; &#123;
            $this->_send&#40;$this->_username&#41;;
            $this->_readTo&#40;'&#58;'&#41;;
        &#125; // if
        $this->_send&#40;$this->_password&#41;;
        $this->_prompt = '>';
        $this->_readTo&#40;$this->_prompt&#41;;
        if &#40;strpos&#40;$this->_data, $this->_prompt&#41; === false&#41; &#123;
            fclose&#40;$this->_connection&#41;;
            die&#40;"Error&#58; Authentication Failed for $this->_hostname\n"&#41;;
        &#125; // if
    &#125; // connect

    /**
     * Закрываем соединение
     */
    public function close&#40;&#41; 
    &#123;
        $this->_send&#40;'quit'&#41;;
        fclose&#40;$this->_connection&#41;;
    &#125; // close

    /**
     * Даём команду в терминал
     */
    private function _send&#40;$command&#41; 
    &#123;
        fputs&#40;$this->_connection, $command . "\r\n"&#41;;
    &#125; // _send

    /**
     * Читаем терминал
     * 
     */
    private function _readTo&#40;$char&#41; 
    &#123;
        // Reset $_data
        $this->_data = "";
        while &#40;&#40;$c = fgetc&#40;$this->_connection&#41;&#41; !== false&#41; &#123;
            $this->_data .= $c;
            if &#40;$c == $char&#91;0&#93;&#41; break;
            if &#40;$c == '-'&#41; &#123;
                // Continue at --More-- prompt
                if &#40;substr&#40;$this->_data, -8&#41; == '--More--'&#41; fputs&#40;$this->_connection, ' '&#41;;
            &#125; // if
        &#125; // while
        // Remove --More-- and backspace
        $this->_data = str_replace&#40;'--More--', "", $this->_data&#41;;
        $this->_data = str_replace&#40;chr&#40;8&#41;, "", $this->_data&#41;;
        // Set $_data as false if previous command failed.
        if &#40;strpos&#40;$this->_data, '% Invalid input detected'&#41; !== false&#41; $this->_data = false;
    &#125; // _readTo

    /**
     * заходим в привелегированный режим Enable
     * 
     *  
     */
    public function enable&#40;$password&#41; 
    &#123;
        $result = false;
        if &#40;$this->_prompt != '#'&#41; &#123;
            $this->_send&#40;'enable'&#41;;
            $this->_readTo&#40;'&#58;'&#41;;
            $this->_send&#40;$password&#41;;
            if &#40;$this->_data !== false&#41; &#123;
                $this->_prompt = '#';
                $result = true;
            &#125; // if
            $this->_readTo&#40;$this->_prompt&#41;;
            return $result;
        &#125; // if
    &#125; // enable

    /**
     * Disable - выходим из Enable
     */
    public function disable&#40;&#41; 
    &#123;
        if &#40;$this->_prompt == '#'&#41; &#123;
            $this->_send&#40;'disable'&#41;;
            $this->_prompt = '>';
            $this->_readTo&#40;$this->_prompt&#41;;
        &#125; // if
    &#125; // disable

    /**
     * Ping
     */
    public function ping&#40;$host&#41; 
    &#123;
        $this->_send&#40;"ping $host"&#41;;
        $this->_readTo&#40;$this->_prompt&#41;;
        $this->_data = explode&#40;"\r\n", $this->_data&#41;;
        for &#40;$i = 0; $i < 3; $i++&#41; array_shift&#40;$this->_data&#41;;
        array_pop&#40;$this->_data&#41;;
        $this->_data = implode&#40;"\n", $this->_data&#41;;        
        return $this->_data;
    &#125; // ping
	
	public function getUsers&#40;&#41;
	&#123;
		$this->_send&#40;'show users'&#41;;
		$this->_readTo&#40;$this->_prompt&#41;;
		$result = array&#40;&#41;;
		$this->_data = explode&#40;"\r\n", $this->_data&#41;;
		array_pop&#40;$this->_data&#41;;
        foreach &#40;$this->_data as $entry&#41; &#123;
		
			if &#40;preg_match&#40;'/Bundle/i',$entry&#41;&#41; &#123;
			$temp = sscanf&#40;$entry, "%s %s %s %s %s %s"&#41;;
			$entry = array&#40;&#41;;
			$entry&#91;'idle'&#93; = $temp&#91;4&#93;;
			$entry&#91;'ip'&#93; = $temp&#91;5&#93;;
			&#125; else &#123;
			$temp = sscanf&#40;$entry, "%s %s %s %s %s"&#41;;
			$entry = array&#40;&#41;;
			$entry&#91;'idle'&#93; = $temp&#91;3&#93;;
			$entry&#91;'ip'&#93; = $temp&#91;4&#93;;
			&#125;//if
			
            $entry&#91;'interface'&#93; = $temp&#91;0&#93;;
            $entry&#91;'username'&#93; = $temp&#91;1&#93;;
			if &#40;strstr&#40;$entry&#91;'ip'&#93;,"10.1."&#41;&#41; &#123;
			$entry&#91;'uplink'&#93; = "USI";
			&#125; else &#123;
			$entry&#91;'uplink'&#93; = "RTK";
			&#125;//if
			if &#40;preg_match&#40;'/u\d\d/i',$entry&#91;'username'&#93;&#41;&#41; &#123;
			$entry&#91;'client_type'&#93; = "HOME";
			&#125; else &#123;
			$entry&#91;'client_type'&#93; = "CORPORATE";
			&#125;//if
			
			if &#40;$entry&#91;'idle'&#93; != 'Idle' && $entry&#91;'ip'&#93; != '' && $entry&#91;'ip'&#93; != 'Idle'&#41; &#123;
            array_push&#40;$result, $entry&#41;;
			&#125; //if
        &#125; // foreach
		$this->_data = $result;
		return $this->_data;
	&#125;

	public function getUsersBand&#40;&#41;
	&#123;
		$this->_send&#40;'show int summary | in Virtual-Acc'&#41;;
		$this->_readTo&#40;$this->_prompt&#41;;
		$result = array&#40;&#41;;
		$this->_data = explode&#40;"\r\n", $this->_data&#41;;
		array_pop&#40;$this->_data&#41;;
        foreach &#40;$this->_data as $entry&#41; &#123;
		
			if &#40;preg_match&#40;'/\*/i',$entry&#41;&#41; &#123;
			$temp = sscanf&#40;$entry, " * %s %s %s %s %s %s %s %s %s %s"&#41;;
			$temp&#91;0&#93; = str_replace&#40;"Virtual-Access","Vi",$temp&#91;0&#93;&#41;;
			$gotovo&#91;$temp&#91;0&#93;&#93; = $temp&#91;7&#93;;
			&#125; else &#123;
			$temp = sscanf&#40;$entry, " %s %s %s %s %s %s %s %s %s %s"&#41;;
			$temp&#91;0&#93; = str_replace&#40;"Virtual-Access","Vi",$temp&#91;0&#93;&#41;;
			$gotovo&#91;$temp&#91;0&#93;&#93; = $temp&#91;7&#93;;
			&#125;

        &#125; // foreach
		//$this->_data = &#40;$result&#41;;
		//print_r&#40;$gotovo&#41;;
		return $gotovo;
	&#125;
	
	
		public function getUsersTraff&#40;&#41;
	&#123;
		$this->_send&#40;'show int'&#41;;
		$this->_readTo&#40;$this->_prompt&#41;;
		//print_r&#40;$this->_data&#41;;
		$result = array&#40;&#41;;
		//$this->_data = explode&#40;"\r\n", $this->_data&#41;;
		preg_match_all&#40;'/Virtual-Access&#40;\d*&#41;.*?\d*\spackets\soutput.*?&#40;\d*&#41;\sbytes.*?transitions/ims',$this->_data,$users_downloaded&#41;;
/*		for &#40;$i=0;$i<count&#40;$testarr&#91;1&#93;&#41;;$i++&#41; &#123;
		$testarr&#91;1&#93;&#91;$i&#93;="Vi".$testarr&#91;1&#93;&#91;$i&#93;;
		print&#40;$testarr&#91;1&#93;&#91;$i&#93;."&#58;".$testarr&#91;2&#93;&#91;$i&#93;."\n"&#41;;
		&#125;
*/
		$users_summary_downloaded = 0;
		for &#40;$i=0;$i<count&#40;$users_downloaded&#91;1&#93;&#41;;$i++&#41; &#123;
		$users_downloaded&#91;1&#93;&#91;$i&#93;="Vi".$users_downloaded&#91;1&#93;&#91;$i&#93;;
		$user_interface=$users_downloaded&#91;1&#93;&#91;$i&#93;;
		$user_downl=$users_downloaded&#91;2&#93;&#91;$i&#93;;
		$users_downloaded_final&#91;$user_interface&#93;=$user_downl;
		$users_summary_downloaded=$users_summary_downloaded+$users_summary_downloaded;
		&#125;
		$users_downloaded_final&#91;'summary'&#93;=$users_summary_downloaded;
		return $users_downloaded_final;
	&#125;
&#125; // Cisco		
//
Класс для работы с mysql забираем отсюда: http://www.ricocheting.com/scripts/php_ ... rapper.php

СОЗДАЕМ БАЗЫ ДАННЫХ:

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

CREATE TABLE `myshaper_temp` &#40;
  `id` int&#40;11&#41; NOT NULL auto_increment,
  `login` varchar&#40;16&#41; NOT NULL,
  `ip` varchar&#40;15&#41; NOT NULL,
  `downloaded` int&#40;11&#41; NOT NULL,
  PRIMARY KEY  &#40;`id`&#41;
&#41;;

CREATE TABLE `myshaper_users` &#40;
  `id` int&#40;11&#41; NOT NULL auto_increment,
  `login` varchar&#40;16&#41; NOT NULL,
  `sp0` int&#40;11&#41; NOT NULL,
  `lim0` int&#40;11&#41; NOT NULL,
  `acl0` int&#40;11&#41; NOT NULL,
  `acl0name` varchar&#40;12&#41; NOT NULL,
  `sp1` int&#40;11&#41; NOT NULL,
  `lim1` int&#40;11&#41; NOT NULL,
  `acl1` int&#40;11&#41; NOT NULL,
  `acl1name` varchar&#40;12&#41; NOT NULL,
  `sp2` int&#40;11&#41; NOT NULL,
  `lim2` int&#40;11&#41; NOT NULL,
  `acl2` int&#40;11&#41; NOT NULL,
  `acl2name` varchar&#40;12&#41; NOT NULL,
  `currspeed` varchar&#40;3&#41; NOT NULL default 'sp0',
  PRIMARY KEY  &#40;`id`&#41;
&#41; ENGINE=MyISAM DEFAULT CHARSET=latin1;
НА ЦИСКЕ!!!:
Создаём соотв. акцесс листы, например:
access-list 180 dynamic speed672 permit ip any any
access-list 181 dynamic speed448 permit ip any any
access-list 182 dynamic speed339 permit ip any any

на интерфейсе циски, на котором сидят пользователи создаём акцесс-группы, соответствующие заданным акцесс листам:
rate-limit output access-group 180 672000 84000 84000 conform-action transmit exceed-action drop
rate-limit output access-group 181 448000 56000 56000 conform-action transmit exceed-action drop
rate-limit output access-group 182 328000 42000 42000 conform-action transmit exceed-action drop

-----------------------------------
В отличии от dynashape, скрипт позволяет лимитировать трафик по загрузке "в течении текущего промежутка времени", не скидывая лимиты по окончанию периода. Конечно, требует доработки. Можно дописать шейпинг в зависимости от загрузки канала, итд.
[/b]

Minime
Сообщения: 17
Зарегистрирован: Чт ноя 26, 2009 08:47

Сообщение Minime »

Да, и еще забыл прикрутить цикл while чтобы проверял всех пользователей из базы. Сейчас проверяется только один юзер:
checkuser($db,'test');

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

Теперь сотри эту порнографию и переделай на SNMP

Minime
Сообщения: 17
Зарегистрирован: Чт ноя 26, 2009 08:47

Сообщение Minime »

Абсолютно справедливое замечание, совсем забыл об SNMP, думал о внешнем вызове rsh через system, но на SNMP на самом деле будет удобнее. Разве что tftp нужен будет. Механизм заметно упростится - при каждом запуске будут удаляться старые и формироваться новые ACL, которые будут заливаться в виде готового конфига. Это поможет избежать дублирования правил при сбоях. Спасибо за идею!

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Ждем реализации на snmp тут ;)

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

Minime писал(а):Абсолютно справедливое замечание, совсем забыл об SNMP, думал о внешнем вызове rsh через system, но на SNMP на самом деле будет удобнее. Разве что tftp нужен будет. Механизм заметно упростится - при каждом запуске будут удаляться старые и формироваться новые ACL, которые будут заливаться в виде готового конфига. Это поможет избежать дублирования правил при сбоях. Спасибо за идею!
Есть еще момент:
1) У тя выборка по транзакшин_иптрафик, а лучше бы выбирать по довнлоадс, оригинальный шейпер по ней и выбирает насколько я помню.

Minime
Сообщения: 17
Зарегистрирован: Чт ноя 26, 2009 08:47

Сообщение Minime »

Дорабатываю вторую версию, после теста выложу в паблик. Немного изменил алгоритм шейпирования. Механизм управления acl на cisco производится с помощью rcmd (rcp+rsh). Сброс ограничений для пользователей, находящихся в оффлайне теперь отрабатывает корректно.

Antares
Сообщения: 59
Зарегистрирован: Вт мар 11, 2008 08:28

Сообщение Antares »

ждёмс :)

solomon
Сообщения: 316
Зарегистрирован: Вт мар 16, 2010 08:39

Сообщение solomon »

НУ так как тесты прошли? интересно было бы узнать результаты

solomon
Сообщения: 316
Зарегистрирован: Вт мар 16, 2010 08:39

Сообщение solomon »

Хотелось бы узнать о результатах )))))

Antares
Сообщения: 59
Зарегистрирован: Вт мар 11, 2008 08:28

Сообщение Antares »

всё, тема умерла???

Lamobot
Сообщения: 12
Зарегистрирован: Пн мар 31, 2008 13:26
Контактная информация:

Сообщение Lamobot »

Ждём варианта с snmp

Munsera
Сообщения: 126
Зарегистрирован: Чт янв 27, 2011 15:29

Сообщение Munsera »

До сих пор ждем)

Ответить