#!/sbin/sh

#pragma ident "@(#)pdbogms	1.2   97/10/14 SMI"

#
# 	Copyright (C) 1994 Sun Microsystems, Inc.
#

#
# pdbogms - 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.pdbogms"

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}`
	admindir=${myvar}/admindir
	logfile=${myvar}/pdbadmin.log
	udlm=`${mybin}/appmatch ${pdbapps} ${OPS}`
}

usage() {
	echo ""
	echo "Usage: ${prog} start {clustername}"
	echo "       ${prog} stop  {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)
}

start_ogms() {
	if [ ! -f ${ISRUNNINGFLAG} ]; then
		echo "This node is not currently running."
		exit 1
	fi
	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|pdbogms' | \
					/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`
				((/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=90
					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
						log_info "$pre.1019" "${clustname} Oracle GMS failed to start, try starting manually"
						exit 1
					fi
				fi
			fi
		fi
	fi
}

stop_ogms() {
	if [ ! -f ${ISRUNNINGFLAG} ]; then
		echo "This node is not currently running."
		exit 1
	fi
        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|pdbogms' | \
					/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.1017" \
					"${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

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

exit 0
