#!/bin/sh
#
# Shows status of areca RAID controllers: arcmsr(4)
#
# Authors: Bjoern A. Zeeb
#
# $FreeBSD: ports/sysutils/areca-cli/files/407.status-areca-raid.in,v 1.1 2007/12/15 18:37:59 pav Exp $
#

# If there is a global system configuration file, suck it in.
#
if [ -r /etc/defaults/periodic.conf ]
then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

# Defaults.
: ${daily_status_arcmsr_raid_enable:=NO}
# Verbose.
: ${daily_status_arcmsr_raid_verbose:=YES}
# SMART.
: ${daily_status_arcmsr_raid_smart:=YES}
# Logs persist between "areca-cli event info" invocation?
: ${daily_status_arcmsr_raid_persist_logs:=YES}

areca_cli=${areca_cli:-%%PREFIX%%/sbin/areca-cli}
logdir=${logdir:-/var/log}

verbose()
{
	local cmd
	local scmd
	local log
	cmd=$1
	scmd=$2
	log=$3

	case ${daily_status_arcmsr_raid_verbose} in
	[Nn][Oo])
		return
		;;
	*)	;;
	esac
	
	${areca_cli} ${cmd} ${scmd} >> ${log}
}

smart()
{
	local log
	local disk
	log=$1

	case ${daily_status_arcmsr_raid_smart} in
	[Nn][Oo])
		return
		;;
	*)	;;
	esac

	for disk in `${areca_cli} disk info | awk '
	  BEGIN { run=0 }
	  { if (/^=======/) {
	    if (run==0) { run=1; } else { run=0; } }
                   else { if (run==1) { printf "%d ", $1; } } };'`; do
		echo "SMART data for disk ${disk}" >> ${log}
		${areca_cli} disk smart drv=${disk} >> ${log}
	done
}

case "$daily_status_arcmsr_raid_enable" in
    [Yy][Ee][Ss])
	echo
	echo 'Checking status of Areca RAID controllers:'

	rc=0

	# Checking the currently selected (1st) controller.
	# XXX TODO set curctrl=[1..4]; along with that
	# XXX TODO try to only call areca-cli once (per ctrl).
     	echo ""
	echo "Controller ${ctrl}:"
	ctrl_log=${logdir}/arcmsr_raid_${ctrl}
	if test ! -f ${ctrl_log}.today; then
		touch ${ctrl_log}.today
	fi
	mv -f ${ctrl_log}.today ${ctrl_log}.yesterday
	# Not too efficient to call areca_cli lots of times.
	verbose sys info ${ctrl_log}.today
	${areca_cli} rsf info >> ${ctrl_log}.today
	verbose vsf info ${ctrl_log}.today
	verbose disk info ${ctrl_log}.today
	smart ${ctrl_log}.today
	verbose hw info ${ctrl_log}.today
	lines=`wc -l ${ctrl_log}.today | awk '{ print $1 }'`
	diff -u -$lines ${ctrl_log}.yesterday ${ctrl_log}.today
	raid_rc=$?
	if test $raid_rc -eq 0; then
		cat  ${ctrl_log}.today
	fi
	[ $rc -eq 0 ] && [ $raid_rc -ne 0 ] && rc=3

	# Checking logs.
	echo "Logs (most recent first):"
	logs_log=${logdir}/arcmsr_log_${ctrl}
	case "$daily_status_arcmsr_raid_persist_logs" in
	[Yy][Ee][Ss])
		if test ! -f ${logs_log}.today; then
			touch ${logs_log}.today
		fi
		mv -f ${logs_log}.today ${logs_log}.yesterday
		${areca_cli} event info > ${logs_log}.today
		cmp -zs ${logs_log}.yesterday ${logs_log}.today
		raid_rc=$?
		if test $raid_rc -ne 0; then
			diff -u ${logs_log}.yesterday ${logs_log}.today | \
				grep -v '^-\|^$'
		fi
		;;
	*)
		raid_rc=0
		${areca_cli} event info > ${logs_log}.today
		${areca_cli} event clear >> ${logs_log}.today
		lines=`wc -l ${logs_log}.today | awk '{ print $1 }'`
		if test $lines -gt 4; then
			cat ${logs_log}.today
			raid_rc=1
		fi
		;;
	esac
	if test $raid_rc -eq 0; then
		echo "  No new alarms."
	fi
	[ $rc -eq 0 ] && [ $raid_rc -ne 0 ] && rc=3
	;;

    *)  rc=0;;
esac

exit $rc

# end


syntax highlighted by Code2HTML, v. 0.9.1