#!/bin/ksh # # Hotlink.sh - Script to check link status,duplex and speed of interfaces on Solaris # Uses KSTAT to get most interface information # FOR MAC ADDRESS OUTPUT IT REQUIRES ROOT, ARP OUTPUT WAS NOT USED, SINCE IT COULD AFFECT # PERFORMANCE ON LIVE SYSTEM # BNX/QFE/HME driver needs NDD so require root access otherwise script runs in # "LIMITED USER MODE" if not root # Written by Chris Connell Bytemobile Europe(c) 2007 # cconnell@bytemobile.com # # # SUPPORTED PLATFORM LIST # # # Platform OS DRIVER/CARD TESTED # # SUN X4200 M1 SUNOS 5.10 E1000G YES # SUN X4200 M2 SUNOS 5.10 E1000G YES # SUN X4200 M2 SUNOS 5.10 NGE YES # SUN Ultra SUNOS 5.8 QFE YES # SUN Ultra SUNOS 5.8 HME YES # SUN Ultra SUNOS 5.9 HME YES # SUN X2100 SUNOS 5.10 BGE YES # SUN X2100 SUNOS 5.10 NGE YES # IBM LS21 SUNOS 5.10 BNX YES # IBM LS20 SUNOS 5.10 BGE YES # SUN V40Z SUNOS 5.10 BGE YES # SUN V40Z SUNOS 5.10 CE YES # SUN X4600 SUNOS 5.10 E1000G YES # # # # # Revision Log # # V1.1 Fixed X4200 M1 issue # V1.2 Support for vlan interfaces # V1.3 Fixed vlan logic issue # V1.4 Added Health Check Feature # V1.5 Added Ultra Support - tested on Sol 8/9 # V1.6 Fixed VLAN Zero clearing issue # V1.7 Fixed VLAN < 1000 issue # V1.8 Corrected kstat options # V1.9 Added syntax check for above (will fix all that have this issue) # V2.0 Modified e1000g kstat driver output - looks like a Sun bug - tested ok on X4200, not any other platforms # V2.1 Released # V2.2 Added and corrected backward compatability for hme/qfe support # V2.3 Added MAC address output! # V2.4 Converted e1000g to use ndd since kstat reports incorrectly # V2.5 Corrected IBM LS21 BNX output # # # # # # IFC=/sbin/ifconfig echo "\n\nChecking System Type support --> \c" sleep 1 supported=`uname -rs` case "$supported" in "SunOS 5.10") echo "OK" ;; "SunOS 5.9") echo "OK" ;; "SunOS 5.8") echo "OK" ;; *) echo "NOT SUPPORTED!\n" exit 1 esac # # # ############################################################################################### # # # Support BLOCK NGE # # NGE() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi LINK=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_up | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_duplex | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$DUPLEX" in 1) DUPLEX="Half" ;; 2) DUPLEX="Full" ;; esac SPEED=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_speed | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$SPEED" in 10) SPEED="10 Mbit/s" ;; 100) SPEED="100 Mbit/s" ;; 1000) SPEED="1 Gbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK NGE # ############################################################################################### ############################################################################################### # # # Support BLOCK BGE # # BGE() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi LINK=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_up | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_duplex | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$DUPLEX" in 1) DUPLEX="Half" ;; 2) DUPLEX="Full" ;; esac SPEED=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_speed | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$SPEED" in 10) SPEED="10 Mbit/s" ;; 100) SPEED="100 Mbit/s" ;; 1000) SPEED="1 Gbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK BGE # ############################################################################################### ############################################################################################### # # # Support BLOCK BNX # # BNX() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi LINK=`/usr/sbin/ndd -get /dev/$pref$inst link_status` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/sbin/ndd -get /dev/$pref$inst link_duplex` case "$DUPLEX" in 0) DUPLEX="Half" ;; 1) DUPLEX="Full" ;; esac SPEED=`/usr/sbin/ndd -get /dev/$pref$inst link_speed` case "$SPEED" in 10) SPEED="10 Mbit/s" ;; 100) SPEED="100 Mbit/s" ;; 1000) SPEED="1 Gbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK BNX # ############################################################################################### ############################################################################################### # # # Support BLOCK E1000G # # E1000G() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi LINK=`/usr/sbin/ndd -get /dev/$pref$inst link_status` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/sbin/ndd -get /dev/$pref$inst link_duplex` case "$DUPLEX" in 1) DUPLEX="Half" ;; 2) DUPLEX="Full" ;; esac SPEED=`/usr/sbin/ndd -get /dev/$pref$inst link_speed` case "$SPEED" in 10) SPEED="10 Mbit/s" ;; 100) SPEED="100 Mbit/s" ;; 1000) SPEED="1 Gbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK E1000G # ############################################################################################### ############################################################################################### # # ############################################################################################### # # # Support BLOCK HME # # HME() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi # The set command is required for NDD to query multiple instances of HME # /usr/sbin/ndd -set /dev/$pref instance $inst LINK=`/usr/sbin/ndd -get /dev/$pref link_status` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/sbin/ndd -get /dev/$pref link_mode` case "$DUPLEX" in 0) DUPLEX="Half" ;; 1) DUPLEX="Full" ;; esac SPEED=`/usr/sbin/ndd -get /dev/$pref link_speed` case "$SPEED" in 0) SPEED="10 Mbit/s" ;; 1) SPEED="100 Mbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK BNX # ############################################################################################### ############################################################################################### # # # Support BLOCK QFE # # QFE() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi # The set command is required for NDD to query multiple instances of QFE # /usr/sbin/ndd -set /dev/$pref instance $inst LINK=`/usr/sbin/ndd -get /dev/$pref link_status` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/sbin/ndd -get /dev/$pref link_mode` case "$DUPLEX" in 0) DUPLEX="Half" ;; 1) DUPLEX="Full" ;; esac SPEED=`/usr/sbin/ndd -get /dev/$pref link_speed` case "$SPEED" in 0) SPEED="10 Mbit/s" ;; 1) SPEED="100 Mbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK QFE # ############################################################################################### ############################################################################################### # # # Support BLOCK CE # # CE() { id=$INTERFACE suff=${id##*[a-z]} pref=${id%$suff} vlno=${suff%???} inst=${suff#$vlno} if [ `expr $suff` -lt 1000 ]; then real_vlan="Untag" inst=$suff else real_vlan=`expr $vlno` fi if [ $inst -gt 0 ]; then inst="$(echo $inst | sed 's/0*//')" elif [ $inst -eq 0 ]; then inst=0 fi LINK=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_up | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$LINK" in 0) LINK="Down" ;; 1) LINK="Up" ;; esac if [ $LINK = "Up" ]; then DUPLEX=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_duplex | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$DUPLEX" in 1) DUPLEX="Half" ;; 2) DUPLEX="Full" ;; esac SPEED=`/usr/bin/kstat $pref:$inst | /usr/bin/grep link_speed | tail -1 \ | /usr/bin/awk '{ print $2 }'` case "$SPEED" in 10) SPEED="10 Mbit/s" ;; 100) SPEED="100 Mbit/s" ;; 1000) SPEED="1 Gbit/s" ;; *) SPEED="Not Found" ;; esac err1=`netstat -i -I $id | sed -n '2p' | awk {'print $6'}` err2=`netstat -i -I $id | sed -n '2p' | awk {'print $8'}` err3=`netstat -i -I $id | sed -n '2p' | awk {'print $9'}` if [ $err1 -gt 0 -o $err2 -gt 0 -o $err3 -gt 0 ]; then HEALTH="NOT OK" else HEALTH="OK" fi else DUPLEX="----" SPEED="----------" HEALTH="---" fi } # # END SUPPORT BLOCK CE # ############################################################################################### echo "\n" echo "Interface\t\tPhys Inst\tVLAN No\t\tSpeed\t\tDuplex\t\tLink\tHealth\t\tEthernet Address" echo "---------\t\t---------\t-------\t\t------\t\t------\t\t----\t-----\t\t----------------\n" for INTERFACE in `/usr/bin/netstat -i | /usr/bin/egrep -v "^Name|^lo0" \ | /usr/bin/awk '{print $1}' | /usr/bin/sort | /usr/bin/uniq` do print=no if [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^e1000g[0-9]+/ { print }'`" ] ; then if [ "`/usr/bin/id | /usr/bin/cut -c1-5`" != "uid=0" ] ; then echo "$INTERFACE\t\t\tYou must be the root user for QFE support" else E1000G $INTERFACE print=yes fi elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^nge[0-9]+/ { print }'`" ] ; then NGE $INTERFACE print=yes elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^qfe[0-9]+/ { print }'`" ] ; then if [ "`/usr/bin/id | /usr/bin/cut -c1-5`" != "uid=0" ] ; then echo "$INTERFACE\t\t\tYou must be the root user for QFE support" else QFE $INTERFACE print=yes fi elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^hme[0-9]+/ { print }'`" ] ; then if [ "`/usr/bin/id | /usr/bin/cut -c1-5`" != "uid=0" ] ; then echo "$INTERFACE\t\t\tYou must be the root user for HME support" else HME $INTERFACE print=yes fi elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^bge[0-9]+/ { print }'`" ] ; then BGE $INTERFACE print=yes elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^bnx[0-9]+/ { print }'`" ] ; then if [ "`/usr/bin/id | /usr/bin/cut -c1-5`" != "uid=0" ] ; then echo "$INTERFACE\t\t\tYou must be the root user for BNX support" else BNX $INTERFACE print=yes fi elif [ "`/usr/bin/echo $INTERFACE \ | /usr/bin/awk '/^ce[0-9]+/ { print }'`" ] ; then CE $INTERFACE print=yes else echo "$INTERFACE\t\t\tInterface not supported yet -- check latest version of hotlink.sh is installed!" fi if [ "`/usr/bin/id | /usr/bin/cut -c1-5`" = "uid=0" ] ; then MAC=`$IFC $INTERFACE| awk '/ether/ {print $2}'` else MAC="LIMITED USER MODE" fi if [ $print = "yes" ]; then printed=`echo $id | wc -m` if [ `expr $printed` -le 5 ]; then echo "$id\t\t\t$inst\t\t$real_vlan\t\t$SPEED\t$DUPLEX\t\t$LINK\t$HEALTH\t\t$MAC" elif [ `expr $printed` -le 8 ]; then echo "$id\t\t\t$inst\t\t$real_vlan\t\t$SPEED\t$DUPLEX\t\t$LINK\t$HEALTH\t\t$MAC" else echo "$id\t\t$inst\t\t$real_vlan\t\t$SPEED\t$DUPLEX\t\t$LINK\t$HEALTH\t\t$MAC" fi fi done echo "\n\n" ############################################################################## ### This script is submitted to BigAdmin by a user of the BigAdmin community. ### Sun Microsystems, Inc. is not responsible for the ### contents or the code enclosed. ### ### ### Copyright Sun Microsystems, Inc. ALL RIGHTS RESERVED ### Use of this software is authorized pursuant to the ### terms of the license found at ### http://www.sun.com/bigadmin/common/berkeley_license.jsp ##############################################################################