Changeset - aa70ef866179
[Not reviewed]
default
0 0 1
virii - 11 years ago 2013-12-06 22:24:16
virii@enn.lu
Drops a PNG file with bandwitdh stats
1 file changed with 82 insertions and 0 deletions:
0 comments (0 inline, 0 general)
Scripts/traffic_statistics.pl
Show inline comments
 
new file 100644
 
#!/usr/bin/perl
 
=About
 
This perl scripts generates statistics about the servers traffic consumption
 

	
 
by virii
 
=cut
 
use HTTP::Tiny;
 
use IO::Socket;
 
use Chart::Clicker;
 
use Chart::Clicker::Context;
 
use Chart::Clicker::Data::DataSet;
 
use Chart::Clicker::Data::Marker;
 
use Chart::Clicker::Data::Series;
 
use Chart::Clicker::Renderer::Area;
 
use Geometry::Primitive::Rectangle;
 
use Graphics::Color::RGB;
 
############### [Create new statistics image] ##########################
 
$cc = Chart::Clicker->new(width => 1248, height => 800);
 
$ds = Chart::Clicker::Data::DataSet->new();
 
@months = qw(1 2 3 4 5 6 7 8 9 10 11 12);
 
@series;
 
@traffix;
 
########################################################################
 
@nodes = qw(relay exit);
 
############### [Servername gathering via Ennstatus API] ###############
 
foreach $node (@nodes) {
 
	print "[+] Checking for $node\n";
 
	$gather_nodes = HTTP::Tiny->new->get('http://enn.lu/api/export/xml/' . $node) || die "[-] Cannot connect to $node API\n";
 
	@xml_response = split(/\n/,$gather_nodes->{content});
 
		foreach $xml_line (@xml_response) {
 
			$counter++;
 
			if ($xml_line =~ /\<server_name\>(\w+)\<\/server_name\>/i) {
 
				$server_nick = $1;
 
				if ($xml_response[$counter] =~ /\<server_status\>(\w+)\<\/server_status\>/i) {
 
					push @servers, $server_nick if ($1 eq "Online");    # we want only those who are online
 
				}
 
			}
 
		}
 
undef $counter;
 
}
 
####################### [Connect to each server] #######################
 
foreach $server_name (@servers) {
 
	print "[+] Checking '$server_name'\n";
 
	$server_response = HTTP::Tiny->new->get('http://' . $server_name . '.enn.lu/vnstat.xml');
 
	die "[-] '$server_name' Failed!\n" unless $server_response->{success};
 
	@xml_content = split(/\n/,$server_response->{content});
 
	foreach $xml_line (@xml_content) {
 
		if ($xml_line =~ /\<month id="(\d+)"\>\<date\>\<year\>(\d+)\<\/year\>\<month\>(\d+)\<\/month\>\<\/date\>\<rx\>(\d+)\<\/rx\>\<tx\>(\d+)\<\/tx\>\<\/month\>/ig) {
 
			($id,$year,$month,$rx,$tx) = ($1,$2,$3,$4,$5,$6);
 
			$rxtx = ($tx + $rx) * 10e-10;
 
			$traffic = $1 if $rxtx =~ /^(\d+\.?\d{5})/;
 
			push @traffix, $traffic;
 
		}
 
	}
 
	for (scalar @traffix..11) {
 
		unshift @traffix, 0;
 
	}
 

	
 
	$ds->add_to_series(Chart::Clicker::Data::Series->new(
 
        keys    =>  \@months,
 
        values  =>  [@traffix],
 
        name => $server_name
 
    ));
 
    
 
	undef @traffix;
 

	
 
}
 

	
 
$cc->add_to_datasets($ds);
 
$def = $cc->get_context('default');
 
$def->range_axis->label('Tbit');
 
$def->domain_axis->label('Month');
 
$area = Chart::Clicker::Renderer::Area->new(opacity => .2);
 
$area->brush->width(3);
 
$def->renderer($area);
 
$def->range_axis->tick_values([qw(20 40 60 80 100 120 140 160 180 200 220)]);
 
$def->range_axis->format('%d');
 
$def->domain_axis->ticks(11);
 
$def->domain_axis->tick_labels([qw(January February Mars April June July August September October November December)]);
 
$def->domain_axis->format('%d');
 

	
 
$cc->write_output('stats.png');
0 comments (0 inline, 0 general)