#!/usr/bin/env perl
# by virii - enn.lu
use strict;
use XML::LibXML;
use HTTP::Tiny;
use JSON::Parse qw(:all);
use List::UtilsBy qw( nsort_by );
my ($api, $api_request, $json, $nodes_in_numbers, $parser, $vnstat_xml, $query, $entry);
my ($rx, $tx, $rx_TiB, $tx_TiB, $rx_TiB_total, $tx_TiB_total, $argument);
my (@nodes_rand, @nodes_sorted);
$api = HTTP::Tiny->new;
$api_request = $api->get('https://enn.lu/api/export/exit');
$json = valid_json($api_request->{content});
$json = parse_json($api_request->{content});
$nodes_in_numbers = scalar @$json;
push @nodes_rand, [$json->[$_]{ip}, $json->[$_]{name}, $json->[$_]{country}] for (0..$nodes_in_numbers -1);
@nodes_sorted = nsort_by { int $_->[0] } @nodes_rand;
format HEAD =
************************************************
Country RX TX
************************************************
.
write HEAD;
for (0..$nodes_in_numbers -1) {
unless ($nodes_sorted[$_][0] == $nodes_sorted[$_ +1][0]) {
$api_request = $api->get('http://' . $nodes_sorted[$_][1] . '.enn.lu/vnstat.xml');
$parser = XML::LibXML->new();
$vnstat_xml = $parser->load_xml(string => $api_request->{content});
$query = '/vnstat/interface/traffic/total';
foreach $entry ($vnstat_xml->findnodes($query)) {
$rx = int $entry->findnodes('./rx');
$tx = int $entry->findnodes('./tx');
}
($rx_TiB, $tx_TiB) = ($rx * (9.313 * 1.0E-10), $tx * (9.313 * 10E-10));
($rx_TiB, $tx_TiB) = (substr ($rx_TiB, 0, 4), substr ($tx_TiB, 0, 4));
$rx_TiB_total += $rx_TiB;
$tx_TiB_total += $tx_TiB;
format_output($nodes_sorted[$_][2]);
}
}
format_output('TOTAL');
sub format_output {
$argument = shift;
if ($argument eq 'TOTAL') {
($argument, $rx_TiB, $tx_TiB) = (" TOTAL", $rx_TiB_total, $tx_TiB_total);
print '*' x 48, "\n";
}
format =
@<<<<<<<<< @>>>>>>>>>>>>> @>>>>>>>>>>>>>
$argument, "$rx_TiB TiB", "$tx_TiB TiB"
.
write;
}