#!/bin/sh
#
#*******************************************************************************
#***                             IDENTIFICATION                              ***
#*******************************************************************************
#
#  Name:	rdacctrl
#  Title:	Rdac Daemon Start/Stop Script
#  Version:
#  Revision:
#  Update Date:
#  Programmer:	rmj
#  Documents:	
#
#  COPYRIGHT 1996, Symbios Logic Inc.
#
#  Description:
#     The RDAC Daemon Start/Stop Script is invoked by the system startup/
#     shutdown processing.  Its function is to start or stop the
#     rdac daemons, as indicated by the input argument.
#
#*******************************************************************************
#  Modified:
#	Mon May 12 12:10:04 PDT 1997	jackb	suppress reconfig logic
#*******************************************************************************

clean_sd()
{
        $LAD 2>/dev/null |
        while read CTRL_INFO
        do
                DEV=`echo $CTRL_INFO | cut -d" " -f1`
                TARGET=`echo $DEV | cut -dt -f2 | cut -dd -f1`
                PHYS_PATH=/`ls -l $RMDEVROOT/dev/rdsk/$DEV 2>/dev/null | cut -d\> -f2 | awk -F/ '{ ORS = "/"; for (i = 4; i < NF-1; ++i) print $i; ORS="\n"; print $(NF-1) }'`/sd@$TARGET
                DEL_LIST=`ls -l  $1/dev/rdsk | grep $PHYS_PATH | tr -s " " | cut -d" " -f9`
                if [ -n "$DEL_LIST" ]
                then
                        ( if [ -d $1/dev/rdsk ]
			then
				 cd $1/dev/rdsk
                        	/bin/rm $DEL_LIST 2>/dev/null
			fi ) &
                        ( if [ -d $1/dev/dsk ]
			then
				 cd $1/dev/dsk
                        	/bin/rm $DEL_LIST 2>/dev/null
			fi ) &
                        wait
			/bin/touch /tmp/sdDeleted.$$
                fi
        done;
}

clean_rd()
{
	find /devices  -name $RDAC_DRIVER_NAME\* -exec rm {} ";" >/dev/null 2>&1
	DELETE_LIST=`ls -l  $1/dev/rdsk | grep $RDAC_DRIVER_NAME | tr -s " " | cut -d" " -f9`
	( if [ -d $1/dev/rdsk ]
	then
		cd $1/dev/rdsk
		/bin/rm $DELETE_LIST 2>/dev/null
	fi ) &
	( if [ -d $1/dev/dsk ]
	then
		cd $1/dev/dsk
		/bin/rm $DELETE_LIST 2>/dev/null
	fi ) &
	wait;
}

WARNING="\nWARNING:  It is possible that VxVM is not bound to the RDAC device nodes.You\nneed to reboot or reset the configuration daemon (vxconfigd -k -r reset) to\nensure proper binding.\n"

PATH=/sbin:/usr/sbin:/usr/bin
RMPARAMS_FILE=/etc/raid/rmparams
LUNLOCKS=`grep -v "^#" $RMPARAMS_FILE | grep System_LunlocksDirPath | cut -d= -f2`
RM_BOOT_HOME=`grep -v "^#" $RMPARAMS_FILE | grep System_RmBootHomeDirectory | cut -d= -f2`

RMDEVROOT=\/`grep -v "^#" $RMPARAMS_FILE | grep "System_AltDevDirRoot" | cut -d= -f2 | awk -F/ '{ ORS = "/"; for (i = NF; i > 1; --i) print $i; ORS = "\n"; print $1 }' | cut -d"/" -f3-32 |  awk -F/ '{ ORS = "/"; for (i = NF; i > 1; --i) print $i; ORS = "\n"; print $1 }'`

LAD=$RM_BOOT_HOME/lad
RDAC_DRIVER_NAME=rdriver

if grep -v "^#" $RMPARAMS_FILE | grep "Rdac_SupportDisabled.*=.*TRUE" >/dev/null 2>&1
then
	RDAC_DISABLED=TRUE
fi

umask 0002
case $1 in
'start')
	if [ -x "/usr/ucb/logger" ]
	then
		LOGGER=/usr/ucb/logger
	elif [ -x "/usr/bin/logger" ]
	then
		LOGGER=/usr/bin/logger
	else
		LOGGER=/bin/echo
	fi

