#! /usr/bin/perl -I/root/tgmanage/include use strict; use warnings; use lib 'include'; use nms; use Data::Dumper::Simple; use Date::Parse; my $dbh = nms::db_connect(); $dbh->{AutoCommit} = 0; # This has a slightly modded version of get_current_datarate inlined. It's probably outdated by the time you read this. my $total_traffic = $dbh->prepare("select sum(bytes_in) * 8 / 1048576.0 / 1024.0 as traffic_out, sum(bytes_out) * 8 / 1048576.0 / 1024.0 as traffic_in from (SELECT switch,port, (bytes_out[1] - bytes_out[2]) / EXTRACT(EPOCH FROM (time[1] - time[2])) AS bytes_out, (bytes_in[1] - bytes_in[2]) / EXTRACT(EPOCH FROM (time[1] - time[2])) AS bytes_in, time[1] AS last_poll_time FROM ( SELECT switch,port, ARRAY_AGG(time) AS time, ARRAY_AGG(bytes_in) AS bytes_in, ARRAY_AGG(bytes_out) AS bytes_out FROM ( SELECT *,rank() OVER (PARTITION BY switch,port ORDER BY time DESC) AS poll_num FROM polls WHERE time BETWEEN (to_timestamp(?) - interval '5 minutes') AND to_timestamp(?) AND official_port ) t1 WHERE poll_num <= 2 GROUP BY switch,port ) t2 WHERE time[2] IS NOT NULL AND bytes_in[1] >= 0 AND bytes_out[1] >= 0 AND bytes_in[2] >= 0 AND bytes_out[2] >= 0 AND bytes_out[1] >= bytes_out[2] AND bytes_in[1] >= bytes_in[2]) as datarate natural join switches where switchtype like 'dlink3100%' and port < 45") or die "Can't prepare query: $!"; my $inout = shift @ARGV; while (<>) { if (m, [^<]*, && $1 > 1397458800) { my $time = $1; if ($time > 1397458800) { $total_traffic->execute($time, $time); my $ref = $total_traffic->fetchrow_hashref; my $value = $ref->{'traffic_' . $inout}; $value = (!defined $value || $value == 0 || $value > 400) ? "NaN" : sprintf "%e", $value; s,[^<]*,$value,; } } print; } $total_traffic->finish; $dbh->disconnect(); exit 0