Nodeny модуль визуализации загрузки пользовательского канала

Понадобилась визуализация загрузки канала. После поиска нашлось два варианта - 1-й платный, второй (спасибо автору за проделаную работу) с использованием highcharts и jquery (nodeny49modules), помимо этого модуля там находятся еще не менее интересные. Но т.к. с java я на Вы, решил написать с использованием rrdtool.

Приступим, сперва поставим rrdtool:

portsnap fetch update
cd /usr/ports/databases/rrdtool
make install clean

cоздаем модуль
vi /usr/local/nodeny/web/Sdetailtrafg.pl


#!/usr/bin/perl
use RRDs;
$VER=49.32;
&TSG_init;

$preset=$U{$Mid}{preset};
# список направлений, которые имеют названия. Если у направления нет названия,
# а трафик есть - проблемы в настройках
# и это обнаружится при посуточном просмотре статистики
$out=join '',map{ &ahref("$scrpt&when=$when&class=$_",$c[$_]).$br if $_==1 ||
$PresetName{$preset}{$_} } (1..8);

$OUTLEFT.=&div('cntr',&Mess3('row2','Направления:'.$br2.$out).&Get_list_of_stat_days($dbs,
'x',"$scrpt&class=$class&when=",$when));

sub TSG_init
{
&Connect_DB2;
$when=int $F{when} || $t;
$class=int $F{class};
$class=1 if $class<1 || $class>8;
}

sub TSG_main
{
&TSG_init;
$scrpt.="&when=$when&class=$class";
$tm=localtime($when);
$day=$tm->mday;
$mon=$tm->mon;
$year=$tm->year;
$year_full=$year+1900;
$mon++;
$tname=$year_full.'x'.$mon.'x'.$day; # часть имени таблицы для трафика запрошенного дня

$sql="SELECT SUM(`in`) AS input ,SUM(`out`) AS output,time FROM x$tname WHERE mid
IN ($Sel_id) AND class=$class GROUP BY time ORDER BY time ASC";
$sth=&sql($dbs,$sql);
my @val = $sth->fetchrow_array ();
$mytime=($val[2]-1);
$myimage=$mytime.$Sel_id;

RRDs::create ("/usr/local/www/apache22/data/i/upload/$myimage.rrd", "--start", $mytime, "--step",60,
"DS:input:GAUGE:120:U:U",
"DS:output:GAUGE:120:U:U",
"RRA:AVERAGE:0.5:1:10080",
"RRA:MAX:0.5:1:10080",
);

while (my @val = $sth->fetchrow_array ()) {
$intraf=$val[0];
$outtraf=$val[1];
$time=$val[2];
RRDs::update "/usr/local/www/apache22/data/i/upload/$myimage.rrd","$time:$outtraf:$intraf";
}

RRDs::graph "/usr/local/www/apache22/data/i/upload/$myimage.png",
"--imgformat=PNG",
"--width", "600",
"--height", "150",
"--alt-autoscale-max",
"--slope-mode",
"--start", "$mytime",
"--end", "start+24h",
"--title", "Traffic $day.$mon.$year_full $For_U",
"--step", "30",
"DEF:b=/usr/local/www/apache22/data/i/upload/$myimage.rrd:input:AVERAGE",
"DEF:a=/usr/local/www/apache22/data/i/upload/$myimage.rrd:output:AVERAGE",
"CDEF:ca=a,4,/",
"CDEF:ce=b,4,/",
"CDEF:cb=a,4000000,/",
"CDEF:cd=b,4000000,/",
"AREA:ca#00FF00:In traffic",
"GPRINT:cb:MAX:Max in %1.2lfM",
"GPRINT:cd:MAX:Max out %1.2lfM",
"LINE1:ce#0000FF:Out traffic",
;
$OUT.='<div id="traffic_chart" align="center" style="min-width: 400px; height: 100px; margin: 0
<auto"><h2>График загрузки за '.$day.'-'.$mon.'-'.$year_full.'</h2></div>';
$OUT.='<div id="traffic_chart" align="center" style="min-width: 400px; height: 400px; margin: 0
auto"><img src=/i/upload/'.$myimage.'.png></div>';
}

1;

Прописываем плагин
в /usr/local/nodeny/web/plugin_reestr.cfg
добавляем строку

118 Sdetailtrafg TSG_main График загрузки 0 0

Необходимо учитывать что в качестве разделителей следует использовать табуляцию.
Последним этапом добавляем модуль в настройках
В вебинтерфейсе биллинга "Операции -> Настройки -> Список плагинов" добавляем плагин "Sdetailtrafg"
Если выполнено верно в клиентской статистике появится пункт "График загрузки"
P.S. Так как при цитировании кода слегка нарушено форматирование, модуль находится во вложении. При вставке просто удалите разрешение txt.