#       get rid of any lurking lun locks and semaphores
	rm $LUNLOCKS 2>/dev/null
	rm /etc/raid/locks/RAID_Module*.lock 2>/dev/null

	grep "^#!noauto_config" /kernel/drv/rdriver.conf >/dev/null 2>&1
	if [ $? -ne 0 ]
	then
		AUTO_CONFIG_ENABLED=TRUE
	fi

#A comment line in RMPARAMS_FILE controls reconfig boot processing
	grep "^#Rdac_NoReconfig" ${RMPARAMS_FILE} >/dev/null 2>&1
	if [ $? -eq 0 ]
	then
		echo "Bypassing RDAC reconfig logic"
		RDAC_NORECONFIG=TRUE
	fi

	if [ -n "${_INIT_RECONFIG}" -a -z "${RDAC_NORECONFIG}" ]
	then
		if [ ! -d $RMDEVROOT/dev ]
		then
			FRESH_INSTALL=TRUE
			echo "Setting up RAID Manager device access ..."
			mkdir $RMDEVROOT > /dev/null 2>&1
			chmod 775 $RMDEVROOT
			chgrp sys $RMDEVROOT
			ln -s /devices $RMDEVROOT/devices
		fi

		mv /kernel/drv/rdriver.conf /tmp/rdriver.conf.orig
		echo name=\"rdriver\" parent=\"pseudo\" instance=0\; >/kernel/drv/rdriver.conf

		# make sure that RMDEVROOT is clean

		( if [ -d $RMDEVROOT/dev/rdsk ]
		then
			cd $RMDEVROOT/dev/rdsk
			/bin/rm * 2>/dev/null
		fi ) &
		( if [ -d $RMDEVROOT/dev/dsk ]
		then
			cd $RMDEVROOT/dev/dsk
			/bin/rm * 2>/dev/null
		fi ) &
		wait
		find /dev/rdsk /dev/dsk -print | cpio -pdum $RMDEVROOT >/dev/null 2>&1
		clean_sd $RMDEVROOT
		clean_rd $RMDEVROOT
		/usr/sbin/disks -r $RMDEVROOT

		if [ ! -n "${RDAC_DISABLED}" ]
		then
			/bin/rm /tmp/sdDeleted.$$ 2>/dev/null
			clean_sd /
		fi
		clean_rd /
	fi

	if [ -n "${RDAC_DISABLED}" ]
	then
		modunload -i `modinfo | grep rdriver | cut -c1-3` 2>/dev/null
		/bin/rm /tmp/rdriver.conf.orig 2>/dev/null
		echo "RDAC support disabled"
		exit
	fi

	#
	# Proceeding with RDAC initialization
	#

	if [ -n "${_INIT_RECONFIG}" -a -z "${RDAC_NORECONFIG}" ]
	then
		# generate new rdnexus.conf

		echo "Re-generating rdnexus.conf file ..."
		$RM_BOOT_HOME/symconf -n >/tmp/rdnexus.conf 2> /dev/null
		SYMCONF_STATUS=$?
		/bin/diff /tmp/rdnexus.conf /kernel/drv/rdnexus.conf >/dev/null 2>/dev/null
		DIFF_STATUS=$?  
		if [ "$SYMCONF_STATUS" != 0 ]
		then
			$LOGGER -p user.err "Warning: rdnexus.conf re-generation failed"
		fi
       		if [ "$SYMCONF_STATUS" = 0 -a -s /tmp/rdnexus.conf -a "$DIFF_STATUS" != 0 ]
		then
			mv /tmp/rdnexus.conf  /kernel/drv/rdnexus.conf
		fi
	fi

	cd /kernel/drv
	modload rdnexus

	if [ -n "${_INIT_RECONFIG}" -a -z "${RDAC_NORECONFIG}" ]
	then
		# generate new rdriver.conf

		if [ -n "${AUTO_CONFIG_ENABLED}" ]
		then
			echo "Re-generating rdriver.conf file ..."
			/bin/rm -r /dev/*RAID_Module* 2>/dev/null
			modload rdriver
			modnum=`modinfo | grep rdriver | cut -c1-3`
			majnum=`modinfo | grep rdriver | cut -c20-23`
			$RM_BOOT_HOME/rdaemon $modnum $majnum -n 2>/dev/null	
			$RM_BOOT_HOME/symconf>/tmp/rdriver.conf 2> /dev/null
			SYMCONF_STATUS=$?
			$RM_BOOT_HOME/symconf -a >/tmp/rdriver.conf.all 2> /dev/null
			SYMCONF_STATUS_2=$?
			/bin/diff /tmp/rdriver.conf /tmp/rdriver.conf.orig >/dev/null 2>/dev/null
			DIFF_STATUS=$?  
			if [ "$SYMCONF_STATUS" != 0 ]
			then
				$LOGGER -p user.err "Warning: rdriver.conf re-generation failed"
			fi
			if [ "$SYMCONF_STATUS_2" = 0 -a -s /tmp/rdriver.conf.all ]
			then
				modunload -i $modnum
				mv /tmp/rdriver.conf.all  /kernel/drv/rdriver.conf
				modload rdriver
				$RM_BOOT_HOME/rdaemon $modnum $majnum -n 2>/dev/null	
				$RM_BOOT_HOME/hide_sd on 2>/dev/null
				/usr/sbin/disks
			fi
	       		if [ "$SYMCONF_STATUS" = 0 -a -s /tmp/rdriver.conf -a "$DIFF_STATUS" != 0 ]
			then
				mv /tmp/rdriver.conf  /kernel/drv/rdriver.conf
				/bin/rm /tmp/rdriver.conf.orig 2>/dev/null
			else
				mv /tmp/rdriver.conf.orig /kernel/drv/rdriver.conf
			fi
			# now ready to re-load the RDAC driver
			modunload -i $modnum
		else
			# auto-config disabled - put original back!
			mv /tmp/rdriver.conf.orig /kernel/drv/rdriver.conf
		fi
	fi
	modload rdriver
	echo "RDAC driver loaded"
#
# start the RDAC daemon
#
        nbr_dmns=`ps -e | /usr/bin/grep rdaemon | /usr/bin/grep -v grep | /usr/bin/wc -l`
#       echo $nbr_dmns
        if test $nbr_dmns -ne 2
	then
		modnum=`modinfo | grep rdriver | cut -c1-3`
		majnum=`modinfo | grep rdriver | cut -c20-23`
		$RM_BOOT_HOME/rdaemon $modnum $majnum
		echo "RDAC daemons initiated" 
	fi

#
# special measure that makes RDAC-controlled "sd" devices invisible to "disks"
# (so that rdriver nodes will take their place)
#
	nluns=`$LAD | awk '{ for (i = 4; i <= NF; i++ ) print $i }' | wc -l`
	sleep_time=`expr $nluns \* 2`
	echo "Waiting for full RDAC initialization ..."
	sleep $sleep_time
	$RM_BOOT_HOME/hide_sd on 2>/dev/null
        VXCONFIGD_ALIVE=`ps -ef | /usr/bin/grep vxconfigd 2>/dev/null | /usr/bin/grep -v grep 2>/dev/null`
	if [ -n "${VXCONFIGD_ALIVE}" ]
	then
		VX_BOOTED=`vxdctl mode 2>/dev/null | grep booted`
		if [ -n "${VX_BOOTED}" -a \( -n "${FRESH_INSTALL}" -o -f /tmp/sdDeleted.$$ \) ]
		then
			echo $WARNING
			sleep 3
		fi
	fi
	/bin/rm /tmp/sdDeleted.$$ 2>/dev/null
	;;

'stop')
# force flush while we still have RDAC protection
	/bin/sync; /bin/sync; /bin/sync
	sleep 3

        nbr_dmns=`ps -e | /usr/bin/grep rdaemon | /usr/bin/grep -v grep | /usr/bin/wc -l`
	if [ $nbr_dmns -eq 2 ]
	then
        	$RM_BOOT_HOME/Signalrdm kill_rdaemon
        	echo "RDAC daemons stopped"
	fi
	;;
*)
	echo "usage: rdacctrl {start|stop}"
	;;
esac
