ports/109753: [PATCH] sysutils/linux-meglacli enhancements
Bjoern A. Zeeb
bzeeb+freebsdports at zabbadoz.net
Fri Mar 2 14:10:03 UTC 2007
>Number: 109753
>Category: ports
>Synopsis: [PATCH] sysutils/linux-meglacli enhancements
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Fri Mar 02 14:10:02 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Bjoern A. Zeeb
>Release: FreeBSD 7.0-CURRENT amd64
>Organization:
Zabbadoz.NeT
>Environment:
System: FreeBSD foo 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Sun Oct 30 18:31:51 UTC 2005 bz at foo:/path/to/HEAD/sys/KERNEL amd64
>Description:
the linux-megacli port was a bit hard to get running
because it wasn't checking all prereqs. Further it
already gave good info on what to do so it was even more
confusing.
Checking for empty directories to exist wasn't really great,
especially if paths did not match.
Redirect error information to stderr instead of giving
it on stdout.
A periodic script for daily mails about raid states
was missing.
>How-To-Repeat:
>Fix:
In addition to the attached patch I also copied it to
http://sources.zabbadoz.net/freebsd/ports/experimental/
file name sysutils-linux-megacli-03.diff for easy access.
It's hardly tested. The 407 daily script tries
to do what was done for amrstat and tw_cli before.
[ you may ignore the whitespace cahnges ;-) ]
Index: Makefile
===================================================================
RCS file: /export/media/FreeBSD/cvsup/r/pcvs/ports/sysutils/linux-megacli/Makefile,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile
--- Makefile 3 Dec 2006 14:21:55 -0000 1.3
+++ Makefile 2 Mar 2007 13:19:42 -0000
@@ -21,11 +21,13 @@ RESTRICTED= Redistribution prohibited, s
ONLY_FOR_ARCHS= i386 amd64
USE_LINUX= yes
SUB_FILES= megacli.sh
+SUB_FILES+= 407.status-mfi-raid
# From bsd.linux.rpm.mk
RPM2CPIO?= ${LOCALBASE}/bin/rpm2cpio
EXTRACT_DEPENDS+= ${RPM2CPIO}:${PORTSDIR}/archivers/rpm
+
post-extract:
@cd ${WRKSRC} && \
${UNZIP_CMD} MegaCliLin.zip && \
@@ -36,6 +38,8 @@ do-build:
do-install:
${INSTALL_SCRIPT} ${WRKSRC}/megacli.sh ${PREFIX}/sbin/megacli
+ ${INSTALL_SCRIPT} -d ${PREFIX}/etc/periodic/daily
+ ${INSTALL_SCRIPT} ${WRKSRC}/407.status-mfi-raid ${PREFIX}/etc/periodic/daily
${INSTALL_PROGRAM} ${WRKSRC}/usr/sbin/MegaCli ${PREFIX}/libexec
post-install:
Index: pkg-message
===================================================================
RCS file: /export/media/FreeBSD/cvsup/r/pcvs/ports/sysutils/linux-megacli/pkg-message,v
retrieving revision 1.1
diff -u -p -r1.1 pkg-message
--- pkg-message 1 Dec 2006 15:26:24 -0000 1.1
+++ pkg-message 2 Mar 2007 13:19:42 -0000
@@ -20,11 +20,20 @@ Add the following to /etc/sysctl.conf
Add the following to /etc/fstab
# For MegaCLi
- linsys /compat/linux/sys linsysfs rw 0 0
+ linproc /compat/linux/proc linprocfs rw 0 0
+ linsys /compat/linux/sys linsysfs rw 0 0
+
+Add the following to /etc/periodic.conf
+
+ # !!! Warning: test before running on a production system !!!
+ # !!! Warning: might hang your system !!!
+ # For daily summary mails and log diffs:
+ daily_status_mfi_raid_enable="YES"
+ # In case you want really lots of details enable this:
+ daily_status_mfi_raid_verbose="NO"
If you find mfi(4) too verbose, see mfi_evt_class_t in
/usr/src/sys/dev/mfi/mfireg.h for values you can use in the
+ hw.mfi.event_class
+sysctl variable.
-hw.mfi.event_class
-
-sysctl variable
Index: pkg-plist
===================================================================
RCS file: /export/media/FreeBSD/cvsup/r/pcvs/ports/sysutils/linux-megacli/pkg-plist,v
retrieving revision 1.1
diff -u -p -r1.1 pkg-plist
--- pkg-plist 1 Dec 2006 15:26:24 -0000 1.1
+++ pkg-plist 2 Mar 2007 13:19:42 -0000
@@ -1,4 +1,5 @@
sbin/megacli
libexec/MegaCli
+etc/periodic/daily/407.status-mfi-raid
%%PORTDOCS%%%%DOCSDIR%%/readme.txt
%%PORTDOCS%%@dirrm %%DOCSDIR%%
Index: files/407.status-mfi-raid.in
===================================================================
RCS file: files/407.status-mfi-raid.in
diff -N files/407.status-mfi-raid.in
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/407.status-mfi-raid.in 2 Mar 2007 13:19:42 -0000
@@ -0,0 +1,227 @@
+#!/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}
+
+megacli=${megacli:-%%PREFIX%%/sbin/megacli}
+logdir=${logdir:-/var/log}
+
+case "$daily_status_mfi_raid_enable" in
+ [Yy][Ee][Ss])
+ ;;
+ *)
+ 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 | \
+ 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 "Adpater: ${ctrl}"
+
+ # Print summary information.
+ echo "------------------------------------------------------------------------"
+ echo "Physical Drive Information:"
+ ${megacli} -PDList -a${ctrl} | \
+ awk '
+ BEGIN {
+ E=-1; S=-1; D=-1; s=-1; mec=-1; oec=-1; pfc=-1; lpfeqn=-1;
+ state="";
+ printf "ENC SLO DEV SEQ MEC OEC PFC LPF STATE\n";
+ }
+ /^Enclosure Number:/ { E=$3; }
+ /^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} | \
+ 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;
+ }
+ }
+ '
+ echo
+ echo "BBU Information:"
+ ${megacli} -AdpBbuCmd -a${ctrl} | \
+ awk '
+ BEGIN {
+ type=""; temp=-1; isok=-1; 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 {
+ printf "TYPE TEMP OK RSOC ASOC RC CC ME\n";
+ printf "%-4s %-2d C %-4s %-5d %-5d %-5d %-5d %-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}
+ ${megacli} -EncInfo -a${ctrl}
+ ${megacli} -PDList -a${ctrl}
+ ${megacli} -LDGetNUm -a${ctrl}
+ ${megacli} -LDInfo -Lall -a${ctrl}
+ ${megacli} -AdpBbuCmd -GetBbuStatus -a${ctrl}
+ ;;
+ *)
+ ;;
+ 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}
+ 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 -zs ${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}
+ 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
+ [ $rc -eq 0 ] && [ $raid_rc -ne 0 ] && rc=3
+done
+
+exit ${rc}
+
+# end
Index: files/megacli.sh.in
===================================================================
RCS file: /export/media/FreeBSD/cvsup/r/pcvs/ports/sysutils/linux-megacli/files/megacli.sh.in,v
retrieving revision 1.1
diff -u -p -r1.1 megacli.sh.in
--- files/megacli.sh.in 1 Dec 2006 15:26:24 -0000 1.1
+++ files/megacli.sh.in 2 Mar 2007 13:19:42 -0000
@@ -4,17 +4,23 @@
#
if [ `id -u` -ne 0 ]
then
- echo You must be root to run `basename $0`.
+ echo "You must be root to run `basename $0`." >&2
exit 1
fi
if ! [ `sysctl -n compat.linux.osrelease` = "2.6.12" ]; then
- echo You need to set compat.linux.osrelease to 2.6.12 to run `basename $0`.
+ echo "You need to set compat.linux.osrelease to 2.6.12 to run `basename $0`." >&2
exit 1
fi
-if ! [ -d /usr/compat/linux/sys ]; then
- echo You need to mount linsysfs to run `basename $0`.
+lpfs=`mount -t linprocfs | wc -l | awk '{ print $1 }'`
+if [ ${lpfs} -le 0 ]; then
+ echo "You need to mount linprocfs to run `basename $0`." >&2
+ exit 1
+fi
+lsfs=`mount -t linsysfs | wc -l | awk '{ print $1 }'`
+if [ ${lsfs} -le 0 ]; then
+ echo "You need to mount linsysfs to run `basename $0`." >&2
exit 1
fi
@@ -24,11 +30,16 @@ if ! kldstat -q -m mfi_linux
then
if kldload mfi_linux
then
- echo 'mfi_linux module loaded.'
+ echo 'mfi_linux module loaded.' >&2
else
- echo 'mfi_linux module failed to load.'
+ echo 'mfi_linux module failed to load.' >&2
exit 1
fi
+fi
+
+if [ $# -le 0 ]; then
+ echo "usage: `basename $0` [options]" >&2
+ exec %%PREFIX%%/libexec/MegaCli -h
fi
exec %%PREFIX%%/libexec/MegaCli ${*}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list