Биллинговая система Nodeny
24 Ноября 2024, 18:19:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2 3
  Печать  
Автор Тема: Модуль контроля полосы пропускания (альтернативная версия)  (Прочитано 28374 раз)
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« : 13 Января 2010, 08:56:32 »

Альтернативаня бесплатная версия модуля контроля полосы пропускания


Cкрипт который из базы биллинга выдергивает имена юзеров и создает в какти графики для каждого пользователя.
Почитать как добавить график из командной строки можно здесь http://www.cacti.net/downloads/docs/html/cli_add_graphs.html
Код:
cat /usr/local/share/cacti/cli/make_many_graphs.pl
Код:
#!/usr/bin/perl

use DBI;

$main_config='/usr/local/nodeny/nodeny.cfg.pl';
require $main_config;

$DSN="DBI:mysql:database=$db_name;host=$db_server;mysql_connect_timeout=$mysql_connect_timeout;";
$dbh=DBI->connect($DSN,$user,$pw,{PrintError=>1});

$uq=300; #первыйх N юзеров для которых надо создать графики
$tmpl_id=36; #graph-template-id читаем это http://www.cacti.net/downloads/docs/html/cli_add_graphs.html
$hid=3; #host-id читаем это http://www.cacti.net/downloads/docs/html/cli_add_graphs.html

for($i=1; $i<=$uq; $i++)
{
$query="SELECT `name` FROM `users` WHERE `id`=$i";

$sth=$dbh->prepare($query);
$sth->execute;

$rv=$sth->fetchrow_hashref;
$username=$rv->{name};

    if ($username ne "")
    {
    system("/usr/local/bin/php /usr/local/share/cacti/cli/add_graphs.php --graph-type=cg --graph-template-id=$tmpl_id --input-fields=\"uid=$i\" --graph-title=$username --host-id=$hid --force");
    }
}

Дальше делаем скрипт который будет из базы биллинга выбирать из X таблиц данные по трафику для юзера по id за последние 5 минут и скармливаем аутпут какти.
Код:
cat /usr/local/share/cacti/scripts/usertraf.pl
Код:
#!/usr/bin/perl

use DBI;

$main_config='/usr/local/nodeny/nodeny.cfg.pl';
require $main_config;

$DSN="DBI:mysql:database=$db_name;host=$db_server;mysql_connect_timeout=$mysql_connect_timeout;";
$dbh=DBI->connect($DSN,$user,$pw,{PrintError=>1});

$userid=$ARGV[0];

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year=$year+1900;
$mon=$mon+1;

$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND FROM_UNIXTIME(`time`)>'".$year."-".$mon."-".$mday." ".$hour.":".($min-5).":".$sec."'";

$sth=$dbh->prepare($query);
$sth->execute;

$rv=$sth->fetchrow_hashref;
if ($rv->{averin} && $rv->{averout})
{
print "in:$rv->{averin} out:$rv->{averout}";
}else
{
print "in:0 out:0";
}

Дальше сама настройка какти.

1. Логинимся
2. Console
3. Data Input Methods
  3.1 Add
  3.2 Name  -  Users traffic
  3.3 Input Type  -  Script/Command
  3.4 Input String  -  perl <path_cacti>/scripts/userstraf.pl <id>
  3.5 Create
  3.6 Input Fields->Add
     3.6.1 Friendly Name - User id
     3.6.2 Create
  3.7 Output Fields->Add
     3.7.1 Field [Output] - in
     3.7.2 Friendly Name - Traffic in
     3.7.3 Create
 3.8 Output Fields->Add
     3.7.1 Field [Output] - out
     3.7.2 Friendly Name - Traffic out
     3.7.3 Create
 3.9 Save
