#! /usr/bin/perl
# Solaris NIC media settings check
# anders@aftenposten.no, 2007-09-20

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_netlink -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 = ();

$nic = $opt_i;
$nicfam = $nic;
$nicfam =~ s@\d+@@;
$nicinst = $nic;
$nicinst =~ s@\D+@@;

$nicdev = "/dev/$nic";
$nicdevbase = "/dev/$nicfam";

sub runndd {
	my $args = shift;

	# $@: params
	if ($< == 0) {
		return(`ndd $args 2>/dev/null`);
	} else {
		return(`sudo ndd $args 2>/dev/null`);
	}
}

if ( -e $nicdev ) {
	$speed = runndd("-get $nicdev link_speed");
	$duplex = runndd("-get $nicdev link_duplex");
	$autoneg = runndd("-get $nicdev link_autoneg");
} else {
	runndd("-set $nicdevbase instance $nicinst");
	$speed = runndd("-get $nicdevbase link_speed");
	$duplex = runndd("-get $nicdevbase link_duplex");
	$autoneg = runndd("-get $nicdevbase link_autoneg");
}
chomp($speed);
chomp($duplex);
chomp($autoneg);

if ($duplex eq "1") {
	$duplex = "half";
} elsif ($duplex eq "2") {
	$duplex = "full";
}
if ($autoneg eq "0") {
	$autoneg = "off";
} elsif ($autoneg eq "1") {
	$autoneg = "on";
}

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