#!/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 =~ /\(\w+)\<\/server_name\>/i) { $server_nick = $1; if ($xml_response[$counter] =~ /\(\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 =~ /\\\($select_year)\<\/year\>\(\d+)\<\/month\>\<\/date\>\(\d+)\<\/rx\>\(\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');