#!/bin/sh
#
#pragma ident	"@(#)svm.sync.sh	1.5	04/03/12 SMI"
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# SUNWmd.sync
#
#	Metadisk driver run-level 2 startup/shutdown.

DEVFSADM=/usr/sbin/devfsadm
METADEVADM=/usr/sbin/metadevadm
METASYNC=/usr/sbin/metasync
METADEV=/dev/md/admin
MDMONITORD=/usr/sbin/mdmonitord
METASET=/usr/sbin/metaset
TMPFILE=/var/run/metaset.$$

print_verbose()
{
	echo "Unable to resolve unnamed devices for volume management."
	echo "Please refer to the Solaris Volume Manager documentation,"
	echo "Troubleshooting section, at http://docs.sun.com or from"
	echo "your local copy."
}

resolve_auto_take_sets()
{
	if [ -x $METASET ]; then
		# Fixing up of the ctd names for devices in auto take
		# sets relies heavily on the output of the metaset
		# command. Any change to the output of the metaset command
		# should modify this script as well in order ensure nothing
		# breaks
		#
		# The following command saves all of the auto-take set names
		# into the TMPFILE
		name_str=`gettext "Set name"`
		mn_str=`gettext "Multi-owner"` 
		$METASET | /bin/nawk -F ' |\t|,' -v snm="$name_str" \
		    -v mstr="$mn_str" '$0 ~ snm { \
		    if (index($0, mstr) == 0) print $4 \
		}' > $TMPFILE 2>&1

		if [ -s "$TMPFILE" ]; then
			localised_string=`gettext "Yes (auto)"`
			for i in `cat $TMPFILE`; do
				$METASET -s $i | grep "$localised_string" \
				    > /dev/null 2>&1
				if [ $? -eq 0 ]; then
					$METADEVADM -l -r -s $i
					error=$?    
					case $error in
					0|2)	;;
					3) 	print_verbose
				    		;;
					*)	echo "$METADEVADM \
						-r failure $error."
						;;
					esac
				fi
			done
			/usr/bin/rm -f $TMPFILE
		fi
	fi
}

case "$1" in

'start')
	if [ -s /kernel/drv/md.conf ] && \
	    grep '^mddb_bootlist' /kernel/drv/md.conf >/dev/null 2>&1; then
		if [ -x $METADEVADM -a -x $METASYNC -a -c $METADEV ]; then
			$METADEVADM -l -r
			error=$?
			case $error in
			0|2)	;;
			3)	echo "Executing devfsadm"
				$DEVFSADM
				devfsadmerror=$?
				if [ $devfsadmerror = 0 ]; then
					echo "Executing metadevadm -r"
					$METADEVADM -l -r
					error=$?
				fi
				if [ $devfsadmerror != 0 -o $error = 3 ]; then
					print_verbose
				elif [ $error != 0 -a $error != 2 ]; then
					echo "$METADEVADM -r failure $error."
				fi	
				;;
			*)	echo "$METADEVADM -r failure $error."
				;;
			esac

			resolve_auto_take_sets

			$METASYNC -r
			error=$?
			case $error in
			0)	;;
			*)	echo "Unknown $METASYNC -r failure $error."
				;;
			esac
			if [ -x $MDMONITORD ]; then
				$MDMONITORD 
				error=$?
				case $error in
				0)	;;
				*)	echo "Could not start $MDMONITORD. \c"
					echo "Error $error."
				;;
				esac
			fi
		fi
	fi
	;;

'stop')	
	/usr/bin/pkill -HUP -u 0 'mdmonitord'
	;;

*)	echo "Usage: $0 { start | stop }"
	;;

esac
