#! /usr/bin/ksh
#
# ident "@(#)oracle_server_monitor_stop.ksh 1.6     99/11/02 SMI"
#
# Copyright (c) 1999 by Sun Microsystems, Inc.
# All rights reserved.
#
# HA-Oracle MONITOR_STOP method
# 
# Parameters passed:  -R <resource name> -T <type> -G <group>
#
#! /usr/bin/ksh
#
# ident "@(#)dbms_lib.ksh 1.14     00/06/29 SMI"
#
# Copyright (c) 1999-2000 by Sun Microsystems, Inc.
# All rights reserved.
#
############################################################ 
#
# DBMS library
#
############################################################ 

set -ufp
MYDIR=`/bin/dirname $0`
BINDIR=`/bin/dirname $0`
ETCDIR="$BINDIR/../etc"
DEBUG_LEVEL=-1
unset PATH
export PATH="/bin:/usr/cluster/bin"
DEBUG_LOGFILE=""
DEBUG_LOG_SIZE=300000
ARGUMENTS="$0 ${@:-""}"
RESOURCE_NAME=""
RESOURCE_TYPE=""
RESOURCE_GROUP=""
SCLOGGER=/usr/cluster/lib/sc/scds_syslog

TRAPSIGNALS="TERM KILL"
trap "trap - $TRAPSIGNALS; /usr/bin/pkill -g $$;exit 1" $TRAPSIGNALS


#############################################################
# syslog_tag
#
#	prints syslog_tag as SC[pkg.method]: GROUP:RESOURCE
#
#############################################################
syslog_tag()
{
	print "SC[${pkg:-??}.${method:-??}]:${RESOURCE_GROUP:-??}:${RESOURCE_NAME:-??}" 
}

#############################################################
#  scds_syslog <priority> <formattext> <parameters> 
#############################################################

scds_syslog()
{
typeset priority=""
typeset msg_format=""
typeset tag=""
typeset msg

	$SCLOGGER "$@" & 

	while getopts :p:t:m: opt
	do
  	case $opt in
		p)      priority="$OPTARG";;
		t)      tag="$OPTARG";;
		m)      msg_format="$OPTARG";;
		*)	;;
  	esac
	done

	shift `expr $OPTIND - 1`

	msg=$(/usr/bin/printf "${msg_format}" ${@:-} )

	[ -z "${TRACE_INIT:-""}" ] && init_trace

	[ "${DEBUG_LOGFILE}"  != "/dev/console" ] && \
	    print -r -- "$(date '+%b %d %T') $tag: $msg" >> $DEBUG_LOGFILE
}

#############################################################
#  write_trace <text> <parameters> 
#   Other information: TAG format 
#############################################################

write_trace()
{
typeset msg_text=${1:-""}
typeset msg

shift

	msg=$(/usr/bin/printf "${msg_text}" ${@:-} )
	[ -z "${TRACE_INIT:-""}" ] && init_trace
	[ "${DEBUG_LOGFILE}"  != "/dev/console" ] && \
	    print -r -- "$(date '+%b %d %T') $(syslog_tag): $msg" >> $DEBUG_LOGFILE
}

#############################################################
#  read_arguments()
#  
#  Set Globals variables:
#     RESOURCE_NAME, RESOURCE_TYPE RESOURCE_GROUP
#
#############################################################
read_arguments()
{

typeset rc=0
typeset invalid_option=""
typeset save_opt=""
typeset save_optarg=""

while getopts :R:T:G: opt
do
  case $opt in
       R)      	RESOURCE_NAME="$OPTARG";;
       T)      	RESOURCE_TYPE="$OPTARG";;
       G)      	RESOURCE_GROUP="$OPTARG";;
       *)      	invalid_option="YES"; 
		save_opt="$opt"
		save_optarg="$OPTARG"
		 ;;
  esac
done

	if [ -z "$RESOURCE_NAME" \
		-o -z "$RESOURCE_TYPE" \
		-o -z "$RESOURCE_GROUP"  \
		-o -n "$invalid_option" ]; then

		scds_syslog -p error -t $(syslog_tag) -m \
	 		"Initialization failed. Invalid command line  %s %s" \
			"$save_optarg" "$save_opt"
		rc=1;
	fi
	
	return $rc

}

#############################################################
# check_resource_setup
#
#############################################################
check_resource_setup()
{
        if [ -z "$RESOURCE_NAME" \
                -o -z "$RESOURCE_TYPE" \
                -o -z "$RESOURCE_GROUP" ]; then
		return 1
	else
		return 0
	fi
}


#############################################################
# error_exit()
#
#############################################################
error_exit()
{
  typeset exit_code="${1:-0}"
  exit $exit_code
}

