#!/bin/sh
#
# $Header: opsm/cvutl/cluvfy.sbs.pre /st_has_pt-cvuotn11203/4 2012/02/06 22:14:20 spavan Exp $
#
# cluvfy.sbs.pre
#
# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 
#
#    NAME
#      cluvfy.sbs.pre - Instantiate cluvfy with correct build version and Starts the cluster verification driver. ( with compatible clusterware home )
#
#    DESCRIPTION
#      This requires these environmental variables.
#      CV_HOME: home for CV tools
#      CV_JDKHOME: java home
#      CV_DESTLOC: the remote locations where the required files can be
#                  copied and executed. The user MUST have write permission
#                  on this location, on all the nodes.
#
#    NOTES
#      
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

JDK_VERSION=15
AWK=awk
ECHO=echo
ID=id
GREP=grep
CUT=cut
OSNAME=`/bin/uname`

checkRootAllowedCommands ()
{
#allow only 'cluvfy comp dhcp' and 'cluvfy comp dns' to run as root.
# check if first arg is comp
  if [ "X$1" != "Xcomp" ]; then
    return 1;
  fi

# we have comp now check for dns or dhcp
if  [ "X$2" = "Xdns" ] || [ "X$2" = "Xdhcp" ]; then
    return 0;
fi
  
#all others should fail
  return 1;
}

if [ "X$TMPDIR" = "X" ]
then
  TMPDIR=/tmp
fi

RUID=`$ID -u 1> /dev/null 2>&1`
status=$?

if [ "$status" != "0" ];
then
  RUID=`$ID | $AWK -F\( '{print $1}' | $AWK -F= '{ print $2}'`
else
  RUID=`$ID -u`
fi

if [ "${RUID}" = "0" ];
then
  checkRootAllowedCommands $*
  ret=$? 
  if [ "$ret" != "0" ];
  then 
    $ECHO "You must NOT be logged in as root (uid=0) when running $0."
    exit 1
  else
    ROOT_USER_CHECK="-DCV_ROOTUSERCHECK=true"
  fi 
else
   ROOT_USER_CHECK=
fi

validateInput()
{
##validates if any value is assigned to the script variables
PARAM_NAME=$1
if [ "$PARAM_NAME" = "" ];
then
  return 1;
else
valid=`$ECHO $PARAM_NAME | $AWK '/^%/ { print "false"; }'`
if [ "$valid" = "false" -o ! -d $PARAM_NAME ];
then
  return 1;
fi
  return 0;
fi
}

validateJREVersion()
{
if  [ ${JDK_VERSION} -gt $1 ]
then
    ${ECHO} "JDK version is incompatible.Please use a jdk version the same as, or later than ${JDK_VERSION}"
    exit 1
fi
}

CRSHOME=%s_OracleHome%
JREDIR=$CRSHOME/jdk
SRVMHASJAR=
DESTLOC=%s_destLocation%
TRACE=
TRACELOC=

if [ -n "$SRVM_TRACE" ]
then
   if [ "$SRVM_TRACE" = "false" ]  || [ "$SRVM_TRACE" = "FALSE" ]
   then
     TRACE="-DTRACING.ENABLED=false"
   else
     if [ -n "$SRVM_TRACE_LEVEL" ]
     then
       TRACE="-DTRACING.ENABLED=true -DTRACING.LEVEL=${SRVM_TRACE_LEVEL}"
     else
       TRACE="-DTRACING.ENABLED=true -DTRACING.LEVEL=2"
     fi
   fi
fi

if [ -n "$CV_TRACELOC" ];
then
  TRACELOC="-DCV_TRACELOC=$CV_TRACELOC"
fi

validateInput $CRSHOME
ret=$?
if [ "$ret" = "0" ];
then
  CV_HOME=$CRSHOME
  SRVMHASJAR=$CV_HOME/jlib/srvmhas.jar
fi

