#!/bin/sh
#
# $Header: opsm/cvutl/cluvfy.sbs.pre /unix/109 2016/07/20 08:15:10 xesquive Exp $
#
# cluvfy.sbs.pre
#
# Copyright (c) 2003, 2016, 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=18
AWK=awk
CUT=cut
SED=sed
ECHO=echo
CV_ID=id
GREP=grep
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 [ -z "$CVU_TEST_ENV" ]
then
   # checks if ORA_CRS_HOME has not been set
   if [ -n "$ORA_CRS_HOME" ]
   then 
     ORA_CRS_HOME=
     export ORA_CRS_HOME
   fi
fi

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

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

if [ "$status" != "0" ];
then
  RUID=`$CV_ID | $AWK -F\( '{print $1}' | $AWK -F= '{ print $2}'`
else
  RUID=`$CV_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=%ORACLE_HOME%
CV_JREDIR=$CRSHOME/jdk
SRVMASMJAR=
SRVMHASJAR=
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

# pass the options explicitly to avoid
# _JAVA_OPTIONS message from java on cluvfy output
JAVA_OPTS=
if [ -n "$_JAVA_OPTIONS" ];
then
  JAVA_OPTS=$_JAVA_OPTIONS
  unset _JAVA_OPTIONS
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/..
  #Check for the case when cluvfy runs from GI_HOME/crs/sbs
  elif [ -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/jsch.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
NETCFGJAR=$CV_HOME/jlib/netcfg.jar
LDAPJAR=$CV_HOME/jlib/ldapjclnt12.jar

validateInput $CV_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
  CV_JREDIR=$CV_JDKHOME
fi

JRE=$CV_JREDIR/bin/java
JREJAR=$CV_JREDIR/lib/rt.jar

# Fetch the JDK version at runtime
RJDKVER=`${JRE} -Xmx32m -version 2>&1 | ${AWK} '{ if (NR==1) { print $3 }}' | ${SED} -e 's/\"//g' | ${AWK} -F. '{print $1$2}'`

# Validate the JDK version at runtime against the JDK version at build time
validateJREVersion $RJDKVER

# Determine the JDBC jar to load based on JDK version
if [ $RJDKVER -eq 14 ]
then
  JDBCVER=$RJDKVER;
else
  JDBCVER=`echo ${RJDKVER} | ${AWK} '{print substr($0,2,1)}'`
fi

JDBCJAR=$CV_HOME/jdbc/lib/ojdbc${JDBCVER}.jar

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=$CV_JREDIR/..
         export JAVA_HOME
       fi
       JRE_OPTS=-d64
       #Bug 10111014: Add  -XX:+UseC2 to JRE_OPTS on HP-IA
       if [ "$arch" = "ia64" ]
       then
         SHLIB_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/hpia64/
         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 
       else
         SHLIB_PATH=$LD_LIBRARY_PATH:$CV_HOME/oui/lib/hpunix/
       fi
       export SHLIB_PATH 
       ;;
  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  $CV_HOME/srvm/admin/getcrshome ]
then
  $CV_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
     #Allow cluvfy to run from software only GI home
     #Report error if software only GI not installed correctly
     if [ ! -f "$CV_HOME/bin/crsd.bin" ] || [ ! -f "$CV_HOME/bin/evmd.bin" ]
     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 installed or configured correctly. "
           $ECHO "You cannot run '$0' without the Oracle Grid Infrastructure."
           $ECHO " "
           exit 1
        fi
     fi
  fi
fi

REM_CVHOME="-DCV_HOME=$CV_HOME"

if [ `expr "$*" : ".*-_patch_only.*"` -ne 0 ]
then
  CLASSPATH=$JREJAR:$CVUJAR:$SRVMJAR:$OUIJARS:$JDBCJAR:$NETCFGJAR:$LDAPJAR
else
  CLASSPATH=$JREJAR:$CVUJAR:$SRVMJAR:$OUIJARS:$SRVMHASJAR:$JDBCJAR:$NETCFGJAR:$LDAPJAR
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"

# set installer property to true if it runs from runcluvfy
for arg in $@ ;     
do 
  lastArg="$arg" 
done

if [ "$lastArg" = "_FROM_RUNCLUVFY" ]
then
   INSTALLER_PROPERTY="-Doracle.installer.setupWizard=true"
   SRVMHASJAR=$CV_HOME/jlib/srvmhas.jar
   GNSJAR=$CV_HOME/jlib/gns.jar
   CLASSPATH=$CLASSPATH:$SRVMHASJAR:$GNSJAR
fi

ENV_FILE="${ORA_CRS_HOME}/crs/install/s_crsconfig_${HOST}_env.txt"
CMD="$JRE $JRE_OPTS -classpath $CLASSPATH $ROOT_USER_CHECK $REM_ENV $CVU_RESOURCE $TRACE $TRACELOC $JAVA_OPTS $INSTALLER_PROPERTY -Xmx2048m oracle.ops.verification.client.CluvfyDriver"
if [ -n "$CVU_RESOURCE" ]
then
    if [ -f "$ENV_FILE" ]
    then
        export TZ=`$GREP ^TZ= $ENV_FILE | $AWK -F'=' '{print $2}'`
    fi
    $CMD "$@"&
    PID_FILE=`echo $CVU_RESOURCE |cut -d"=" -f4`
    echo $! > $PID_FILE
    wait
    exit 0
fi

# Run cluvfy driver
$CMD "$@"
exit $?