#############################################################
# extract_property_value()
#
#  For extended properties, API returns data type followed by value
#  This function discards first line (data type) and prints 
#	remaining lines.
#
#############################################################
extract_property_value()
{
	typeset type
	typeset value
	typeset rc=0
	
	read type 
	rc=$?
	[ $rc -ne 0 ] && return $rc

	while read value
	do
		print $value
	done
		
	rc=$?
	return $rc
}

#############################################################
# read_property_value()
#
#############################################################
read_property_value()
{

typeset api_command
typeset rc
typeset log_flag="YES"
typeset option_tag
typeset extension=""

	case "$1" in
		R_description| \
		Type| \
		On_off_switch| \
		Monitored_switch| \
		Resource_state| \
		Cheap_probe_interval| \
		Thorough_probe_interval| \
		Retry_count| \
		Retry_interval| \
		Failover_mode| \
		Resource_dependencies| \
		Resource_dependencies_weak| \
		Logical_hostnames_used| \
		Status| \
		START_TIMEOUT| \
		STOP_TIMEOUT| \
		PRIMARIES_CHANGED_TIMEOUT | \
		VALIDATE_TIMEOUT| \
		UPDATE_TIMEOUT| \
		INIT_TIMEOUT| \
		FINI_TIMEOUT| \
		BOOT_TIMEOUT| \
		MONITOR_START_TIMEOUT| \
		MONITOR_STOP_TIMEOUT| \
		MONITOR_CHECK_TIMEOUT| \
		Status_Node| \
		Resource_state_Node)
		option_tag="$1"
		extension=""
		;;
	DEBUG_LOGFILE| \
	DEBUG_LOG_SIZE| \
	DEBUG_LEVEL) 
		log_flag=""
		option_tag="Extension"
		extension="$*"
		;;
	*)
		option_tag="Extension"
		extension="$*"
		;;
	esac

	if [ -z "$extension" ]; then
		scha_resource_get -O $option_tag \
	 	-R "$RESOURCE_NAME" -G "$RESOURCE_GROUP"
	else
		scha_resource_get -O $option_tag \
		 -R "$RESOURCE_NAME" -G "$RESOURCE_GROUP" $extension \
		| extract_property_value
	fi

	rc=$?
	if [ $rc -ne 0 ]; then
                if [ "$log_flag" == "YES" ]; then
			scds_syslog -p error -t $(syslog_tag) -m \
                	    "Error (%s) when reading property %s." "$rc" "$1" 
		fi
	fi	
	return $rc
}

