#!/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; }