4. Data Templates
 4.1 Add
 4.2 Data Templates [new]-> Name - Users traffic
 4.3 Data Source->Name - User traffic
 4.4 Data Input Method - Users traffic
 4.5 Data Source Item  -> Internal Data Source Name - in
 4.6 Create
 4.7 Data Source Item - New
 4.8 Data Source Item -> Internal Data Source Name - out
 4.9 Custom Data [data input: Users traffic] -> User id - Ставим галочку Use Per-Data Source Value (Ignore this Value)
 4.10 Save
5. Graph Templates
 5.1 Add
 5.2 Template->Name - User traffic
 5.3 Graph Template->Title (--title) - Ставим галочку Use Per-Graph Value (Ignore this Value)
 5.4 Create

 5.5 Graph Template Items
 5.6 Add
 5.7 Data Source - Users traffic - (in)
 5.8 Color - 00CF00
 5.9 Graph Item Type - AREA
 5.10 Consolidation Function - AVERAGE
 5.11 Text Format - Inbound:

 5.12 Graph Template Items
 5.13 Add
 5.14 Data Source - Users traffic - (in)
 5.15 Color - NONE
 5.16 Graph Item Type - GPRINT
 5.17 Consolidation Function - LAST
 5.18 Text Format - Current:

 5.19 Graph Template Items
 5.20 Add
 5.21 Data Source - Users traffic - (in)
 5.22 Color - NONE
 5.23 Graph Item Type - GPRINT
 5.24 Consolidation Function - AVERAGE
 5.25 Text Format - Average:

 5.19 Graph Template Items
 5.20 Add
 5.21 Data Source - Users traffic - (in)
 5.22 Color - NONE
 5.23 Graph Item Type - GPRINT
 5.24 Consolidation Function - MAX
 5.25 Text Format - Maximum:
 5.26 Insert Hard Return - true

6. Повторяем пункты 5.5 - 5.26 только для Data Source - Users traffic - (out)  (пункт 5.7 in меняем на out, пункт 5.9 Graph Item Type - LINE1)
7. Save

8. New Graphs
8.1 Выбираем нужный нам хост   Host:
8.2 Graph Templates->Create: User traffic
8.3 Create
8.4 Create Graph from 'User traffic' - вводим логин юзера   marinka
8.5 User id - 1115

Ну вот один график добавили, выше приведен скрипт который автоматизирует добавление графиков для пользователей из базы данных биллинга.

Собственно сам модуль на Perl для биллинга.
cat /usr/local/nodeny/web/Sgraph.pl

Код:

#!/usr/bin/perl



$VER=50.32;



use LWP;

use DBI;

use HTTP::Cookies;

use HTTP::Request::Common;



$database_default = "cacti";
 #данные для коннекта к бд какти
$database_hostname = "localhost";

$database_username = "cactiuser";  

$database_password = "cactiuser";



$cacti_user="cacti";
   #данные для входа в через веб интерфейс какти
$cacti_password="cacti";



$csi='1.1.1.1';



$DSN2="DBI:mysql:database=$database_default;host=$database_hostname;mysql_connect_timeout=$mysql_connect_timeout;";

$dbh2=DBI->connect($DSN2,$database_username,$database_password,{PrintError=>1});



sub GC_main

