#!/usr/bin/perl -w

use Time::HiRes qw(time);
use strict;

sub rateformat($$);

my $ifconfig = '/sbin/ifconfig';

my $update = 5;

my $t0 = 0;
my ($t1, $out, $Rx, $Tx, $dev);

my %saved = ();

while (1) {

  $out = `$ifconfig`;

  die "$ifconfig failed: $!\n" if (!defined $out);
  $t1 = time();

  my $first = 1;
  while ($out =~ /^(\S+)\s+               # $1 interface
	          Link\sencap:(.*)$       # $2 Link type
	          \s+inet\saddr:(\S+).*$  # $3 IP4 address
	          (?:\s+inet6\saddr:.*$)? # IP6 address
		  (?:\s+inet6.*$)? # IP6 address
		  \s+.*MTU:(\d+).*$       # $4 MTU
		  \s+RX\spackets:(\d+)\s+errors:(\d+)\sdropped:(\d+)
		  \s+overruns:(\d+)\s+frame:(\d+)\s*$ # $5-$9
		  \s+TX\spackets:(\d+)\s+errors:(\d+)\s+dropped:(\d+)
		  \s+overruns:(\d+)\s+carrier:(\d+)\s*$ # $10-$14
		  \s+collisions:(\d+)\s+txqueuelen:\d+\s*$ # $15 collisions
		  \s+RX\s+bytes:(\d+).*TX\sbytes:(\d+).* # $16,$17 RX, TX bytes
		  /gmx) {

    $dev = $1;
    $Rx = $16;
    $Tx = $17;

    next if ($dev eq 'lo');

    if (exists $saved{$dev}) {
      if ($first) {
        print("\033[H\033[2J"); # Clear screen
	$first = 0;
      }

      print("$dev $3 $2\n");

      printf("   Rx %s   Tx %s\n\n", 
	     rateformat($t1-$t0, $Rx-$saved{$dev}->{Rx}),
	     rateformat($t1-$t0, $Tx-$saved{$dev}->{Tx}));
    } else {
      $saved{$1} = {};
    }
    $saved{$dev}->{Rx} = $Rx;
    $saved{$dev}->{Tx} = $Tx;
}

  $t0 = $t1;
  sleep($update);

}


sub rateformat($$) {
  my ($time, $bytes) = @_;

  my $rate = $bytes/$time*8;

  if ($rate<900000) {
    return sprintf "%6.2f Kbps",$rate/1000;
  } else {
    return sprintf "%6.2f Mbps",$rate/1e6;
  }
}
