#! /usr/bin/ksh
#
# ident "@(#)oracle_listener_validate.ksh 1.13     05/01/07 SMI"
#
# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# VALIDATE method
# 
# Parameters passed:  -R <resource name> -T <type> -G <group>
#
#
#! /usr/bin/ksh
#
# ident "@(#)dbms_lib.ksh 1.26     04/06/07 SMI"
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
############################################################ 
#
# 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=""
RESOURCE_PROJECT_NAME=""
RG_PROJECT_NAME=""
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:-??}" 
	return 0
}

#############################################################
#  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

	return 0
}

#############################################################
#  write_stderr <formattext> <parameters> 
#
#  This functions writes output to stderr
#  Expected usage is from validate method.
#  
#############################################################

write_stderr()
{
	typeset msg_format=${1:-""}
	typeset msg

	shift

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

    	print -r -u2 -- "$msg" 

	return 0
}



#############################################################
#  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

	return 0
}

#############################################################
#  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_extension_property_value()
# 
# This function reads extension property values
#
# Parameter 1: <property name>
# Parameter 2: log_flag  (optional)
#	"NOLOG" -> Don't log syslog message
#	any other value -> log message
#	Default "YES"
#
#############################################################
read_extension_property_value()
{

	typeset rc
	typeset property="${1:-""}"
	typeset log_flag="${2:-"YES"}"

	scha_resource_get -O Extension \
		 -R "$RESOURCE_NAME" -G "$RESOURCE_GROUP" "$property" \
		| extract_property_value

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

#############################################################
# read_standard_property_value()
#
# This function reads property values of standard resource properties
#
# Parameter 1: <property name> required
# Parameter 2: log_flag  (optional)
#	"NOLOG" -> Don't log syslog message
#	any other value -> log message
#	Default "YES"
#
#############################################################
read_standard_property_value()
{
	typeset rc=0

	typeset property="${1:-""}"
	typeset log_flag="${2:-"YES"}"
	
	scha_resource_get -O "$property" \
	 	-R "$RESOURCE_NAME" -G "$RESOURCE_GROUP"

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

#############################################################
# read_standard_rg_property_value()
#
# This function reads property values of standard resource group
# properties
#
# Parameter 1: <property name> required
# Parameter 2: log_flag  (optional)
#	"NOLOG" -> Don't log syslog message
#	any other value -> log message
#	Default "YES"
#
#############################################################
read_standard_rg_property_value()
{
	typeset rc=0

	typeset property="${1:-""}"
	typeset log_flag="${2:-"YES"}"
	
	scha_resourcegroup_get -O "$property" -G "$RESOURCE_GROUP"

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


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

	OS_RELEASE=`/usr/bin/uname -r`
	if [ "$OS_RELEASE" = "5.8" ]; then
		return $rc
	fi

	RESOURCE_PROJECT_NAME=$(read_standard_property_value RESOURCE_PROJECT_NAME)

	if [ -z "$RESOURCE_PROJECT_NAME" ]; then
		RESOURCE_PROJECT_NAME=$(read_standard_rg_property_value RG_PROJECT_NAME)
		rc=$?
	fi

	return $rc
}


#############################################################
# This function validates the resource project name.
#
# Parameter 1: <username> required
#
#############################################################
validate_resource_project_name()
{
	typeset PROJMEM=0
	typeset rc=0
	typeset USER="${1}"
	TASK_CMD=""

	if [ -z "$USER" ]; then
		# Internal usage error.
		return 1
	fi

	OS_RELEASE=`/usr/bin/uname -r`
	if [ "$OS_RELEASE" = "5.8" ]; then
		return 0
	fi

	if [ -n "$RESOURCE_PROJECT_NAME" ]; then
		PROJMEM=`/usr/bin/projects $USER | /usr/bin/grep -w $RESOURCE_PROJECT_NAME | /usr/bin/wc -l`
	else
		if [ -n "$RG_PROJECT_NAME" ]; then
			RESOURCE_PROJECT_NAME=$RG_PROJECT_NAME
			PROJMEM=`/usr/bin/projects $USER | /usr/bin/grep -w $RESOURCE_PROJECT_NAME | /usr/bin/wc -l`
		fi
	fi

	if [ -n "$RESOURCE_PROJECT_NAME" ]; then
		if [ $PROJMEM -eq 0 ]; then
			scds_syslog -p error -t "$(syslog_tag)" -m \
		    	"Validation failed. User %s does not belong to the project %s." \
		     	$USER $RESOURCE_PROJECT_NAME
			write_stderr "$(gettext "Validation failed. User %s does not belong to the project %s.")"  \
		     	$USER $RESOURCE_PROJECT_NAME
			rc=1	
		else
			TASK_CMD="/usr/bin/newtask -p $RESOURCE_PROJECT_NAME"
		fi
	fi

	return $rc
}


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

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

	if [ ! -f "$USER_ENV" ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
	 	    "file specified in USER_ENV parameter %s does not exist" \
		    $USER_ENV

		write_stderr "$(gettext "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 val1
	typeset aa_line

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

	# Following flag will be set to "NO" in *server_manage methods.
        syslog_flag="${syslog_flag:-"YES"}"

	check_user_env || return $?

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

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

                # Now ensure that the line read is of the form
                # VARIABLE=VALUE

                if [[ "$aa_line" != *\=* ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                        	scds_syslog -p warning -t $(syslog_tag) -m \
				    "Incorrect syntax in the environment file %s. Ignoring %s"\
				    "${USER_ENV}" "${aa_line}"
			fi
                        
			write_stderr "$(gettext "Incorrect syntax in the environment file %s. Ignoring %s")" \
                            "${USER_ENV}" "${aa_line}"
                        continue
                fi

        	val="${aa_line#*=}"
        	param="${aa_line%%=*}"


		if [[ "$val" == *\"* ]]; then
			if [[ "$val" != \"*\" ]]; then
				if [ "$syslog_flag" = "YES" ]; then
                        		scds_syslog -p warning \
					    -t $(syslog_tag) -m \
					    "Ignoring string with misplaced quotes in the entry for %s" \
					    "${param}"
				fi

				write_stderr "$(gettext "Ignoring string with misplaced quotes in the entry for %s")" \
				"${param}"
				continue
			else
				#
				# Strip any double quotes around the value
				#
					val1="${val#*\"}"
					val="${val1%\"}"
			fi
		fi


		if [[ "$val" == *\'* ]]; then
			if [[ "$val" != \'*\' ]]; then
				if [ "$syslog_flag" = "YES" ]; then
                        		scds_syslog -p warning \
					    -t $(syslog_tag) -m \
					    "Ignoring string with misplaced quotes in the entry for %s" \
					    "${param}"
				fi

				write_stderr "$(gettext "Ignoring string with misplaced quotes in the entry for %s")" \
				"${param}"
				continue
			else
				#
				# Strip any single quotes around the value
				#
				val1="${val#*\'}"
				val="${val1%\'}"
			fi
		fi


		if [[ "$val" == *\"* || "$val" == *\'* ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                       		scds_syslog -p warning \
				    -t $(syslog_tag) -m \
				    "Ignoring string with misplaced quotes in the entry for %s" \
				    "${param}"
			fi

			write_stderr "$(gettext "Ignoring string with misplaced quotes in the entry for %s")" \
			"${param}"
			continue
		fi


		#
		# Do not allow Environment_file to override PATH
		#

		if [[ "$param" == "PATH" ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                        	scds_syslog -p warning -t $(syslog_tag) -m \
				    "Ignoring PATH set in environment file %s" \
				    "${USER_ENV}"
			fi

			write_stderr "$(gettext "Ignoring PATH set in environment file %s")" \
				"${USER_ENV}"
			continue
		fi


		#
		# Do not allow Environment_file to override ORACLE_HOME
		# or ORACLE_SID
		#

		if [[ "$param" == "ORACLE_HOME" ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                        	scds_syslog -p warning -t $(syslog_tag) -m \
				    "Ignoring ORACLE_HOME set in environment file %s" \
				    "${USER_ENV}"
			fi

			write_stderr "$(gettext "Ignoring ORACLE_HOME set in environment file %s")" \
				"${USER_ENV}"
			continue
		fi
		if [[ "$param" == "ORACLE_SID" ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                        	scds_syslog -p warning -t $(syslog_tag) -m \
				    "Ignoring ORACLE_SID set in environment file %s" \
				    "${USER_ENV}"
			fi

			write_stderr "$(gettext "Ignoring ORACLE_SID set in environment file %s")" \
				"${USER_ENV}"
			continue
		fi


		# Ensure that Variable is a valid KSH variable

		if [[ "$param" != @([A-Z]|[a-z]|_)*([A-Z]|[a-z]|[0-9]|_) ]];then
			if [ "$syslog_flag" = "YES" ]; then
				scds_syslog -p warning -t $(syslog_tag) -m \
				    "Invalid variable name in the Environment file %s. Ignoring %s" \
				    "${USER_ENV}" "${aa_line}"
			fi

			write_stderr "$(gettext "Invalid variable name in the Environment file %s. Ignoring %s")" \
			     "${USER_ENV}" "${aa_line}"
			continue
		fi

		# Ignore unset variables used in USER_ENV file 
		set +u

		if [[ "$val" == *\`* ]]; then
			if [ "$syslog_flag" = "YES" ]; then
                        	scds_syslog -p warning -t $(syslog_tag) -m \
				    "Ignoring command execution \`<command>\`"
			fi

			write_stderr "$(gettext "Ignoring command execution %s")" "\`<command>\`"
			continue
		elif [[ "$val" == *\$\(* ]]; then
			if [ "$syslog_flag" = "YES" ]; then
				scds_syslog -p warning -t $(syslog_tag) -m \
				    "Ignoring command execution \$(command)"
			fi

			write_stderr "$(gettext "Ignoring command execution \$(command)")"
			continue
		fi

		if [ "$syslog_flag" = "NO" ]; then
			# This trace message is logged only from
			# *server_manage methods and not validate
			# method. stderr is redirected to
			# DEBUG_LOGFILE. 
			print -r -u2 -- \
				"Setting environment variable: ${param}=${val}"
		fi

		eval ${param}=\"${val}\"

		export $param

		# Reenable flag to check unset variables
		set -u

	done < $USER_ENV

	return 0

}


########################################################################
# export_env()
# Takes care of 64-bit and 32-bit libraries as well as other environment
# variables required by other methods.
#
########################################################################
export_env()
{
	LD_LIBRARY_PATH=${ORACLE_HOME}/lib64:${ORACLE_HOME}/lib:${ORACLE_HOME}/lib32:/usr/cluster/lib/sparcv9:/usr/cluster/lib${LD_LIBRARY_PATH_64:+:$LD_LIBRARY_PATH_64}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

	export LD_LIBRARY_PATH

	export ORACLE_HOME

	if [ -n "${ORACLE_OWNER:=""}" ]; then
		export ORACLE_OWNER
	fi
	if [ -n "${ORACLE_SID:=""}" ]; then
		export ORACLE_SID
	fi
	if [ -n "${PARAMETER_FILE:=""}" ]; then
		export PARAMETER_FILE
	fi
	if [ -n "${USER_ENV:=""}" ]; then
		export USER_ENV
	fi
	if [ -n "${CONNECT_STRING:=""}" ]; then
		export CONNECT_STRING
	fi
	if [ -n "${LISTENER_NAME:=""}" ]; then
		export LISTENER_NAME
	fi
}


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

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

	[ -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

	if [ "${redirect_stderr:-}" != "NO" } ]; then
       		exec 2>> $DEBUG_LOGFILE
	fi

	rotate_log 

	return 0
}

#############################################################
# 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
	typeset rc=0

	prev_status=$(read_standard_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
		rc=$?
	else
		scha_resource_setstatus -s $rstatus \
			-R $RESOURCE_NAME -G $RESOURCE_GROUP
		rc=$?
	fi

	return $rc
}

#############################################################
#
# hastorageplus_validation
#
# Arguments: Arguments to be passed to hasp_check program
# 
# This function checks if resource is dependent on SPlus resource and 
# state of SPlus resource.
#
# This function is expected to be called from validate or monitor_check
# methods, if some validations failed.
# 
# If this resource is dependent on SPlus resource, validations 
# are possible only on the node that has SPlus resource online.
# 
# return 0 - if resource depends on HAStoragePlus resource
#		and HASP resource is on-line on some other node
# 
#        1 - All other cases
# 
#############################################################

hastorageplus_validation() 
{
  	typeset rc=0

	#
	# hasp_check return codes 
	# 1 - Internal error
	#
	# 2 - No dependency on HASToragePlus resource
	#
	# 3 - One or more of the SUNW.HAStoragePlus resources
	#     that this resource depends on is in a different RG.
	#
	# 4 - One or more of the SUNW.HAStoragePlus resources
	#     that this resource depends on is not online anywhere.
	#
	# 5 - All the SUNW.HAStoragePlus resources that this 
	#     resource depends on are not online on this node. 
	#
	# 6 - All the SUNW.HAStoragePlus resources that this
	#     resource depends on are online on the local node. 	
	#


	if [ ! -f /usr/cluster/bin/hasp_check ]; then

		# hasp_check binary does not exist
		# return error
		
		return 1
	fi

	/usr/cluster/bin/hasp_check "$@"
 	hasp_status=$?
 
	case "$hasp_status" in
 
	   1)	rc=1
	   	scds_syslog -p error -t $(syslog_tag) -m \
	    	   "Error in hasp_check. Validation failed."

	   	write_stderr "$(gettext "Error in hasp_check. Validation failed.")"
	   	;;
		   	
	   3)	rc=1
	   	scds_syslog -p error -t $(syslog_tag) -m \
	    	   "This resource depends on a HAStoragePlus resouce \
that is in a different Resource Group. This configuration is not supported."

	    	write_stderr "$(gettext "This resource depends on a HAStoragePlus resouce that is in a different Resource Group. This configuration is not supported.")" 
	   	;;

	   4)	rc=1
	   	scds_syslog -p error -t $(syslog_tag) -m \
	    	   "This resource depends on a HAStoragePlus resouce \
that is not online. Unable to perform validations."

		write_stderr "$(gettext "This resource depends on a HAStoragePlus resouce that is not online. Unable to perform validations.")"
	   	;;


	   5)	rc=0
	   	scds_syslog -p warning -t $(syslog_tag) -m \
		   "This resource depends on a HAStoragePlus resouce \
that is not online on this node. Ignoring validation errors." 

		write_stderr "$(gettext "This resource depends on a HAStoragePlus resouce that is not online on this node. Ignoring validation errors.")" 
	   	;; 

	   # Return code 2, 6 or any other.
 	   *) 	rc=1;; 
	esac

	return $rc

}
#include_dbms_lib
#
pkg=SUNWscor.oracle_listener
method=validate

redirect_stderr="NO"
export TEXTDOMAINDIR=/opt/SUNWscor/oracle_listener/lib/locale
export TEXTDOMAIN=SUNW_SC_ORACLE_LISTENER

#############################################################
# set_var()
#
#############################################################
set_var()
{
	typeset -u param
	typeset val
	[ -z ${1:-""} ] && return

	val="${1#*=}"
	param="${1%%=*}"
	eval ${param}=\"${val}\"

	return;
}

#############################################################
# check_arguments()
#
#############################################################
check_arguments()
{

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

operation="VALIDATE"

	while getopts ugcr:R:T:G:x: opt
	do
	  case $opt in
		R)      RESOURCE_NAME="$OPTARG";;
		T)      RESOURCE_TYPE="$OPTARG";;
		G)      RESOURCE_GROUP="$OPTARG";;
		x)      ;;
		r)      ;;
		c)      operation="VALIDATE" ;;
		g)      ;;
		u)      operation="UPDATE" ;;
                *)      invalid_option="YES";
                        save_opt="$opt"
                        save_optarg="$OPTARG"
                 ;;
	  esac
	done

	check_resource_setup
	rc=$?
        if [ $rc -ne 0 -o -n "$invalid_option" ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
                    "Validation failed. Invalid command line %s %s" \
                    "$save_opt" "$save_optarg"

		write_stderr "$(gettext "Validation failed. Invalid command line %s %s")" \
                    "$save_opt" "$save_optarg"
                rc=1;
        fi
 
	return $rc
}

#############################################################
# read_method_arguments()
#
#############################################################
read_method_arguments()
{

typeset rc
     if [ $operation = "UPDATE" ]; then

	# Read previous property values
	#
	ORACLE_HOME=$(read_extension_property_value ORACLE_HOME)
	LISTENER_NAME=$(read_extension_property_value LISTENER_NAME)
	USER_ENV=$(read_extension_property_value USER_ENV)
     fi

     	while getopts ucg:r:R:T:G:x: opt
	do
	  case $opt in
		R)      RESOURCE_NAME="$OPTARG";;
		T)      RESOURCE_TYPE="$OPTARG";;
		G)      RESOURCE_GROUP="$OPTARG";;
		x)      set_var "$OPTARG";;
		r)      set_var "$OPTARG";;
		g)      set_var "$OPTARG";;
		c)      ;;
		u)      ;;
		*)      ;;
	  esac
     	done

     	check_resource_setup
	rc=$?
        
	return $rc
}
#############################################################
# validate_oracle_home()
#
#############################################################
validate_oracle_setup()
{
typeset rc=0

	if [ ! -d "$ORACLE_HOME" ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
		    "ORACLE_HOME %s does not exist" \
		    $ORACLE_HOME

		write_stderr "$(gettext "ORACLE_HOME %s does not exist")" \
		    $ORACLE_HOME
		return 1
	fi

	#
	# Perform these checks only if ORACLE_HOME is set and exists
	#

	if [ ! -f "$ORACLE_HOME/bin/lsnrctl" ]; then
		scds_syslog -p error -t $(syslog_tag) -m \
		    "ORACLE_HOME/bin/lsnrctl not found ORACLE_HOME=%s" \
		    $ORACLE_HOME

		write_stderr "$(gettext "ORACLE_HOME/bin/lsnrctl not found ORACLE_HOME=%s")" \
		    $ORACLE_HOME
		rc=1
	else
        	ORACLE_OWNER=$(/bin/ls -l ${ORACLE_HOME}/bin/lsnrctl | /bin/nawk '{print $3}')
	fi

	return $rc
}

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

	validate_oracle_setup
	[ $? -ne 0 ] && rc=1

	if [ -n "$USER_ENV" ]; then
		(set_user_env)
		[ $? -ne 0 ] && rc=1
        fi

        if [ $rc -eq 0 ]; then
		write_trace "Validation successful"
	else
		# Validations failed. Check if this resource is dependent
		# on SPlus resource and state of SPlus resource
		# set return code to Success (0) if SPlus resource is
		# on-line not local.

                hastorageplus_validation "$@"

                rc=$?

        fi

	return $rc

}
#############################################################
#
#############################################################
main()
{
	check_arguments "${@:-}" || error_exit $?

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

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

	return 0

}
main "${@:-}"
exit 0