{

$OUT.=&Center_Mess("<span class=data2>Контроль загрузки канала</span><br>");



$query="SELECT `name` FROM `users` WHERE `id`=$Mid";

$p = &sql_select_line($dbh, $query, '');

$username=$p->{name};

$query="SELECT `local_graph_id` FROM `graph_templates_graph` WHERE `title`='$username'";

$sth2=$dbh2->prepare($query);

$sth2->execute;



$rv=$sth2->fetchrow_hashref;

$lgi=$rv->{local_graph_id};

$link_h="http://$csi/cacti/graph_image.php?action=view&local_graph_id=$lgi&rra_id=5";

$link_d="http://$csi/cacti/graph_image.php?action=view&local_graph_id=$lgi&rra_id=1";

$link_w="http://$csi/cacti/graph_image.php?action=view&local_graph_id=$lgi&rra_id=2";

$link_m="http://$csi/cacti/graph_image.php?action=view&local_graph_id=$lgi&rra_id=3";

$link_y="http://$csi/cacti/graph_image.php?action=view&local_graph_id=$lgi&rra_id=4";



$browser = LWP::UserAgent->new;

$browser->cookie_jar( HTTP::Cookies->new('file' => '/tmp/cookies.lwp',autosave => 1, ignore_discard=>1,));



$request=POST ($link_h, [action=>'login',login_username=>'cacti', login_password=>'cacti'],'Accept' => 'image/png',);

$response = $browser->request($request);

open (file, '> /usr/local/www/apache22/data/i/png/'.$username.'_h.png');

print file $response->content;

close(file);



$request=POST ($link_d, [action=>'login',login_username=>'cacti', login_password=>'cacti'],'Accept' => 'image/png',);

$response = $browser->request($request);

open (file, '> /usr/local/www/apache22/data/i/png/'.$username.'_d.png');

print file $response->content;

close(file);



$request=POST ($link_w, [action=>'login',login_username=>'cacti', login_password=>'cacti'],'Accept' => 'image/png',);

$response = $browser->request($request);

open (file, '> /usr/local/www/apache22/data/i/png/'.$username.'_w.png');

print file $response->content;

close(file);



$request=POST ($link_m, [action=>'login',login_username=>'cacti', login_password=>'cacti'],'Accept' => 'image/png',);

$response = $browser->request($request);

open (file, '> /usr/local/www/apache22/data/i/png/'.$username.'_m.png');

print file $response->content;

close(file);



$request=POST ($link_y, [action=>'login',login_username=>'cacti', login_password=>'cacti'],'Accept' => 'image/png',);

$response = $browser->request($request);

open (file, '> /usr/local/www/apache22/data/i/png/'.$username.'_y.png');

print file $response->content;

close(file);



$OUT.=&Center_Mess("Hourly<br><img src=http://$csi/i/png/".$username."_h.png /><br>

   Daily<br><img src=http://$csi/i/png/".$username."_d.png /><br>

                            Weekly<br><img src=http://$csi/i/png/".$username."_w.png /><br>

                            Monthly<br><img src=http://$csi/i/png/".$username."_m.png /><br>

                            Yearly<br><img src=http://$csi/i/png/".$username."_y.png /><br>

                            ");

}

Код:
mkdir /usr/local/www/apache22/data/i/png
Код:
echo “120		Sgraph			GC_main			Контроль загрузки канала		0		0
” >> /usr/local/nodeny/web/plugin_reestr.cfg

Операции — Настройки — Клиентская статистика — Список плагинов
Добавьте Sgraph

Пользуйтесь на здоровье. Всем успеха. :-))
« Последнее редактирование: 30 Апреля 2010, 09:44:40 от elite » Записан
Cell
Модератор
Спец
*****

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #1 : 13 Января 2010, 20:28:41 »

Продолжим, теперь о самом "модуле" ))
Лазить скриптом в вебморду Cacti чтобы сграбить график - это просто полная жесть. Других слов нет.
Когда я в описании к своему модулю упомянул Cacti (зря я это сделал ))) я имел ввиду дизайн самой картинки и БОЛЬШЕ НИЧЕГО. Я не использую Cacti вообще никак. Мой модуль инсталлируется в течении 5 минут и не требует никакой настройки.
Вот так вот.
Вердикт - не рекомендуется к использованию, хотя и не запрещается )))
Записан
Cell
Модератор
Спец
*****

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #2 : 14 Января 2010, 00:56:06 »

Тут сейчас речь слегка не об этом )
В моем модуле http://forum.nodeny.com.ua/index.php?topic=367.0 ничего такого настраивать не надо, нужно просто чтобы утилита rrdtool была установлена на сервер, только и всего.
Записан
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #3 : 14 Января 2010, 11:07:33 »

небольшой патчик