#############################################################
# check_user_env
#
#############################################################
check_user_env()
{
	typeset rc=0

        if [ -z "${USER_ENV:-""}" ]; then
		return $rc
	fi

	if [ ! -a "$USER_ENV" ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
	 	    "file specified in USER_ENV parameter %s does not exist" \
		    $USER_ENV
		rc=1
        fi
	return $rc
}

#############################################################
# set_user_env
#
#############################################################
set_user_env()
{
        typeset param
        typeset val
	typeset aa_line

        [ -z "${USER_ENV:-""}" ] && return 0

	check_user_env || return $rc

        while read aa_line
        do
        	[ -z ${aa_line:-""} ] && continue

		if [[ "$aa_line" == \#* ]]; then
		  continue
		fi

        	val="${aa_line##*=}"
        	param="${aa_line%%=*}"
        	eval ${param}=\"${val}\"
		export $param
                TRACE_MESSAGE="Setting environment variable: %s=%s"
		write_trace "${TRACE_MESSAGE}" "${param}" "${val}"
	done < $USER_ENV

}

#############################################################
# init_trace()
#
#############################################################
init_trace()
{
	typeset debugdir

        [ ${DEBUG_LEVEL} -eq -1 ] && DEBUG_LEVEL=$(read_property_value DEBUG_LEVEL)

	[ -z "${DEBUG_LEVEL}" ] && DEBUG_LEVEL=0

	TRACE_INIT="done"

	if [ -z "${DEBUG_LOGFILE}" ]; then
		DEBUG_LOGFILE="/dev/console"
		return
	fi

	debugdir=$(/bin/dirname "${DEBUG_LOGFILE}") 

	[ -n "$debugdir" ] && /bin/mkdir -p "$debugdir"

	if [[ "$DEBUG_LOGFILE" == *\. ]];then
   		DEBUG_LOGFILE="${DEBUG_LOGFILE}${RESOURCE_NAME:-""}"
	fi

	[ -z "$DEBUG_LOG_SIZE" ] && DEBUG_LOG_SIZE=300000 

	touch $DEBUG_LOGFILE 2> /dev/null

       	exec 2>> $DEBUG_LOGFILE

	rotate_log 
}

#############################################################
# rotate_log()
#
#############################################################
rotate_log()
{
        typeset log_size=0

	[ ! -f "$DEBUG_LOGFILE" ] && return
	( 
        log_size=$(/bin/ls -l "$DEBUG_LOGFILE" | /bin/awk '{print $5}')
        [ $log_size -lt $DEBUG_LOG_SIZE ] && return

        [ -f ${DEBUG_LOGFILE}.1 ] &&  /bin/rm -f "${DEBUG_LOGFILE}.1"
        [ -f ${DEBUG_LOGFILE}.0 ] && /bin/mv ${DEBUG_LOGFILE}.0 ${DEBUG_LOGFILE}.1
        /bin/mv "${DEBUG_LOGFILE}" "${DEBUG_LOGFILE}.0"
        /bin/touch "${DEBUG_LOGFILE}"
	) &
}

#############################################################
# set_status
#   Sets resource status
#	Parameter 1: <status> (not validated)
#		 OK,  DEGRADED,  FAULTED, UNKNOWN, or OFFLINE. 
#	Parameter 2: <message> (optional)
#############################################################
set_status()
{
	typeset rstatus="${1:-UNKNOWN}"
	typeset rmsg=${2:-""}
	typeset prev_status

	prev_status=$(read_property_value Status)

	# WARNING: Assumption here is that all previous scha_resource_setstatus
	# commands did NOT use the -m option. If it was ever used, more
	# parsing of prev_status is required here
	
	if [ "$prev_status" = "$rstatus" ]; then
		return 0
	fi

	if [ -n "${rmsg}" ]; then
		scha_resource_setstatus -s $rstatus -m "$rmsg" \
			-R $RESOURCE_NAME -G $RESOURCE_GROUP
	else
		scha_resource_setstatus -s $rstatus \
			-R $RESOURCE_NAME -G $RESOURCE_GROUP
	fi
}

#include_dbms_lib
#
#! /usr/bin/ksh
#
# ident "@(#)oracle_server_lib.ksh 1.12     01/09/14 SMI"
#
# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
# All rights reserved.
#
#
# HA-Oracle Library routines
# 
#
#
initialize()
{

	#
	# uncomment to turn on tracing in all functions
	# typeset -ft $(typeset +f)
	#
	
	pkg=SUNWscor.oracle_server

	DEBUG_LOGFILE="/var/opt/SUNWscor/oracle_server/message_log."

	DEFAULT_ACTION_FILE=${ETCDIR}/oracle_server_monitor_action

	ONLINE_CHECK_CONFIG_FILE=${ETCDIR}/oracle_server_online_check
        
	SUPPORT_FILE=${ETCDIR}/oracle_server_support

	DEBUG_LOG_SIZE=300000

	MONITOR_RETRY_COUNT=1

	MONITOR_RETRY_INTERVAL=5

	MONITOR_TAG_PREFIX=ORASERV_MON

	MONITOR_DELAY=0

}

#############################################################
#
#############################################################
server_running()
{
 typeset running
	running=$(/bin/ps -u $ORACLE_OWNER -o comm | \
			/bin/grep -w ora_pmon_${ORACLE_SID})
                        
	if [ -n "$running" ]; then
		return 0
	fi

	return 1
}


#############################################################
#
#############################################################
read_parameters()
{
	ORACLE_HOME=$(read_property_value ORACLE_HOME)

	ORACLE_SID=$(read_property_value ORACLE_SID)

	WAIT_FOR_ONLINE=$(read_property_value WAIT_FOR_ONLINE) 

	PARAMETER_FILE=$(read_property_value PARAMETER_FILE)
 
	USER_ENV=$(read_property_value USER_ENV) 

	STOP_TIMEOUT=$(read_property_value STOP_TIMEOUT)
	[ -z "$STOP_TIMEOUT" ] && STOP_TIMEOUT=300 

	START_TIMEOUT=$(read_property_value START_TIMEOUT)
	[ -z "$START_TIMEOUT" ] && START_TIMEOUT=300
}


#############################################################
#
#############################################################
validate_parameters()
{
	if [ ! -d "$ORACLE_HOME" ]; then
		scds_syslog -p error -t "$(syslog_tag)" -m \
		    "Validation failed. ORACLE_HOME %s does not exist" \
		    $ORACLE_HOME
		return 1
	fi

	if [ ! -f "$ORACLE_HOME/bin/oracle" ]; then
		scds_syslog -p error -t "$(syslog_tag)" -m \
		    "Validation failed. ORACLE binaries not found ORACLE_HOME=%s" \
		    $ORACLE_HOME
		return 1
	fi

	if [ ! -f "$ORACLE_HOME/bin/sqlplus" ]; then
		scds_syslog -p error -t "$(syslog_tag)" -m \
		    "Validation failed. ORACLE_HOME/bin/sqlplus not found ORACLE_HOME=%s" \
		    $ORACLE_HOME
		return 1
	fi

	if [ -z "$ORACLE_SID" ]; then
		scds_syslog -p error -t "$(syslog_tag)" -m \
		    "Validation failed. ORACLE_SID is not set"
		return 1
	fi

}

#############################################################
#
#############################################################
export_env()
{
	LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/cluster/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
	LD_LIBRARY_PATH_64=${ORACLE_HOME}/lib64:/usr/cluster/lib/sparcv9${LD_LIBRARY_PATH_64:+:$LD_LIBRARY_PATH}
	export ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PARAMETER_FILE USER_ENV
	export LD_LIBRARY_PATH_64
}


#############################################################
#
#############################################################
monitor_setup()
{
	typeset history_dir="/var/opt/SUNWscor/oracle_server"
	typeset history_file="${history_dir}/restart_history.${RESOURCE_NAME}"


	[ ! -d "${history_dir}" ] && /bin/mkdir -p "${history_dir}"
	[ ! -f "${history_file}" ] && /bin/touch "${history_file}"

	if [ ! -f "$SUPPORT_FILE" ]; then	
		scds_syslog -p error -t "$(syslog_tag)" -m \
		    "Setup error. SUPPORT_FILE %s does not exist" \
		    "$SUPPORT_FILE"
		return 1
	fi

	MONITOR_TAG="${MONITOR_TAG_PREFIX}_${RESOURCE_NAME}"

	return 0

}	
#############################################################
#  Check if fault monitor is running
#############################################################
monitor_running()
{
	typeset rc
	pmfadm -q $MONITOR_TAG
	rc=$?

	return $rc 
}

#############################################################
#  read_support_file
#  
#   Input: 
#	Parameter 1: key in support file.
#		Deault value is "default"
#
#   Output:
#	prints out fault monitor name matching with the key
#	Only first match is printed
#
#   Return codes: 
#	0 - Success
#	1 - Failure
#	
#############################################################
read_support_file()
{
	typeset rc
	typeset support_line
	typeset match="default"
#	typeset monitor

	monitor=""

	[ -n "${1:-""}" ] && match="$1"

        /bin/grep -v "^#" ${SUPPORT_FILE} | \
        while read support_line ; do
	    set $support_line
	    [ $# -lt 2 ] && continue

            if [ "$1" == "$match" ] ; then
		monitor="$2"

		# support file contains monitor program name.
		# append monitor program name to bin directory
		# to get full file name (including path)
	
		monitor="$BINDIR/$monitor"
		if [  -d $monitor -o  ! -x $monitor ]; then
			scds_syslog -p error -t "$(syslog_tag)" -m \
 			    "Fault monitor does not exist or is not executable : %s" \
        		    $monitor
			return 1
		fi

		print "$monitor"
		return 0
            fi
        done

	scds_syslog -p error -t "$(syslog_tag)" -m \
 	    "Internal Error. Unable to get fault monitor name"

        return 1;
}

#############################################################
#  get_monitor_name
#  
#   Input: 
#		none
#
#   Output:
#	prints out fault monitor name 
#	(as printed by read_support_file)
#
#   Return codes: 
#	(as returned by read_support_file)
#	0 - Success
#	1 - Failure
# 
#   Assumptions:
#	$ORACLE_HOME is set and validated
# 
#   This function decides which support file key is to be used
#   to retrieve fault monitor name. At this time fault monitors
#   are selected based on 32 bit or 64 bit architecture. 
#   In case version dependent + architecture dependent fault monitors
#   are to be selected, selection can be done in this function.
#	
#############################################################
get_monitor_name()
{
	typeset rc
        typeset architecture
        typeset monitor_name

        architecture="`LC_MESSAGES=C /bin/file ${ORACLE_HOME}/bin/oracle | \
                /bin/awk '/(32|64)-/ {print substr($3,0,2);}'`"


	read_support_file "default${architecture}"
}
#include_oracle_lib
#
method="monitor_stop"


#############################################################
#
#############################################################
stop_monitor()
{
	typeset rc
	monitor_running 
	rc=$?
	if [ $rc -ne 0 ]; then
		write_trace "Fault monitor not running (%d)" "$rc"
 		return 0
	fi

	scds_syslog -p info -t $(syslog_tag) -m \
	"Stopping fault monitor using pmfadm tag %s" \
        "$MONITOR_TAG"

	pmfadm -s "$MONITOR_TAG"

	pmfadm -k "$MONITOR_TAG"

	rc=$?
	if [ $rc -ne 0 ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
		    "Stop fault monitor using pmfadm failed. tag %s error=%s" \
        	    "$MONITOR_TAG" "$rc"
	fi

	return $rc 
}

#############################################################
#
#############################################################
main()
{
	initialize

	read_arguments "${@:-}" || error_exit $?

	monitor_setup

	stop_monitor || error_exit $?

	exit 0
 	
}

main "${@:-}"