if [ -z "$CV_HOME" ];
then
  cmdpath=`dirname $0`
  case "$cmdpath" in
    /*) ;;
    .) cmdpath=`pwd`;;
     *) cmdpath=`pwd`/$cmdpath;;
  esac
  if [ -d $cmdpath/../bin ] && [ -f $cmdpath/../jlib/cvu.jar ]
  then
     CV_HOME=$cmdpath/..
  else
     $ECHO "Set CV_HOME environmental variable before proceeding."
     exit 1
  fi
fi

CVUJAR=$CV_HOME/jlib/cvu.jar
SRVMJAR=$CV_HOME/jlib/srvm.jar
OUIJARS=$CV_HOME/oui/jlib/OraInstaller.jar:$CV_HOME/oui/jlib/OraPrereq.jar:$CV_HOME/oui/jlib/prov_fixup.jar:$CV_HOME/oui/jlib/xmlparserv2.jar:$CV_HOME/oui/jlib/share.jar:$CV_HOME/oui/jlib/orai18n-mapping.jar
JDBCJAR=$CV_HOME/jdbc/lib/ojdbc5.jar
NETCFGJAR=$CV_HOME/jlib/netcfg.jar

validateInput $JREDIR
ret=$?
if [ "$ret" != "0" ];
then
  if [ -z "$CV_JDKHOME" ];
  then
     if [ -d $CV_HOME/jdk/jre ];
     then
        CV_JDKHOME=$CV_HOME/jdk/jre
     else
        $ECHO "Set CV_JDKHOME to a valid JRE $JDK_VERSION location"
        exit 1
     fi
  fi
  JREDIR=$CV_JDKHOME
fi

JRE=$JREDIR/bin/java
JREJAR=$JREDIR/lib/rt.jar
#Special handling for AIX which has the IBM JDK
if [ "${OSNAME}" = "AIX" ]
then
RJDKV1=`$JRE -fullversion 2>&1 | $AWK '{ print $5 }'`
RJDKV2=`${ECHO} $RJDKV1 | $CUT -d. -f1`
RJDKV3=`${ECHO} $RJDKV1 | $CUT -d. -f2`
RJDKVER=${RJDKV2}${RJDKV3}
JDKV1=`${ECHO} ${JDK_VERSION} | $CUT -d. -f1 | $CUT -dK -f2`
JDKV2=`${ECHO} ${JDK_VERSION} | $CUT -d. -f2`
JDK_VERSION=${JDKV1}${JDKV2}
else
RJDKV1=`$JRE -fullversion 2>&1 | $CUT -d" " -f4 | $CUT -d. -f1 | $CUT -d"\"" -f2`
RJDKV2=`$JRE -fullversion 2>&1 | $CUT -d" " -f4 | $CUT -d. -f2`
RJDKVER=${RJDKV1}${RJDKV2}
fi
validateJREVersion $RJDKVER

LD_LIBRARY_PATH=$CV_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

# Set the shared library path for JNI shared libraries
# A few platforms use an environment variable other than LD_LIBRARY_PATH
PLATFORM=`/bin/uname`
case $PLATFORM in
  HP-UX) arch=`/bin/uname -m`
       # bugfix 5404049
       if [ -z "$JAVA_HOME" ];
       then
         JAVA_HOME=$JREDIR/..
         export JAVA_HOME
       fi
       SHLIB_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/hpunix/
       export SHLIB_PATH 
       JRE_OPTS=-d64
       #Bug 10111014: Add  -XX:+UseC2 to JRE_OPTS on HP-IA
       if [ "$arch" = "ia64" ]
       then
         VERSION=`$JRE -fullversion 2>&1 | $CUT -d'"' -f2 | $AWK -F\- '{print $1}'`;
         DYN=" -XX:+UseC2"
         VER1=`echo $VERSION|$CUT -d'.' -f1` 
         VER2=`echo $VERSION|$CUT -d'.' -f2` 
         VER3=`echo $VERSION|$CUT -d'.' -f3` 
         VER4=`echo $VERSION|$CUT -d'.' -f4` 
         if [ $VER1 -eq 1 -a $VER2 -eq 5 -a $VER3 -eq 0 -a $VER4 -gt 5 -a $VER4 -le 20 ]
         then
           JRE_OPTS="$JRE_OPTS $DYN"
         fi 
       fi
       ;;
  AIX) 
       LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/aix/
       LIBPATH=$LD_LIBRARY_PATH
       export LIBPATH 
       JRE_OPTS=-d64
     ;;
  Linux) 
       arch=`/bin/uname -m`
       if [ "$arch" = "ppc64" -o "$arch" = "x86_64" -o "$arch" = "s390x" ]
       then
         JRE_OPTS=-d64
       fi
       if [ "$arch" = "x86_64" ]
       then
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/linux64/
       elif [ "$arch" = "ppc64" ]
       then
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/linuxppc64/
       elif [ "$arch" = "s390x" ]
       then
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/linuxS390/
       else
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/linux/
       fi
      ;;
  SunOS)
       arch=`/bin/uname -p`
       if [ "$arch" = "sparc" ]
       then
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/solaris/
       else
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/intelsolaris/
       fi

       # Bug 4620768. Unset LD_LIBRARY_PATH_64 
       unset LD_LIBRARY_PATH_64
       JRE_OPTS=-d64
       ;;
esac

export LD_LIBRARY_PATH


#Make ORACLE_HOME to be CV_HOME. Ignore ORACLE_HOME set in environment.
ORACLE_HOME=$CV_HOME
export ORACLE_HOME

#If CV_PREREQ_XML is not set in the environment make CV_PREREQ_XML point to the prereq xml
#if [ -z "$CV_PREREQ_XML" ];
#then
#  CV_PREREQ_XML=$CV_HOME/cv/cvdata/cvu_prereq.xml
#  export CV_PREREQ_XML
#fi

#Make sure we are not in an SIDB environment, if we are exit out with an
#error message.
if [ -f  $ORACLE_HOME/srvm/admin/getcrshome ]
 then
   $ORACLE_HOME/srvm/admin/getcrshome > /dev/null 2>&1
   SIDB_STATUS=$?
 
   # If we did NOT encounter an error (i.e. status equal to 0) while getting 
   # the CRSHOME then we are in an SIDB environment...
   if [ $SIDB_STATUS -ne 0 ]
   then
     if [ `expr "$*" : ".*-_patch_only.*"` -eq 0 ]
     then
       # give an error only if this is not running from root script
       $ECHO " "
       $ECHO "ERROR: "
       $ECHO "Oracle Grid Infrastructure not configured. "
       $ECHO "You cannot run '$0' without the Oracle Grid Infrastructure."
       $ECHO " "
       exit 1
     fi
   fi
fi

REM_CVHOME="-DCV_HOME=$CV_HOME"

if [ `expr "$*" : ".*-_patch_only.*"` -ne 0 ]
then
  CLASSPATH=$JREJAR:$CVUJAR:$SRVMJAR:$OUIJARS:$JDBCJAR:$NETCFGJAR
else
  CLASSPATH=$JREJAR:$CVUJAR:$SRVMJAR:$OUIJARS:$SRVMHASJAR:$JDBCJAR:$NETCFGJAR
fi

#Check RemoteExec destination location
if [ -z "$CV_DESTLOC" ]
then
    validateInput $DESTLOC
    ret=$?
    if [ "$ret" = "0" ];
    then
	CV_DESTLOC=$DESTLOC
    fi
fi

#If remote destination location is empty show error msg. Proceed with default.
if [ -n "$CV_DESTLOC" ]
then
    REM_DESTLOC="-DCV_DESTLOC=$CV_DESTLOC"
else
    REM_DESTLOC="-DCV_DESTLOC=$TMPDIR"
fi

REM_ENV="$REM_DESTLOC $REM_CVHOME"

JRE_OPTS="$JRE_OPTS -Djava.net.preferIPv4Stack=true"

# Run cluvfy driver
$JRE $JRE_OPTS -classpath $CLASSPATH $ROOT_USER_CHECK $REM_ENV $CVU_RESOURCE $TRACE $TRACELOC oracle.ops.verification.client.CluvfyDriver "$@"
exit $?