Код:
--- /usr/local/share/cacti/scripts/usertraf.pl	2010-01-14 11:17:14.000000000 +0200
+++ /home/admin/usertraf.pl 2010-01-14 11:17:46.000000000 +0200
@@ -15,7 +15,7 @@
 $year=$year+1900;
 $mon=$mon+1;
 
-$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND FROM_UNIXTIME(`time`)>'".$year."-".$mon."-".$mday." ".$hour.":".($min-5).":".$sec."'";
+$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND  `time`>UNIX_TIMESTAMP()-300";
 
 $sth=$dbh->prepare($query);
 $sth->execute;
Записан
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #4 : 14 Января 2010, 11:16:38 »

Продолжим, теперь о самом "модуле" ))
Лазить скриптом в вебморду Cacti чтобы сграбить график - это просто полная жесть. Других слов нет.
Когда я в описании к своему модулю упомянул Cacti (зря я это сделал ))) я имел ввиду дизайн самой картинки и БОЛЬШЕ НИЧЕГО. Я не использую Cacti вообще никак. Мой модуль инсталлируется в течении 5 минут и не требует никакой настройки.
Вот так вот.
Вердикт - не рекомендуется к использованию, хотя и не запрещается )))

Никакая это не жесть, какти прорисует график правильно, тем более есть возможность через вебморду управлять шаблонами, что есть +.
А я вот рекомендую в использование.
Записан
vnd
Новичок
*

Карма: 0
Offline Offline

Сообщений: 4


Просмотр профиля Email
« Ответ #5 : 31 Января 2010, 14:27:44 »

Даю юзерам 100мбит Украины. В описании модуля прочитал, что 100мбит лучше не указывать, т.к. будут неточности и скачки. Так и есть. Местами полная ахинея получается. Как быть?

Вопрос, возможно, не по адресу. Надо было поместить его в ветку с платной версией модуля.
Модераторы, перенесете или пусть здесь будет?
« Последнее редактирование: 31 Января 2010, 14:29:59 от vnd » Записан
vnd
Новичок
*

Карма: 0
Offline Offline

Сообщений: 4


Просмотр профиля Email
« Ответ #6 : 31 Января 2010, 16:17:46 »

Вопрос относитя к платному модулю.
$max_count=16000000; // из расчета что канал у юзера не может быть выше 16 мбит\с, можно конечно выставить и
                        100Мбит\с и не парить мозг, но при переходе на следующий месяц будут наблюдатся
                        безумные броски и  это все будет не очень красиво, потому ставим реальные цифры.


Вот у меня наблюдается те самые броски и даже без перехода на сл. месяц.
Записан
Cell
Модератор
Спец
*****

Карма: 52
Offline Offline

Сообщений: 1407



Просмотр профиля
« Ответ #7 : 31 Января 2010, 16:28:40 »

тут ничего удивительного нет, если юзер сначала берет 100 мбит Украины а потом 1 Мбит интернета то спрашивается, что вы хотите увидеть на графике если вы эти направления суммируете?
Записан
evp
NoDeny
Постоялец
*

Карма: -6
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #8 : 31 Января 2010, 23:15:40 »

Цитата: VitalVas
та ну нах рддтулл, когдато прийшлось его настраевать, гемору было куча
от самый простой и легкий вариант http://vitalvas.pp.ua/?id=7
Угу. Семь(!) экранов текста это "самый простой и легкий вариант"? Как же! Купите лучше платный модуль и сравните - краткость изложения и простота в установке (займет немного времени, если не обращать внимание на "ставиться будет долго т.к. тянет за собой довольно много зависимостей", но зато становится автоматом и не требует настроек) . The Best!
Записан
Fredik
NoDeny
Старожил
*

Карма: 5
Offline Offline

Сообщений: 362


Просмотр профиля
« Ответ #9 : 31 Января 2010, 23:46:43 »

