LINUX.ORG.RU

управление трафиком, поделка (phpLimeter)


0

0

Тут недавно очередной раз плакали, что как бы вопрос с управлением трафика решить. Для людей имеющих узкий канал (64K и т.п.).

Сделано для FireFox и KTorrent на php. Для работы все это и нужно. Но все это можно заменить, при желании.

Сия прога управляет распределением трафика, или типа того. При простое включается закачка и узкий канал загружается полностью. Как только вы воспользуетесь FireFox - усе сразу ж останавливается.

Отсчитывает $conf_delay после последней нагрузки firefox-bin и заново включает закачку.

(код в первом посте)

P.S. Заодно можете и индусокод пообсуждать и быдлокодерство и убогость пыхпыха - мне не жалко.

листинг

#!/usr/bin/php
<?php
/*
Запуск: php phpLimeter.php

Сия прога управляет распределением трафика, или
типа того. При простое включается закачка и
узкий канал загружается полностью. Как только
вы воспользуетесь FireFox - усе сразу ж
останавливается.
Отсчитывает $conf_delay после последней
нагрузки firefox-bin и заново включает
закачку.

Что можно поменять:
* вместо остановки можно снижать скорость:
  dcop ktorrent KTorrent setMaxDownloadSpeed 4

  (но у меня очень узкий канал, очень очень, потому
   я стопорю это дело)

  Все возможные функции KTorrent можно узнать:
  dcop ktorrent KTorrent

* $conf_*

* можно использовать и Оперу:
  $conf_prog  = 'opera';

* вроде б в d4x было управление через консоль

*/

$conf_delay = 60;            // задержка после в секунах
$conf_prog  = 'firefox-bin'; // отслеживаемый процесс
$conf_cpu   = 15;            // %CPU процесса для срабатывания
$conf_down  = 'dcop ktorrent KTorrent stopAll 1';
$conf_up    = 'dcop ktorrent KTorrent startAll 1';


/******************************************************/
$delay=0;
$speed_down=false;
`dcop ktorrent KTorrent startAll 1`;

do
{
	$top = top();

	// ОгнеЛис замечен, Вылкючаем торренты!
	if(@$top[$conf_prog] > $conf_cpu)
	{
		echo "\nFireFox %CPU={$top['firefox-bin']}\n";

		if(!$speed_down)
		{
			echo "STOP KTorrent\n";

			`$conf_down`;
			$speed_down = true;
		}

		$delay = 0;
	}
	else
	{
		if($speed_down && ($delay > $conf_delay))
		{
			echo "\nSTART   KTorrent\n";

			`$conf_up`;
			$speed_down = false;
		}

		$delay++;
	}

	sleep(1);
	echo ".";
}while(1);


//список процессов
function top()
{
	$top = `top -b -n 1`;
	// PID USER  PR  NI  VIRT  RES  SHR S %CPU %MEM  TIME+  COMMAND
	//  0   1     2   3   4    5    6   7   8    9    10    11

	$top = explode("\n", trim($top));
	$top = array_map('trim', $top);

	$return = array();
	for($i = 7; $i < 20; $i++)
	{
		$f_ = preg_split("|\s+|", trim($top[$i]));

		$name = $f_[11];
		$cpu  = (float)$f_[8];

		if(isset($return[$name]))
			$return[$name] += $cpu;
		else
			$return[$name] = $cpu;
	}
	return $return;
}



?>

CtrlAltBs
() автор топика
Ответ на: листинг от CtrlAltBs

Может лучше анализировать не загрузку CPU, а сокеты (netstat). Как появляются сокеты на 80 порт (или новые tcp-сокеты), значит нужно останавливать torrent...

mky ★★★★★
()
Ответ на: комментарий от mky

Я об этом и хотел спросить. Да, надо будет попробовать на следующей неделе. Спасибо.

CtrlAltBs
() автор топика
Ответ на: комментарий от mky

листинг с netstat

На скору руку так.
netstat -p -n -v --protocol=inet | grep firefox
Вроде работает. Но один неприятный момент - не могу избавиться от
сообщений
(Не все процессы были идентифицированы, информация о процессах без владельца
 не будет отображена, вам нужны права суперпользователя (root), чтобы увидеть всю информацию.)
И не понять как это выводится. При захвате вывода netstat - этого нет,
но каким то макаром в терминал лезет. Т.е. при
netstat -p -n -v --protocol=inet | grep firefox > tmp
в tmp не будет этого сообщения, но в терминале выводиться.
Что делать? Видимо новую тему нужно создавать по этому вопросу,
либо книжки читать.


#!/usr/bin/php
<?php
/*
Запуск: php phpLimeter.php

Сия прога управляет распределением трафика, или
типа того. При простое включается закачка и
узкий канал загружается полностью. Как только
вы воспользуетесь FireFox - усе сразу ж
останавливается.
Отсчитывает $conf_delay после последней
нагрузки firefox-bin и заново включает
закачку.

Что можно поменять:
* вместо остановки можно снижать скорость:
  dcop ktorrent KTorrent setMaxDownloadSpeed 4

  (но у меня очень узкий канал, очень очень, потому
   я стопорю это дело)

  Все возможные функции KTorrent можно узнать:
  dcop ktorrent KTorrent

* $conf_*

* можно использовать и Оперу:
  $conf_prog  = 'opera';

* вроде б в d4x было управление через консоль

*/

