# HG changeset patch # User virii # Date 2013-12-06 22:24:16 # Node ID aa70ef86617916d0632793a7bc83116788d578d2 # Parent 707908d9cfa77954cb8a29055754f3e034701957 Drops a PNG file with bandwitdh stats diff --git a/Scripts/traffic_statistics.pl b/Scripts/traffic_statistics.pl new file mode 100644 --- /dev/null +++ b/Scripts/traffic_statistics.pl @@ -0,0 +1,82 @@ +#!/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 =~ /\(\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 =~ /\\\(\d+)\<\/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) { + 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');