#!/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;
############### [Which year] ###########################################
$select_year = 2014;
$select_year = shift if $ARGV[0] =~ /^\d{4}$/;
############### [Create new statistics image] ##########################
$cc = Chart::Clicker->new(width => 1248, height => 800);
$ds = Chart::Clicker::Data::DataSet->new();
@months = 1..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\>($select_year)\<\/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) {
push @traffix, 0 if $select_year == 2014;
unshift @traffix, 0 unless $select_year == 2014;
}
$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 300)]);
$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');