#!/sbin/sh
#
#pragma ident     "@(#)scogms.sh 1.2 00/10/30"
#Copyright (C) 1997 Sun Microsystems, Inc.
#

#
# scogms - Sun Cluster Oracle GMS interface program
#

set -e				# exit shell script on error

PATH=/usr/sbin:/usr/bin
export PATH
LD_LIBRARY_PATH=/opt/SUNWcluster/lib
export LD_LIBRARY_PATH
pre="SUNWcluster.scogms"

init () {
	# OPS = bit 0
	OPS=0

	PATH=${PATH}:${mybin}
	export PATH

	cdbfile=${myetc}/conf/${clustname}.cdb
	cdbfilter=${myetc}/conf/cdb.filter
	tmpdir=`${mybin}/cdbmatch env.tmpdir ${cdbfile}`
	if [ -z "$tmpdir" ]; then tmpdir=${myvar}; fi
	if [ ! -d $tmpdir ]; then mkdir -p $tmpdir; fi
	ISRUNNINGFLAG=${tmpdir}/cluster_is_running

	pdbapps=`${mybin}/cdbmatch cluster.pdbapps ${cdbfile}`
	logfile=${myvar}/scadmin.log
	udlm=`${mybin}/appmatch ${pdbapps} ${OPS}`
}

usage() {
	echo ""
	echo "Usage: ${prog} start {clustername}"
	echo "       ${prog} stop  {clustername}"
	echo "       ${prog} start_pmf {clustername}"
	echo "       ${prog} stop_pmf  {clustername}"
	echo "       ${prog} <ogmsctl command> {clustername}"
	echo ""
	exit 1
}

# lookup a value in the pdb configuration file
enmatch() {
	${mybin}/cdbmatch $* ${cdbfile} || (echo "cdbmatch $* ${cdbfile} failed" 1>&2; exit 1)
}

stop_pmf() {
        if [ -x ${mybin}/ogmsctl -a -x ${mybin}/ogms -a -x ${mybin}/pmfadm ]; then
		set +e
		${mybin}/pmfadm -q oracle.gms ; retval=$?
		set -e
		if [ $retval -eq 0 ]; then
			${mybin}/pmfadm -s oracle.gms
			set +e
			${mybin}/pmfadm -q oracle.gms ; retval=$?
			set -e
			if [ $retval -eq 0 ]; then
				sleep 1
			fi
		fi
		stop_ogms
	fi
}

start_pmf() {
        if [ -x ${mybin}/ogmsctl -a -x ${mybin}/ogms -a -x ${mybin}/pmfadm ]; then
		if [ `/bin/ps -u 0 | /bin/grep ogms | /bin/egrep -v 'grep|scogms|ogmsrec' | /bin/wc -l` -ne 0 ]; then
			log_info "$pre.1017" "${clustname} Oracle GMS already running"
		else
			((${mybin}/lktest > /dev/null 2>&1) || echo $? > ${myvar}/lktest.out)
			if [ -s ${myvar}/lktest.out ]; then
				/bin/rm -f ${myvar}/lktest.out
				log_info "$pre.4072" "${clustname} Oracle DLM inoperable, GMS cannot start, check cluster state."
				exit 1
			fi
			set +e
			${mybin}/pmfadm -q oracle.gms ; retval=$?
			set -e
			if [ $retval -ne 0 ]; then
				(${mybin}/pmfadm -c oracle.gms -n -1 -a "${mybin}/scogms start ${clustname}" ${mybin}/scogms start ${clustname})
			fi
		fi
	fi
}

