#! /usr/bin/perl
# Check Linux media settings using ethtool
# anders@aftenposten.no, 2007-09-19

use Getopt::Std;
getopts('i:s:d:a:');
$ENV{'PATH'} = "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";

sub usage {
	print "Usage: check_ethtool -i <interface> -s 10|100|1000 -d half|full -a on|off\n";
	exit(0);
}

usage unless ($opt_i && $opt_s && $opt_d && $opt_a);

%modes = ();

foreach $line (`sudo ethtool $opt_i 2>&1`) {
	chomp($line);
	if ($line =~ /^(\s+|)([\w -]+):\s+(\w+)/) {
		$key = $2;
		$val = $3;
		$key =~ s@\s@_@g;
		$key =~ tr@A-Z@a-z@;
		$val =~ tr@A-Z@a-z@;

		if ($key eq "speed") {
			$val =~ s@\D+@@g;
		}
		if ($key eq "auto-negotiation") {
			$key = "autoneg";
		}
		$modes{"$key"} = $val;
	}
}

if ($opt_s ne $modes{"speed"} || $opt_d ne $modes{"duplex"} || $opt_a ne $modes{"autoneg"}) {
	print "Media settings error on $opt_i. Expected $opt_s $opt_d autoneg=$opt_a, got " . $modes{"speed"} . " " . $modes{"duplex"} . " " . $modes{"autoneg"} . "\n";
	exit(2);
} else {
	print "Media settings OK on $opt_i: " . $modes{"speed"} . " " . $modes{"duplex"} . " autoneg=" . $modes{"autoneg"} . "\n";
	exit(0);
}