Цитата: VitalVas
та ну нах рддтулл, когдато прийшлось его настраевать, гемору было куча
от самый простой и легкий вариант http://vitalvas.pp.ua/?id=7
Угу. Семь(!) экранов текста это "самый простой и легкий вариант"? Как же! Купите лучше платный модуль и сравните - краткость изложения и простота в установке (займет немного времени, если не обращать внимание на "ставиться будет долго т.к. тянет за собой довольно много зависимостей", но зато становится автоматом и не требует настроек) . The Best!
+100
купил поставил, радуюсь
Записан
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #10 : 05 Февраля 2010, 10:42:17 »

Код:
$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND  `time`>UNIX_TIMESTAMP()-300 AND `class`=1";

class - номер направления, изменяйте его на то что вам нужно.


ПС. реально кто-нибудь у себя опробовал творение?
Записан
VitalVas
NoDeny
Спец
*

Карма: 60
Offline Offline

Сообщений: 991



Просмотр профиля WWW
« Ответ #11 : 06 Февраля 2010, 12:08:25 »

ПС. реально кто-нибудь у себя опробовал творение?
нет. некто не хочет завалить свой рабочий биллинг. Улыбающийся
я лично придерживаюсь такова: "Работае - нетрож"
Записан
killall
NoDeny
Пользователь
*

Карма: 2
Offline Offline

Сообщений: 29


Торент-трекер без рейтинга Reliz.org.ua


Просмотр профиля WWW Email
« Ответ #12 : 08 Февраля 2010, 22:46:06 »

Помогите с проблемой
Код:
cat  /usr/local/share/cacti/scripts/usertraf.pl ertraf.pl
#!/usr/bin/perl

use DBI;
$main_config='/usr/local/nodeny/nodeny.cfg.pl';
require $main_config;

$DSN="DBI:mysql:database=$db_name;host=$db_server;mysql_connect_timeout=$mysql_connect_timeout;";
$dbh=DBI->connect($DSN,$user,$pw,{PrintError=>1});

$userid=$ARGV[0];

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year=$year+1900;
$mon=$mon+1;
$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND FROM_UNIXTIME(`time`)>'".$year."-".$mon."-".$mday." ".$hour.":".($min-5).":".$sec."'";


$sth=$dbh->prepare($query);
$sth->execute;

$rv=$sth->fetchrow_hashref;
if ($rv->{averin} && $rv->{averout})
{
print "in:$rv->{averin} out:$rv->{averout}";
}else
{
print "in:0 out:0";

И ошибка
perl  /usr/local/share/cacti/scripts/usertraf.pl
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND FROM_UNIXTIME(`time`)>'2010-2-8 22:40:37'' at line 1 at /usr/local/share/cacti/scripts/usertraf.pl line 21.
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at /usr/local/share/cacti/scripts/usertraf.pl line 23.


MYSQL 5.5
Записан

Торент-трекер без рейтинга Reliz.org.ua
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #13 : 09 Февраля 2010, 11:33:22 »

запрос должен быть вот такой

Код:
$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND  `time`>UNIX_TIMESTAMP()-300 AND `class`=1";

Записан
killall
NoDeny
Пользователь
*

Карма: 2
Offline Offline

Сообщений: 29


Торент-трекер без рейтинга Reliz.org.ua


Просмотр профиля WWW Email
« Ответ #14 : 09 Февраля 2010, 15:22:39 »

запрос должен быть вот такой

Код:
$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND  `time`>UNIX_TIMESTAMP()-300 AND `class`=1";


DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND  `time`>UNIX_TIMESTAMP()-300 AND `class`=1' at line 1 at /usr/local/share/cacti/scripts/usertraf.pl line 21.
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at /usr/local/share/cacti/scripts/usertraf.pl line 23.

Тоже ощибку выдает. где собака зарыта?
Записан

Торент-трекер без рейтинга Reliz.org.ua
Страниц: [1] 2 3
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!