start_ogms() {
	if [ ${udlm} -eq 1 ]; then
		if [ -x ${mybin}/ogmsctl -a -x ${mybin}/ogms ]; then
			if [ `/bin/ps -u 0 | /bin/grep ogms | /bin/egrep -v 'grep|scogms|ogmsrec' | /bin/wc -l` -ne 0 ]; then
				log_info "$pre.1017" "${clustname} Oracle GMS already running"
			else
				log_info "$pre.1015" "${clustname} Starting Oracle GMS"
				ORACLE_HOME=/opt/SUNWcluster
				OGMS_HOME=${myvar}/ogms_`/bin/hostname`
				export ORACLE_HOME
				export OGMS_HOME
				if [ -d /tmp/.ogms ]; then
					/bin/rm -rf /tmp/.ogms
				fi
				((${mybin}/lktest > /dev/null 2>&1) || echo $? > ${myvar}/lktest.out)
				if [ -s ${myvar}/lktest.out ]; then
					/bin/rm -f ${myvar}/lktest.out
					log_info "$pre.4072" "${clustname} Oracle DLM inoperable, GMS cannot start, check cluster state."
					exit 1
				fi
				ogmscls=`enmatch udlm.schedclass`
				udlmpri=`enmatch udlm.schedpriority`
				ogmspri=`expr $udlmpri + 1`
				if [ "${ogmscls}" = "TS" ]; then
					CONF_FILE=/etc/opt/SUNWcluster/conf/dflt_sched_class
					if [ -f ${CONF_FILE} ] ; then
					        ogmscls=`cat ${CONF_FILE}`
					fi

				fi
				((/usr/bin/priocntl -c ${ogmscls} -p ${ogmspri} -e ${mybin}/ogmsctl start > /dev/null 2>&1) || echo $? >> ${myvar}/ogmsctl.out)
				if [ -s ${myvar}/ogmsctl.out ]; then
					/bin/rm -f ${myvar}/ogmsctl.out
					ogms_retry=0
					ogms_retry_intvl=2
					ogms_max_retries=1
					ogms_up=255
					while [ "${ogms_up}" -ne "" -a ${ogms_retry} -lt ${ogms_max_retries} ]; do
						ogms_up=`((${mybin}/ogmsctl status > /dev/null 2>&1) || echo $?)`
						if [ "${ogms_up}" -eq "" ]; then
							echo "OGMS up"
							break;
						fi
						log_info "$pre.1018" "${clustname} Oracle GMS not up yet, polling"
						ogms_retry=`expr $ogms_retry + 1`
						echo "OGMS down \"$ogms_up\", retry ${ogms_retry}"
						sleep ${ogms_retry_intvl}
					done
					if [ "${ogms_up}" -ne "" ]; then
						set +e
						${mybin}/pmfadm -q oracle.gms ; retval=$?
						set -e
						if [ $retval -ne 0 ]; then
							log_info "$pre.1019" "${clustname} Oracle GMS failed to start, try starting manually"
						fi
						exit 1
					fi
				fi
			fi
		fi
	fi
}

stop_ogms() {
        if [ ${udlm} -eq 1 ]; then
                if [ -x ${mybin}/ogmsctl -a -x ${mybin}/ogms ]
                then
			if [ `/bin/ps -u 0 | /bin/grep ogms | /bin/egrep -v 'grep|scogms|ogmsrec' | /bin/wc -l` -ne 0 ]; then
				log_info "$pre.2015" "${clustname} Stopping Oracle GMS"
				ORACLE_HOME=/opt/SUNWcluster
				OGMS_HOME=${myvar}/ogms_`/bin/hostname`
				export ORACLE_HOME
				export OGMS_HOME
				((${mybin}/ogmsctl abort > /dev/null 2>&1) || echo $? >> ${myvar}/ogmsctl.abort)
			else
				log_info "$pre.1016" "${clustname} Oracle GMS not running"
			fi
                fi
        fi
}

other_cmd() {
        if [ ${udlm} -eq 1 ]; then
                if [ -x ${mybin}/ogmsctl -a -x ${mybin}/ogms ]
                then
			ORACLE_HOME=/opt/SUNWcluster
			OGMS_HOME=${myvar}/ogms_`/bin/hostname`
			export ORACLE_HOME
			export OGMS_HOME
			${mybin}/ogmsctl ${cmd}
		fi
	fi
}

################################################################################

prog=$0
cmd=$1
clustname=$2
mybin=/opt/SUNWcluster/bin
myetc=/etc/opt/SUNWcluster
myvar=/var/opt/SUNWcluster

if [ -z "${cmd}" ]; then
        echo "Error, missing command."
        usage
        exit 1
fi

if [ -z "$clustname" ]; then
        if [ -f ${myetc}/conf/default_clustername ]; then
                clustname=`cat ${myetc}/conf/default_clustername`
                echo "Assuming a default cluster name of ${clustname}"
        else
                usage
		exit 1
        fi
fi

init

if [ "${cmd}" -eq "start" -o "${cmd}" -eq "start_pmf" ]; then
	if [ ! -f ${ISRUNNINGFLAG} ]; then
		echo "This node is not currently running."
		exit 1
	fi
fi

case ${cmd} in
	start_pmf)	start_pmf  1>>${logfile} 2>&1 ;;
	stop_pmf)	stop_pmf   1>>${logfile} 2>&1 ;;
	start)		start_ogms 1>>${logfile} 2>&1 ;;
	stop)		stop_ogms  1>>${logfile} 2>&1 ;;
	*)		other_cmd  ;;
esac

exit 0
