#!/bin/sh 
#    unittest.sh [node_ip]
#    Basic unit test for ipmiutil functions
#
dosol=0
doserial=0
outf=/tmp/unittest.out
# default remote node for SOL test
node=192.168.1.154
mydir=`pwd`
indir=`dirname $0`
c1=`echo $indir |cut -c1`
if [ "$c1" = "/" ]; then
   testdir=$indir
else
   testdir=$mydir/$indir
fi
# datadir=/usr/share/ipmiutil
datadir=/var/lib/ipmiutil
# sfil is used only to read from with events -p -s below
# normally, sfil=$datadir/sensor-out.txt
sfil=${testdir}/sensor-TIGW1U.txt
sfil2=${testdir}/sensor-CG2100.txt 
tmpc=/tmp/cfg.tmp
tmpin=/tmp/sol.in
# march=`rpmbuild --showrc |grep " _target_cpu" | head -n1 |awk '{print $3}'`
uarch=`uname -m`
LANPARAMS=
os=`uname -s`
if [ "$os" = "SunOS" ];then
TAIL="tail -1"
TAIL2="tail -2"
else
TAIL="tail -n1"
TAIL2="tail -n2"
fi

if [ $# -ge 1 ];then 
   node=$1
   # use canned username and password, edit as needed.
   LANPARAMS="-N $node -U admin -P password"
fi

>$outf
cd /tmp
echo "# ipmiutil sel -v $LANPARAMS" |tee -a $outf
ipmiutil sel -v $LANPARAMS  >>$outf 2>&1
if [ $? -ne 0 ]; then
	echo "No IPMI support detected"
	exit 1
fi

echo "# ipmiutil health $LANPARAMS" |tee -a $outf
ipmiutil health $LANPARAMS |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil cmd $LANPARAMS -x 00 20 18 01 "  |tee -a $outf
ipmiutil cmd $LANPARAMS -x 00 20 18 01 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil fru $LANPARAMS" |tee -a $outf
ipmiutil fru $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
MODEL=`grep "Chassis OEM Field" $outf| cut -f2 -d':'| awk '{ print $1 }'`
echo "# ipmiutil config $LANPARAMS -s $tmpc" |tee -a $outf
ipmiutil config $LANPARAMS -s $tmpc 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil lan $LANPARAMS " |tee -a $outf
ipmiutil lan $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil sel $LANPARAMS" |tee -a $outf
ipmiutil sel $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil sel -e $LANPARAMS" |tee -a $outf
ipmiutil sel -e $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
echo "# ipmiutil sensor $LANPARAMS" |tee -a $outf
ipmiutil sensor $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
# ipmiutil discover -a -b 10.243.42.255 |tee -a $outf
echo "# ipmiutil discover -a" |tee -a $outf
ipmiutil discover -a 2>&1  |tee -a $outf
$TAIL2 $outf |grep  responses >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
# Test getevt SEL method
echo "# ipmiutil getevt -s $LANPARAMS -t 3 " |tee -a $outf
ipmiutil getevt -s $LANPARAMS -t 3 2>&1 |tee -a $outf
rv=$?
# $TAIL $outf |grep  successful >/dev/null
if [ $rv -ne 0 ]; then
   echo "igetevt error $rv"
   exit 1
fi

if [ "x$LANPARAMS" = "x" ]; then
# if local, also test getevt MessageBuffer method
echo "# ipmiutil getevt $LANPARAMS -t 3 " |tee -a $outf
ipmiutil getevt $LANPARAMS -t 3 2>&1 |tee -a $outf
rv=$?
# $TAIL $outf |grep  successful >/dev/null
if [ $rv -ne 0 ]; then
   echo "igetevt error $rv"
   exit 1
fi
fi

if [ "$uarch" = "ia64" ]
then
   # Note that ireset -n causes a real reset on ia64 (?)
   echo "skipping ia64 ipmiutil reset" |tee -a $outf
else
   # Use hwreset -n to send an NMI.
   echo "# ipmiutil reset $LANPARAMS -n" |tee -a $outf
   ipmiutil reset $LANPARAMS -n 2>&1 |tee -a $outf
   $TAIL $outf |grep  successful >/dev/null
   if [ $? -ne 0 ]; then
	exit 1
   fi
fi

# Might not do SOL test if no remote server is configured for SOL.
if [ $dosol -eq 1 ]; then
   echo "# ipmiutil sol -d -N $node " |tee -a $outf
   ipmiutil sol -d -N $node 2>&1 |tee -a $outf
   cat - <<%%% >$tmpin

root
password
ls
pwd
echo success
exit
~.
%%%
   echo "# ipmiutil sol -a -N $node -i $tmpin " |tee -a $outf
   ipmiutil sol -a -N $node -i $tmpin  2>&1 |tee -a $outf
   $TAIL $outf |grep  successful >/dev/null
   if [ $? -ne 0 ]; then
	exit 1
   fi
fi

echo "# ipmiutil events 18 00 02 02 00 00 00 20 00 04 09 01 6f 44 0f ff " |tee -a $outf
ipmiutil events 18 00 02 02 00 00 00 20 00 04 09 01 6f 44 0f ff |tee -a $outf
$TAIL2 $outf |grep  "AC Lost" >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi

echo "# ievents -p -s $sfil B3 E8 00 0E 0C C7 1B A0  11 08 12 7F 10 90 FF FF 20 20 00 20 02 15 01 41  0F FF " |tee -a $outf
ievents -p -s $sfil B3 E8 00 0E 0C C7 1B A0  11 08 12 7F 10 90 FF FF 20 20 00 20 02 15 01 41  0F FF |tee -a $outf
$TAIL2 $outf |grep  "Redundancy Lost" >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi

echo "# ipmiutil events -s $sfil2 -p  B5 19 00 15 17 C6 C9 D0 00 02 B2 76 C1 16 FF FF 20 20 10 20 20 00 00 52 1D 20 00 00 00 00 00 00 00 00 00 00 00 00 C1 00 00 00 00 00 00 00 00 00 00" |tee -a $outf
ipmiutil events -s $sfil2 -p B5 19 00 15 17 C6 C9 D0 00 02 B2 76 C1 16 FF FF 20 20 10 20 20 00 00 52 1D 20 00 00 00 00 00 00 00 00 00 00 00 00 C1 00 00 00 00 00 00 00 00 00 00 |tee -a $outf
$TAIL2 $outf |grep  "Lo Crit thresh" >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi
 
echo "# ievents 40 78 02 37 86 41 4e 20 00 04 0c 08 6f 20 ff 04" |tee -a $outf
ievents 40 78 02 37 86 41 4e 20 00 04 0c 08 6f 20 ff 04 |tee -a $outf
$TAIL2 $outf |grep  DIMM >/dev/null
if [ $? -ne 0 ]; then
   echo "DIMM event FAIL"
   exit 1
fi

echo "# ipmiutil events -d 40 78 02 37 86 41 4e 20 00 04 0c 08 6f 20 ff 04" |tee -a $outf
ipmiutil events -d 40 78 02 37 86 41 4e 20 00 04 0c 08 6f 20 ff 04 |tee -a $outf
$TAIL2 $outf |grep  DIMM >/dev/null
if [ $? -ne 0 ]; then
   echo "DIMM event FAIL"
   exit 1
fi

echo "# ipmiutil wdt $LANPARAMS" |tee -a $outf
ipmiutil wdt $LANPARAMS 2>&1 |tee -a $outf
$TAIL $outf |grep  successful >/dev/null
if [ $? -ne 0 ]; then
	exit 1
fi

if [ $doserial -eq 1 ]; then
 # some platforms do not support IPMI serial channels
 echo "# ipmiutil serial $LANPARAMS"  |tee -a $outf
 ipmiutil serial $LANPARAMS 2>&1 |tee -a $outf
 $TAIL $outf |grep  successful >/dev/null
 if [ $? -ne 0 ]; then
	exit 1
 fi
fi

# The model can be used to detect if the chassis has an alarm panel. 
echo "MODEL=$MODEL" |tee -a $outf
case "$MODEL" in
  TIGW1U) tamok=1
	;;
  TIGH2U) tamok=1
	;;
  TIGI2U) tamok=1
	;;
  TIGPR2U) tamok=1
	;;
  TIGPT1U) tamok=1
	;;
  TSRLT2) tamok=1
	;;
  TSRMT2) tamok=1
	;;
  CG2100) tamok=1
	;;
  *) tamok=0
	;;
esac
# Run it anyway, the alarms command has better detection now.
tamok=1
if [ $tamok -eq 1 ]; then
   echo "# ipmiutil alarms $LANPARAMS" |tee -a $outf
   ipmiutil alarms $LANPARAMS  2>&1 |tee -a $outf
   $TAIL $outf |grep  successful >/dev/null
   if [ $? -ne 0 ]; then
	exit 1
   fi
fi
cd $mydir