$conf_delay = 60;            // задержка после в секунах
$conf_prog  = 'firefox-bin'; // отслеживаемый процесс
$conf_cpu   = 22;            // %CPU процесса для срабатывания
$conf_down  = 'dcop ktorrent KTorrent stopAll 1';
$conf_up    = 'dcop ktorrent KTorrent startAll 1';


/******************************************************/
$delay=0;
$speed_down=false;
`dcop ktorrent KTorrent startAll 1`;

do
{
//	$top = top();
	$firefox = firefox_is();

	// ОгнеЛис замечен, Вылкючаем торренты!
	//	if(@$top[$conf_prog] > $conf_cpu)
	if(strlen($firefox))
	{
//		echo "\nFireFox %CPU={$top['firefox-bin']}\n";
		echo "\n$firefox\n";

		if(!$speed_down)
		{
			echo "STOP KTorrent\n";

			`$conf_down`;
			$speed_down = true;
		}

		$delay = 0;
	}
	else
	{
		if($speed_down && ($delay > $conf_delay))
		{
			echo "\nSTART   KTorrent\n";

			`$conf_up`;
			$speed_down = false;
		}

		$delay++;
	}

	sleep(1);
	echo ".";
}while(1);


//список процессов
function top()
{
	$top = `top -b -n 1`;
	// PID USER  PR  NI  VIRT  RES  SHR S %CPU %MEM  TIME+  COMMAND
	//  0   1     2   3   4    5    6   7   8    9    10    11

	$top = explode("\n", trim($top));
	$top = array_map('trim', $top);

	$return = array();
	for($i = 7; $i < 20; $i++)
	{
		$f_ = preg_split("|\s+|", trim($top[$i]));

		$name = $f_[11];
		$cpu  = (float)$f_[8];

		if(isset($return[$name]))
			$return[$name] += $cpu;
		else
			$return[$name] = $cpu;
	}
	return $return;
}



function firefox_is()
{
	$return = `netstat -p -n -v --protocol=inet | grep firefox`;
	$return = trim($return);

	return $return;
}


?>

CtrlAltBs
() автор топика
Ответ на: листинг с netstat от CtrlAltBs

>Что делать? Видимо новую тему нужно создавать по этому вопросу,
либо книжки читать.

Это юмор такой? Создать тему про stderr?
Все таки лучше почитать книжки...

Чтото типа
netstat -p -n -v --protocol=inet | grep firefox 2>/dev/null

Но, ИМХО, -v лишняя опция, и grep лучше убрать, лучше в php смотреть,
есть ли выводе netstat строки, содержащие "firefox"
(а то так получается запуск дополнительного процесса).

P.S. Почему убрали поддержку Opera?

mky ★★★★★
()

Мегажесть. Домашнее задание - цепляться к вебкамере и проводить анализ на цвета. Как только содержание красного в кадре будет превышать отношение глобальности к надёжности - выводить сообщение на экран: "ПЫЩ!!!"

Anoxemian ★★★★★
()
Ответ на: комментарий от mky

листинг с netstat v2

> netstat -p -n -v --protocol=inet | grep firefox 2>/dev/null 
Да, но чуть иначе:
netstat -tpn 2>/dev/null | grep firefox

> и grep лучше убрать, лучше в php смотреть, 
OK

> Почему убрали поддержку Opera?
Поправил и убрал весь мусор. Получилось очень компактно.



#!/usr/bin/php
<?php
/*
Запуск: php phpLimeter.php

Сия прога управляет распределением трафика, или
типа того. При простое включается закачка и
узкий канал загружается полностью. Как только
вы воспользуетесь FireFox/Opera - закачка
останавливается (либо ограничивается).

Отсчитывает $conf_delay после последней
нагрузки firefox-bin и заново включает
закачку.

Что можно поменять:
* вместо остановки можно снижать скорость:
  dcop ktorrent KTorrent setMaxDownloadSpeed 4

  (но у меня очень узкий канал, очень очень, потому
   я стопорю это дело)

  Все возможные функции KTorrent можно узнать:
  dcop ktorrent KTorrent

* $conf_*

* можно использовать и Оперу:
  $conf_prog  = 'opera';

* вроде б в d4x было управление через консоль

*/

$conf_delay = 60;            // задержка после в секунах
$conf_prog  = 'firefox-bin'; // отслеживаемый процесс
$conf_down  = 'dcop ktorrent KTorrent stopAll 1';
$conf_up    = 'dcop ktorrent KTorrent startAll 1';

/******************************************************/
$delay=0;
$speed_down=false;
`dcop ktorrent KTorrent startAll 1`;

do
{
	$netstat = `netstat -tpn 2>/dev/null`;

	// процесс замечен, Вылкючаем торренты!
	if(strpos($netstat, $conf_prog) !== false) //read strpos manual
	{
		echo "\n$conf_prog in netstat\n";

		if(!$speed_down)
		{
			echo "\nSTOP  KTorrent\n";
			`$conf_down`;
			$speed_down = true;
		}

		$delay = 0;
	}
	else
	{
		if($speed_down && ($delay > $conf_delay))
		{
			echo "\nSTART KTorrent\n";
			`$conf_up`;
			$speed_down = false;
		}

		$delay++;
	}

	sleep(1);
	echo ".";
}while(1);

?>

CtrlAltBs
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.