#!/usr/bin/perl -w
# (C) 2003-2007 Willem Jan Hengeveld <itsme@xs4all.nl>
# Web: http://www.xs4all.nl/~itsme/
#      http://wiki.xda-developers.com/
#
# $Id$
#

use strict;

# gives trafic info on all network devices.

use IO::File;


my $maxdepth= 601;

my @s= (getstats());
my $i=0;
while (1)
{
	sleep(1);
	push @s, getstats();
	if ($#s>$maxdepth) {
		shift @s;
	}

	print "\033[1;1H";
	if (($i%30)==0) {
		print "\033[2J";
	}

	for my $d (qw(1 5 10 30 60 300 600)) {
		last if ($d>=$#s);
		writespeed($s[-1-$d], $s[-1], $d);
		printf("\n");
	}
	$i++;
}

sub writespeed {
	my ($s1, $s2, $d)= @_;
	# 
	printf("%-10s %8s %8s %8s %8s %8s %8s %8s %8s\n",
		sprintf("%2d:%02d", int($d/60), $d%60),
		qw(inb inpkt outb outpkt infrm outfrm inerr outerr));
	for my $if (sort keys %$s2) {
		next if (!exists $s1->{$if});
		printf("%-6s   : %s %s %s %s %s %s %s %s\n",
			$if, 
			bps($s1,$s2,$if,0, $d), pps($s1,$s2,$if,1, $d),
			bps($s1,$s2,$if,8, $d), pps($s1,$s2,$if,9, $d),
			pps($s1,$s2,$if,5, $d), pps($s1,$s2,$if,13, $d),
			pps($s1,$s2,$if,2, $d), pps($s1,$s2,$if,10, $d));
	}
}
sub bps {
	my ($s1,$s2,$if,$n, $d) = @_;

	my $bps= ($s2->{$if}[$n]- $s1->{$if}[$n])/$d;

	my $limit= 1;
	my @names= (" ", qw(k M G));

	for (0..$#names) {
		if ($bps<$limit*1000) {
			return sprintf("%7.2f%s", $bps/$limit, $names[$_]);
		}
		$limit*=1000;
	}

	return "########";
}
sub pps {
	my ($s1,$s2,$if,$n, $d) = @_;

	return bps($s1,$s2,$if,$n, $d);
}
sub getstats {
	my $fh= IO::File->new("/proc/net/dev", "r") or die "procnetdev: $!\n";

	my %stats;
	while (<$fh>) {
		if (/^(.{6}):\s*(\d.*\d)\s*$/) {
			my ($if, $statsline)= ($1, $2);
			$if =~ s/\s//g;

			next if ($statsline =~ /^(0|\s)+/);
			$stats{$if}= [split(/\s+/, $statsline)];
		}
	}
	$fh->close();
	return \%stats;
}
