freebsd-ports/sysutils/linux-megacli/files/407.status-mfi-raid.in
Wesley Shields a033bd2c88 - Install proper documentation file.
- Fix typo in patch file.

PR:		ports/134945,
Submitted by:	Zhen REN <bg1tpt@gmail.com>
		Bjoern A. Zeeb <bzeeb+freebsdports@zabbadoz.net>
Approved by:	Ruben van Staveren <ruben@verweg.com> (maintainer)
2009-07-03 22:57:02 +00:00

256 lines
6.3 KiB
Bash

#!/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}
: ${daily_status_mfi_raid_tty_log:=NO}
megacli=${megacli:-%%PREFIX%%/sbin/megacli}
logdir=${logdir:-/var/log}
case "$daily_status_mfi_raid_enable" in
[Yy][Ee][Ss])
echo
echo 'Checking status of MFI RAID controllers:'
;;
*)
exit 0
;;
esac
if test `id -u` -ne 0; then
echo "You must be root to run `basename $0`." >&2
exit 1
fi
ADPCOUNT=$(${megacli} -adpCount -NoLog | \
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
echo "Adapter: ${ctrl}"
# Print summary information.
echo "------------------------------------------------------------------------"
echo "Physical Drive Information:"
echo "ENC SLO DEV SEQ MEC OEC PFC LPF STATE"
${megacli} -PDList -a${ctrl} -NoLog | \
awk '
BEGIN {
E=-1; S=-1; D=-1; s=-1; mec=-1; oec=-1; pfc=-1; lpfeqn=-1;
state="";
}
/^Enclosure Number:/ { E=$3; }
/^Enclosure Device ID:/ { E=$4; }
/^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:"
${megacli} -LDInfo -lall -a${ctrl} -NoLog | \
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;
}
}
'
# Print BBU Information, if we found something
${megacli} -AdpBbuCmd -a${ctrl} -NoLog | \
awk '
BEGIN {
type=""; temp=-1; isok="-"; rsoc=-1; asoc=-1;
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 {
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",
type, temp, isok, rsoc, asoc, rc, cc, me;
}
'
echo
# Give very long outputs.
case "$daily_status_mfi_raid_verbose" in
[Yy][Ee][Ss])
${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
;;
*)
;;
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
${megacli} -AdpEventLog -GetEvents -f ${ctrl_log}.tmp -a${ctrl} -NoLog
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])
cmp -s ${ctrl_log}.yesterday ${ctrl_log}.today
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
# ${megacli} -AdpEventLog -Clear -a${ctrl} -NoLog
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
# 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
${megacli} -FwTermLog Dsply -a${ctrl} > ${tty_log}.today -NoLog
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
done
exit ${rc}
# end