#!/bin/ksh
#
#pragma ident	"@(#)cvmreconfig.sh 1.13 99/04/12"
#Copyright (C) 1997 Sun Microsystems, Inc.
#

#
# cvmreconfig - Energizer Cluster Reconfiguration Programs for
#		Clustered Volume Manager.
#
# Input:
#		All environment variables like "allnode"/"currnodes"
#		"localnodeid"/"current cmmstep (CURRPSTEP)",
#		VM_IMPORT.
#
# Action:	Run Reconfiguration Programs based on current
#		"cmmstepN"|"cmmabort"|"cmmstart"|"cmmreturn".
#
# Output:	Return 0 if success.
#		Return 1 if failure
#		Return 200 if reconfigurtion program result is to
#		be ignored and no reconfiguration needs to be done
#		for further steps .

# used for logging with unique name and id.
pre="SUNWcluster.reconf.cvm";

set +e;

# Get some common directories if not set by reconf_ener.
RECONF_SCRIPTS=${RECONF_SCRIPTS:-/opt/SUNWcluster/etc/reconf/scripts};
CLUSTERBIN=${CLUSTERBIN:-/opt/SUNWcluster/bin/};
CLUSTERVAR=${CLUSTERVAR:-/var/opt/SUNWcluster/};
CLUSTERETC=${CLUSTERETC:-/etc/opt/SUNWcluster/};
INCLUDE=.;

# common utlities like enmatch/enccdmatch are in reconf_ener.common.
# if the correct unit wants to manage on this it is fine.
# reconf_ener.disks contains failure fencing routines required by 
# other sub-commands also.

${INCLUDE} ${RECONF_SCRIPTS}/reconf_ener.common;
${INCLUDE} ${RECONF_SCRIPTS}/reconf_ener.disks;



cvmabort_cmd()
{
	if [ "${vm}" = "cvm" ]; then
	  /usr/sbin/vxclust $* || return $?;
	  
	  # release all reservations on shared disk groups
	  retval=0;
	  files=`/bin/ls ${CLUSTERVAR}/reserved.disks.*.shared 2>/dev/null || retval=$?`;
	  if [ "${retval}" -eq 0 ]; then
		for filename in ${files}; do
			disks=`cat ${filename} | sort -u`;
			${SSACLI} release ${disks} 1>/dev/null 2>&1 || return 1;
		done;
		/bin/rm -f ${files};
	  fi;
	fi
}

#
#	Return step Command.
#
cvmreturn_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
	fi;
	return 0;
}

#
#	Start Command.
#
cvmstart_cmd()
{
	vmstatus=0;
	mode=`${CLUSTERBIN}/timed_run -q 30 /usr/sbin/vxdctl mode 2>/dev/null`||
		vmstatus=$?;
	[ ${vmstatus} -ne 0 -o -z "${mode}" ] && {
		log_info "$pre.4005" \
			"Could not determine volume configuration daemon mode";
		return 1;
	}

	# vxdctl mode reports whether vxconfigd is running (if so it's mode).
	case ${mode} in
	*not-running*)	# Abort node if Volume manager is not running.
		log_info "$pre.4006" \
			"Volume configuration daemon not running.";
		return 1;
		;;
	esac;

	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
	fi;
	return ${vmstatus};
}

#
#	Step1 Command.
#	-	Release all reservations.
#	-	Invoke vxclust.
#
cvmstep1_cmd()
{
	vmstatus=0;
	if [ "${vm}" = "cvm" ]; then
                # release all reservations for all disk groups - it will
                # be redone later at the end of step4 and later
                retval=0
                files=`/bin/ls ${CLUSTERVAR}/reserved.disks.* 2> /dev/null || retval=$?`
                if [ "${retval}" -eq 0 ]; then
                  for filename in ${files}; do
                    disks=`cat ${filename} | sort -u`
                    ${SSACLI} release ${disks} 1>/dev/null 2>&1 || return 1
                    /bin/rm -f ${filename}
                  done
                fi
		/usr/sbin/vxclust $* || return $?;	
	fi
	return ${vmstatus};
}

#
#	Step2 Command.
#
cvmstep2_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
	fi;

	return 0;
}

#
#	Step3 Command.
#
cvmstep3_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
	fi;

	return 0;
}

#
#	Step4 Command.
#
cvmstep4_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
	fi;

	return 0;
}

#
#	Step5 Command.
#
cvmstep5_cmd()
{
	if [ "${vm}" = "cvm" ]; then
                # We do reservations if necessary. Note that in the case of
                # greater than 4 nodes and Netdisk, the reservations may have
                # no effect at all depending on the cluster membership.
 
                if [[ ( "${numnodes}" -eq 2 && "${currnodes}" = "${localnodeid}" ) ||\
                      ( "${numnodes}" -gt 2 && "${nd}" -eq 1 ) ]]; then
                        sdglist=$(/usr/sbin/vxdg list | grep shared |  awk '{print $1}')
                        failure_fencing reserve shared ${sdglist} || return 1;
                fi
	fi;
	return 0;
}

#
#	Step6 Command.
#
cvmstep6_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		log_info "SUNWcluster.cvm.1025" \
		"cluster volume manager shared access mode enabled";
		name=`/bin/uname -n`;
		case `/usr/sbin/vxdctl -c mode 2>/dev/null` in
		*MASTER*) vm_on_node="master"
			log_info "SUNWcluster.cvm.1010" \
			"- node ${name} vm_on_node is $vm_on_node";;
		*SLAVE*) vm_on_node="slave"
			log_info "SUNWcluster.cvm.1020" \
			"- node ${name} vm_on_node is $vm_on_node";;
		esac;
	fi;
	return 0;
}

#
#	Stop Command.
#
cvmstop_cmd()
{
	if [ "${vm}" = "cvm" ]; then
		/usr/sbin/vxclust $* || return $?;
		# release all reservations on shared disk groups
		retval=0;
		files=`/bin/ls ${CLUSTERVAR}/reserved.disks.*.shared 2>/dev/null || retval=$?`;
		if [ "${retval}" -eq 0 ]; then
		  for filename in ${files}; do
		    disks=`cat ${filename} | sort -u`;
		    ${SSACLI} release ${disks} 1>/dev/null 2>&1 || return 1;
		  done;
		  /bin/rm -f ${files};
		fi;		
	fi;
	return 0;
}

case ${CURRSTEP} in
cmmstart)
	cvmstart_cmd	start	${clustname} ${cdbfile};
	status=$?;;
cmmabort)
	cvmabort_cmd	abort	${clustname} ${cdbfile};
	status=$?;;
cmmreturn)
	cvmreturn_cmd	return	${clustname} ${cdbfile};
	status=$?;;
cmmstep2)
	cvmstep1_cmd	step1	${clustname} ${cdbfile};
	status=$?;;
cmmstep3)
	cvmstep2_cmd	step2	${clustname} ${cdbfile};
	status=$?;;
cmmstep8)
	cvmstep3_cmd	step3	${clustname} ${cdbfile};
	status=$?;;
cmmstep9)
	cvmstep4_cmd	step4	${clustname} ${cdbfile};
	status=$?;;
cmmstep10)
	cvmstep5_cmd	step5	${clustname} ${cdbfile};
	status=$?;;
cmmstep11)
	cvmstep6_cmd	step6	${clustname} ${cdbfile};
	status=$?;;
stopnode)
	cvmstop_cmd	stop	${clustname} ${cdbfile};
	status=$?;;
*)
	status=2;;
esac;

exit ${status};
