#!/bin/sh
# $Id$
#
# Script:	S20svm
#
# Description:	Sun Volume Manager diskset control script
#		List disksets to control in ${RSFDIR}/etc/fs/disksets.<service>
#		(Use S25vfs to mount metadevice filesystems)
#
# Platform:	Solaris
#
# Author:	High-Availability.Com Ltd
#

. /opt/HAC/bin/rsf.sh

service=${RSF_SERVICE:-"servicename"}	# short service name
dsettab="${PRODUCT_ETC}/fs/disksets.${service}"

maxtries=3	# no. of times to attempt execution
script="`basename $0`"
state="$1"
attempts=${2:-'1'}

# find SVM
if [ -d "/usr/opt/SUNWmd/sbin" ]; then
	# 4.0-4.2
	PATH=/usr/opt/SUNWmd/sbin:${PATH}
else
	# 4.2.1+
	PATH=/usr/sbin:${PATH}
fi
export PATH

# fail after three tries
if [ ${attempts} -gt ${maxtries} ]; then
	echo "Too many retries, aborting!"
	exit ${COMPANY_ABORT}
fi

if [ ! -f "${dsettab}" ]; then
	dated_echo "Couldn't find diskset list ${dsettab}, aborting"
	exit ${COMPANY_ABORT}
fi
# get diskset names from file
disksets=`awk '!/^#/ { print $1 }' ${dsettab}`

case "${state}" in

'start')
	for dset in ${disksets}; do
		# check if we already own it
		metaset -s "${dset}" -o >/dev/null 2>&1
		if [ $? -eq 0 ]; then
			dated_echo "${dset} already owned, skipping"
			continue
		fi
		
		dated_echo "Taking ${dset} diskset ... \c"
		metaset -s "${dset}" -t >/dev/null 2>&1
		if [ $? -eq 0 ]; then
			echo "done"
		else
			echo "failed!"
			dated_echo "Attempting to take with force ... \c"
			metaout=`metaset -s "${dset}" -t -f 2>&1`
			if [ $? -eq 0 ]; then
				echo "done"
			else
				metaset -s "${dset}" -o >/dev/null 2>&1
				if [ $? -eq 0 ]; then
					echo "done"
					dated_echo "*** WARNING - ${dset} diskset taken but warnings generated: ***"
					dated_echo ${metaout}
					dated_echo "Please investigate and rectify"
				else
					echo "failed!"
					dated_echo "*** ERROR - Failed to take ${dset} diskset: ***"
					dated_echo ${metaout}
					dated_echo "Aborting ${state}"
					exit ${COMPANY_ABORT}
				fi
			fi
		fi
	done
	;;

'stop')
	abort=0	# flag
	for dset in ${disksets}; do
		# check that we currently own it
		metaset -s "${dset}" -o >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			dated_echo "${dset} not currently owned, skipping"
			continue
		fi

		dated_echo "Releasing ${dset} diskset ... \c"
		metaout=`metaset -s "${dset}" -r 2>&1`
		if [ $? -eq 0 ]; then
			echo "done"
		else
			echo "failed!"
			dated_echo "*** ERROR - Failed to release ${dset} diskset: ***"
			dated_echo ${metaout}
			dated_echo "(Mirrors may still be resyncing)"
			dated_echo "Releasing ${dset} diskset second attempt ... \c"
			sleep 5
			metaout=`metaset -s "${dset}" -r 2>&1`
			if [ $? -eq 0 ]; then
				echo "done"
			else
				echo "failed!"
				dated_echo "*** ERROR - Failed to release ${dset} diskset: ***"
				dated_echo ${metaout}
				dated_echo "(Mirrors may still be resyncing)"
				dated_echo "Please investigate"
				abort=1
			fi
		fi
	done
	
	if [ ${abort} -ne 0 ]; then
		dated_echo "*** Problems releasing diskset(s), aborting ${state} ***"
		exit ${COMPANY_ABORT}
	fi
	;;

*)
	echo "Usage: ${script} <start|stop>"
	exit ${COMPANY_WARN}
	;;

esac

exit ${COMPANY_OK}
