2007-03-09 14:15:02 +01:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Show status of LSI Logic's MegaRAID SAS RAID controllers.
|
|
|
|
#
|
|
|
|
# $FreeBSD$
|
|
|
|
#
|
|
|
|
|
|
|
|
# If there is a global system configuration file, suck it in.
|
|
|
|
#
|
|
|
|
if test -r /etc/defaults/periodic.conf; then
|
|
|
|
. /etc/defaults/periodic.conf
|
|
|
|
source_periodic_confs
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Defaults.
|
|
|
|
: ${daily_status_mfi_raid_enable:=NO}
|
|
|
|
: ${daily_status_mfi_raid_verbose:=NO}
|
|
|
|
: ${daily_status_mfi_raid_persist_logs:=YES}
|
2008-10-13 19:22:20 +02:00
|
|
|
: ${daily_status_mfi_raid_tty_log:=NO}
|
2007-03-09 14:15:02 +01:00
|
|
|
|
|
|
|
megacli=${megacli:-%%PREFIX%%/sbin/megacli}
|
|
|
|
logdir=${logdir:-/var/log}
|
|
|
|
|
|
|
|
case "$daily_status_mfi_raid_enable" in
|
|
|
|
[Yy][Ee][Ss])
|
2007-12-27 01:15:48 +01:00
|
|
|
echo
|
|
|
|
echo 'Checking status of MFI RAID controllers:'
|
2007-03-09 14:15:02 +01:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
if test `id -u` -ne 0; then
|
|
|
|
echo "You must be root to run `basename $0`." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2009-04-30 13:39:08 +02:00
|
|
|
ADPCOUNT=$(${megacli} -adpCount -NoLog | \
|
2007-03-09 14:15:02 +01:00
|
|
|
awk '/Controller Count:/ { gsub("\\.", ""); print $3 }')
|
|
|
|
|
|
|
|
case ${ADPCOUNT} in
|
|
|
|
0) echo "Error: Cannot find an adapter." >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
[1-9]|[1-9][0-9]|[1-2][0-9][0-9])
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "Error: Cannot get the number of adapters: ${ADPCOUNT}" >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
ADPMINIDX=0
|
|
|
|
ADPMAXIDX=`expr ${ADPCOUNT} - 1`
|
|
|
|
|
|
|
|
rc=0
|
|
|
|
for ctrl in `jot ${ADPCOUNT} ${ADPMINIDX} ${ADPMAXIDX}`; do
|
2008-04-17 22:07:53 +02:00
|
|
|
echo "Adapter: ${ctrl}"
|
2007-03-09 14:15:02 +01:00
|
|
|
|
|
|
|
# Print summary information.
|
|
|
|
echo "------------------------------------------------------------------------"
|
|
|
|
echo "Physical Drive Information:"
|
2007-12-27 01:15:48 +01:00
|
|
|
echo "ENC SLO DEV SEQ MEC OEC PFC LPF STATE"
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -PDList -a${ctrl} -NoLog | \
|
2007-03-09 14:15:02 +01:00
|
|
|
awk '
|
|
|
|
BEGIN {
|
|
|
|
E=-1; S=-1; D=-1; s=-1; mec=-1; oec=-1; pfc=-1; lpfeqn=-1;
|
|
|
|
state="";
|
|
|
|
}
|
2009-07-04 00:57:02 +02:00
|
|
|
/^Enclosure Number:/ { E=$3; }
|
2008-10-13 19:22:20 +02:00
|
|
|
/^Enclosure Device ID:/ { E=$4; }
|
2007-03-09 14:15:02 +01:00
|
|
|
/^Slot Number:/ { S=$3; }
|
|
|
|
/^Device Id:/ { D=$3; }
|
|
|
|
/^Sequence Number:/ { s=$3; }
|
|
|
|
/^Media Error Count:/ { mec=$4; }
|
|
|
|
/^Other Error Count:/ { oec=$4; }
|
|
|
|
/^Predictive Failure Count:/ { pfc=$4; }
|
|
|
|
/^Last Predictive Failure Event Seq Number:/ { lpfeqn=$7 }
|
|
|
|
/^Firmware state:/ { state=$3; }
|
|
|
|
/^$/ {
|
|
|
|
if (E!=-1 && S!=-1 && D!=-1) {
|
|
|
|
printf "%-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d %s\n",
|
|
|
|
E, S, D, s, mec, oec, pfc, lpfeqn, state;
|
|
|
|
}
|
|
|
|
E=-1; S=-1; D=-1; s=-1; mec=-1; oec=-1; pfc=-1; lpfeqn=-1;
|
|
|
|
state="";
|
|
|
|
}
|
|
|
|
' | sort -n -k1 -k2 -k3
|
|
|
|
echo
|
|
|
|
echo "Virtual Drive Information:"
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -LDInfo -lall -a${ctrl} -NoLog | \
|
2007-03-09 14:15:02 +01:00
|
|
|
awk '
|
|
|
|
BEGIN {
|
|
|
|
drvs=-1; vd=-1; state=""; name=""; s=-1; strs=-1;
|
|
|
|
rlp=-1; rls=-1; rlq=-1;
|
|
|
|
printf "VD DRV RLP RLS RLQ STS SIZE STATE NAME\n";
|
|
|
|
}
|
|
|
|
/^Name:/ { sub("^Name:", ""); name=$0; }
|
|
|
|
/^RAID Level:/ {
|
|
|
|
#Primary-1, Secondary-0, RAID Level Qualifier-0
|
|
|
|
_p=_s=_q=$0;
|
|
|
|
sub(".*Primary-", "", _p);
|
|
|
|
sub(", Secondary.*", "", _p);
|
|
|
|
rlp=_p;
|
|
|
|
sub(".*Secondary-", "", _s);
|
|
|
|
sub(", RAID Level.*", "", _s);
|
|
|
|
rls=_s;
|
|
|
|
sub(".*Qualifier-", "", _q);
|
|
|
|
rlq=_q;
|
|
|
|
}
|
|
|
|
/^Size:/ { sub("^Size:", ""); s=$0; }
|
|
|
|
/^State:/ { state=$2; }
|
|
|
|
/^Stripe Size:/ { strs=$3; }
|
|
|
|
/^Number Of Drives:/ { sub("Drives:", "", $3); drvs=$3; }
|
|
|
|
/^Virtual Disk:/ {
|
|
|
|
if (vd!=-1) {
|
|
|
|
printf "%-3d %-3d %-3d %-3d %-3d %-6s %-11s %-13s %s\n",
|
|
|
|
vd, drvs, rlp, rls, rlq, strs, s, state, name;
|
|
|
|
}
|
|
|
|
drvs=-1; vd=-1; state=""; name=""; s=-1; strs=-1;
|
|
|
|
rlp=-1; rls=-1; rlq=-1;
|
|
|
|
vd=$3;
|
|
|
|
}
|
|
|
|
END {
|
|
|
|
if (vd!=-1) {
|
|
|
|
printf "%-3d %-3d %-3d %-3d %-3d %-6s %-11s %-13s %s\n",
|
|
|
|
vd, drvs, rlp, rls, rlq, strs, s, state, name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
'
|
2008-06-18 15:02:46 +02:00
|
|
|
# Print BBU Information, if we found something
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -AdpBbuCmd -a${ctrl} -NoLog | \
|
2007-03-09 14:15:02 +01:00
|
|
|
awk '
|
|
|
|
BEGIN {
|
2008-06-18 15:02:46 +02:00
|
|
|
type=""; temp=-1; isok="-"; rsoc=-1; asoc=-1;
|
2007-03-09 14:15:02 +01:00
|
|
|
rc=-1; cc=-1; me=-1;
|
|
|
|
}
|
|
|
|
/^BatteryType:/ { type=$2; }
|
|
|
|
/^Temperature:/ { temp=$2; }
|
|
|
|
/^isSOHGood:/ { isok=$2; }
|
|
|
|
/^Relative State of Charge:/ { rsoc=$5; }
|
|
|
|
/^Absolute State of charge:/ { asoc=$5; }
|
|
|
|
/^Remaining Capacity:/ { rc=$3; }
|
|
|
|
/^Cycle Count:/ { cc=$3; }
|
|
|
|
/^Max Error:/ { me=$3; }
|
|
|
|
END {
|
2008-06-18 15:02:46 +02:00
|
|
|
if (type == "") { exit 0 };
|
|
|
|
printf "\nBBU Information:\n"
|
|
|
|
printf "TYPE TEMP OK RSOC ASOC RC CC ME\n";
|
|
|
|
printf "%-5s %2dC %-3s %4d%% %4d%% %4dmAh %4d %2d%%\n",
|
2007-03-09 14:15:02 +01:00
|
|
|
type, temp, isok, rsoc, asoc, rc, cc, me;
|
|
|
|
|
|
|
|
}
|
|
|
|
'
|
2008-06-18 15:02:46 +02:00
|
|
|
echo
|
2007-03-09 14:15:02 +01:00
|
|
|
|
|
|
|
# Give very long outputs.
|
|
|
|
case "$daily_status_mfi_raid_verbose" in
|
|
|
|
[Yy][Ee][Ss])
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -AdpAllInfo -a${ctrl} -NoLog
|
|
|
|
${megacli} -EncInfo -a${ctrl} -NoLog
|
|
|
|
${megacli} -PDList -a${ctrl} -NoLog
|
|
|
|
${megacli} -LDGetNUm -a${ctrl} -NoLog
|
|
|
|
${megacli} -LDInfo -Lall -a${ctrl} -NoLog
|
|
|
|
${megacli} -AdpBbuCmd -GetBbuStatus -a${ctrl} -NoLog
|
2007-03-09 14:15:02 +01:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# Diff daily logs.
|
|
|
|
echo "Controller Logs:"
|
|
|
|
ctrl_log=${logdir}/mfi_raid_${ctrl}
|
|
|
|
case "$daily_status_mfi_raid_persist_logs" in
|
|
|
|
[Yy][Ee][Ss])
|
|
|
|
if test ! -f ${ctrl_log}.today; then
|
|
|
|
touch ${ctrl_log}.today
|
|
|
|
fi
|
|
|
|
mv -f ${ctrl_log}.today ${ctrl_log}.yesterday
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
;;
|
|
|
|
esac
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -AdpEventLog -GetEvents -f ${ctrl_log}.tmp -a${ctrl} -NoLog
|
2007-03-09 14:15:02 +01:00
|
|
|
awk '
|
|
|
|
BEGIN {
|
|
|
|
inrecord=0;
|
|
|
|
}
|
|
|
|
printed=0;
|
|
|
|
/^seqNum: / {
|
|
|
|
inrecord=0;
|
|
|
|
print "";
|
|
|
|
print "====================================" \
|
|
|
|
"====================================";
|
|
|
|
}
|
|
|
|
/^Event Data:/ { inrecord=1; printed=1; }
|
|
|
|
/^seqNum: /, /^Event Data:/
|
|
|
|
/^===========/ { printed=1; }
|
|
|
|
/^$/ { printed=1; }
|
|
|
|
{ if (inrecord && !printed) { printf "\t%s\n", $0; } }
|
|
|
|
' < ${ctrl_log}.tmp > ${ctrl_log}.today
|
|
|
|
rm -f ${ctrl_log}.tmp
|
|
|
|
# Now show the differences or the entire log.
|
|
|
|
case "$daily_status_mfi_raid_persist_logs" in
|
|
|
|
[Yy][Ee][Ss])
|
2007-12-27 01:15:48 +01:00
|
|
|
cmp -s ${ctrl_log}.yesterday ${ctrl_log}.today
|
2007-03-09 14:15:02 +01:00
|
|
|
raid_rc=$?
|
|
|
|
if test $raid_rc -ne 0; then
|
|
|
|
diff -u ${ctrl_log}.yesterday ${ctrl_log}.today | \
|
|
|
|
grep -v '^-\|^$'
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
# XXX we might consider clearing the logs here
|
2009-04-30 13:39:08 +02:00
|
|
|
# ${megacli} -AdpEventLog -Clear -a${ctrl} -NoLog
|
2007-03-09 14:15:02 +01:00
|
|
|
raid_rc=0
|
|
|
|
lines=`wc -l ${ctrl_log}.today | awk '{ print $1 }'`
|
|
|
|
if test $lines -gt 4; then
|
|
|
|
cat ${ctrl_log}.today
|
|
|
|
raid_rc=1
|
|
|
|
fi
|
|
|
|
esac
|
|
|
|
if test $raid_rc -eq 0; then
|
|
|
|
echo " No new log messages."
|
|
|
|
fi
|
2008-10-13 19:22:20 +02:00
|
|
|
|
|
|
|
# TTY Log
|
|
|
|
echo "TTY Log:"
|
|
|
|
tty_log=${logdir}/mfi_raid_${ctrl}_tty
|
|
|
|
tty_rc=0
|
|
|
|
case "$daily_status_mfi_raid_tty_log" in
|
|
|
|
[Yy][Ee][Ss])
|
|
|
|
if test ! -f ${tty_log}.today; then
|
|
|
|
touch ${tty_log}.today
|
|
|
|
fi
|
|
|
|
mv -f ${tty_log}.today ${tty_log}.yesterday
|
2009-04-30 13:39:08 +02:00
|
|
|
${megacli} -FwTermLog Dsply -a${ctrl} > ${tty_log}.today -NoLog
|
2008-10-13 19:22:20 +02:00
|
|
|
cmp -s ${tty_log}.yesterday ${tty_log}.today
|
|
|
|
tty_rc=$?
|
|
|
|
if test $tty_rc -ne 0; then
|
|
|
|
diff -u ${tty_log}.yesterday ${tty_log}.today | \
|
|
|
|
grep -v '^-\|^$'
|
|
|
|
else
|
|
|
|
echo " No new TTY log messages."
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
[ $rc -eq 0 ] && [ $raid_rc -ne 0 -o $tty_rc -ne 0 ] && rc=3
|
2007-03-09 14:15:02 +01:00
|
|
|
done
|
|
|
|
|
|
|
|
exit ${rc}
|
|
|
|
|
|
|
|
# end
|