crs_common.ksh 04162019


 1="lrdne67mp" 2="[DBFSXD011"]-> cat crs_common.ksh

##############################################################################
# CRS Common functions
#
##############################################################################

crs_inst_order()
{

echo
echo "Function name.: crs_inst_order................."
echo "Library file..: crs_common.ksh................."
echo "Directory ....: /oracle/admin/scripts/crsdbfs.."
echo
echo "Shows the installation order for the CRS services..."
echo

echo "Create a service first for GoldenGate"
echo " function - srvctl_add_svc"
echo " add a resource in CRS for DBFS (crs_add_res_dbfs)......"
echo "   naming is dbfs_ gg instance name.."
echo " start the DBFS resource............."
echo " stop the DBFS resource.............."
echo " status of the resource.............."
echo " relocate the resource..............."
echo " "

}

crs_res_add_dbfs()
##############################################################################
# Add resource to CRS for DBFS
##############################################################################
{

# GoldenGate XAG Instance
gg_inst=$1

# Database for dependencies
dbnm=$2

# Project Directory
projdir=$3

echo $gg_inst
echo $dbnm
echo $projscr
echo $projdir/mount_dbfs_$gg_inst.bsh

echo
echo "Function name.: crs_res_add_dbfs..............."
echo "Library file..: crs_common.ksh................."
echo "Directory ....: /oracle/admin/scripts/crsdbfs.."
echo
echo "Creating a CRS resource for DBFS..............."
echo

######################################################################
# Check to see if the .bsh script has been created ...."
######################################################################
if [ ! -f "$projscr/mount_dbfs_$gg_inst.bsh" ]; then
   echo
   echo "The mount script does not exist please create and re-run";
   echo
   exit
else
   echo
   echo "The mount script exists and proceeding with CRS resource create"
   echo
fi

######################################################################
# Check to see if the .conf file has been created ...."
######################################################################
if [ ! -f "$projscr/mount-dbfs_$gg_inst.conf" ]; then
   echo
   echo "The mount conf file does not exist please create and re-run";
   echo
   exit
else
   echo "The mount conf file exists and proceeding with CRS resource create"
fi

echo
echo "Adding CRS resource for DBFS dbfs_"$gg_inst
echo "MAKE SURE THE mount_dbfs script is in place before executing this!!!!"
echo

$CRS_HOME/bin/crsctl add resource dbfs_${gg_inst} -type cluster_resource -attr "ACTION_S                                  CRIPT=$projscr/mount_dbfs_${gg_inst}.bsh, CHECK_INTERVAL=30, RESTART_ATTEMPTS=10, START_                                  DEPENDENCIES='hard(ora.$dbnm.db)pullup(ora.$dbnm.db)',STOP_DEPENDENCIES='hard(ora.$dbnm.                                  db)',SCRIPT_TIMEOUT=300"

# /oracle_crs/product/12.1.0.2/crs_1/bin/crsctl add resource dbfs_${gg_inst} -type clust                                  er_resource -attr "ACTION_SCRIPT=/oracle/admin/scripts/crsdbfs/wrap_mount_dbfs_${gg_inst                                  }.bsh, CHECK_INTERVAL=30, RESTART_ATTEMPTS=10, START_DEPENDENCIES='hard(ora.$dbnm.db)pul                                  lup(ora.$dbnm.db)',STOP_DEPENDENCIES='hard(ora.$dbnm.db)',SCRIPT_TIMEOUT=300"

}



crs_res_start()
##################################################################
# for the $1 parm only the name after dbfs_ needs to be specified
# Start the dbfs resource
##################################################################
{

dbfsmnt=$1
nodename=$2

clear
echo
echo "Function name.: crs_res_start.................."
echo "Library file..: crs_common.ksh................."
echo "Directory ....: /oracle/admin/scripts/crsdbfs.."
echo
echo "Starting CRS resource for DBFS mount "$dbfsmnt
echo
echo "Start DBFS resource...."
echo

# /oracle_crs/product/12.1.0.2/crs_1/bin/crsctl start resource dbfs_$dbfsmnt -n server67mp
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl start resource dbfs_$dbfsmnt -n $nodename

# /oracle_crs/product/12.1.0.2/crs_1/bin/crsctl status resource dbfs_ggtxd001

echo
echo "Status of DBFS resource...."
echo

crs_res_stat $dbfsmnt

echo
echo "df -hs or /dbfs_ mountpoints ...."
echo

df -ha |grep dbfs_

}


crs_res_stop()
{

dbfsmnt=$1

clear
echo
echo "Function name.: crs_add_stop..................."
echo "Library file..: crs_common.ksh................."
echo "Directory ....: /oracle/admin/scripts/crsdbfs.."
echo
echo "Stopping CRS resource for DBFS................."
echo
echo "Stop DBFS resource...."
echo
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stop resource dbfs_$dbfsmnt

echo
echo "Status of DBFS resource...."
echo
crs_res_stat $dbfsmnt

echo
echo "df -hs or /dbfs_ mountpoints ...."
echo
df -ha |grep dbfs_

}


crs_res_stat()
#########################################
# Resource status
#########################################
{

gg_inst=$1

### RVK Change Jan 14th 2019 >>>
### Replaced CRS_HOME hardcode path with $CRS_HOME (Note: CRS_HOME in Dev VA is differen                                  t
### RVK End <<<

$CRS_HOME/bin/crsctl status resource dbfs_$gg_inst

}

crs_res_relo()
#########################################
# Resource relocate
#########################################
{

gg_inst=$1
to_node=$2

/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl relocate resource dbfs_$gg_inst -node $to_                                  node

}


crs_res_del()
#########################################
# Delete DBFS resource
#########################################
{

gg_inst=$1

/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl delete resource dbfs_$gg_inst

}


crs_stat()
{

########################################################################################                                  ###
# The difference on the crs_stat is the directory mismatch on the TX vs VA cluster pair
# Directory needed for TX cluster is 12.1.0.2
########################################################################################                                  ###

########################################################################################                                  ###
# This should be in the ggini file in order to drive the correct directory for all stand                                  ard
# scripts
########################################################################################                                  ###

bindir="12.1.0.2"

echo
echo "crsctl stat res -t...."
echo
/oracle_crs/product/$bindir/crs_1/bin/crsctl status resource -t

echo
echo "Show services from the resource list...."
echo
/oracle_crs/product/$bindir/crs_1/bin/crsctl status resource -t|grep -a1 .svc

echo
echo "If nothing shows here, there are no dbfs mounts ......"
echo
df -ha|grep dbfs

}


crs_stat_xag()
{

gg_inst=$1
dbnm=$2

echo
echo "If XAG resource is not yet setup then this will not work....."
echo
echo "XAG Instance name is $gg_inst / crsctl stat res xag.$gg_inst.goldengate -p all par                                  ameters ...."
echo

# /oracle_crs/product/$bindir/crs_1/bin/crsctl stat res xag.ggtxd001.goldengate -p
/oracle_crs/product/$bindir/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p

echo
echo "Cluster resource cluster resource  (dbfs) action script values...."
echo

/oracle_crs/product/$bindir/crs_1/bin/crsctl stat res -w "TYPE = cluster_resource" -p |                                   grep ACTION_SCRIPT

echo
echo "Cluster resource (dbfs) ..."
echo
# /oracle_crs/product/$bindir/crs_1/bin/crsctl stat res ora.dbfsxd01.dbfs_ggtxd001.svc -                                  p
/oracle_crs/product/$bindir/crs_1/bin/crsctl stat res ora.$dbnm.dbfs_$gg_inst.svc -p

}


crs_stat_xag_det()
{

########################################################################################                                  
# Were setting bindir because there is a difference between location of the binaries
# on TX cluster vs VA cluster
########################################################################################                                  

bindir="12.1.0.2"

gg_inst=$1

echo
echo "XAG Instance name is $gg_inst / crsctl stat res xag.$gg_inst.goldengate -p specifi                                  c parameters ...."
echo

/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   DATAGUARD_AUTOSTART
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   DB_SERVICES
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   START_DEP
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   STOP_DEP
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   HOSTING
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   FILESYST
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   GG_HOME
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   PLACEMENT
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   USE_LOCAL_SERVICES
/oracle_crs/product/12.1.0.2/crs_1/bin/crsctl stat res xag.$gg_inst.goldengate -p |grep                                   RELOCATE

}


srvctl_add_svc()
#######################################################
# This is critical for the overall operation
#######################################################
{

gg_inst=$1
dbnm=$2
pfd=$3
avl=$4

echo
echo "Create a service for GoldenGate in the format of svc_$gg_inst.....................                                  ..."
echo "This service is then used for setup through XAG for keying when GoldenGate fails o                                  ver"
echo "SRVCTL add service for svc_$gg_inst when role is primary..........................                                  ..."
echo "This adds a GoldenGate resource thru SRVCTL ......................................                                  ..."
echo "-preferred takes an instance name as parameter as does -available.................                                  ..."
echo
echo "Showing before services database "$dbnm
echo
srvctl config service -db $dbnm|grep "Service "

echo
echo "Attempting to add service svc_"$gg_inst
echo

# Example on next line
# srvctl add service -db $dbnm -service svc_$gg_inst -role PRIMARY -preferred DBFSXD011                                   -available DBFSXD012
srvctl add service -db $dbnm -service svc_$gg_inst -role PRIMARY -preferred $pfd -availa                                  ble $avl

echo
echo "Showing after services database "$dbnm
echo
srvctl config service -db $dbnm|grep "Service "

}


srvctl_svc_mod()
{

dbnm=$1
svcnm=$2
pfd=$3
avl=$4

echo
echo "This modifies the GG service created for XAG triggering "
echo "the service name automatically has svc_ prepended to avoid misconfig for different                                   service"
echo

srvctl modify service -db $dbnm -service svc_$svcnm -modifyconfig -preferred $pfd -avail                                  able $avl -force

}


srvctl_sho_svc()
{

dbnm=$1

clear
echo
echo "Showing services database "$dbnm
echo
srvctl config service -db $dbnm|grep "Service "

}


crs_cr_mount_scrpt()
{

vsn="1.00"
gginst=ggmrct001
flnm="mount_dbfs_mculp_test.bsh"


echo
echo "Create a mount script...."
echo " Version "$vsn
echo

# cat here for create of file
echo "....creating $flnm file......."

cat << EOS > $flnm

### This script is from Note 1054431.1, ensure you have the latest version
### Note 1054431.1 provides information about the setup required to use this script
### MCulp modified 08/01/2018
### The start section has been modified to work with BOA environment

###############################################
# mount-dbfs.bsh start / stop / check / status
###############################################

###############################################################
### All configuration parameters are now in an external file
###############################################################

###########################################
### Ensure that when multiple mounts are used, there are separate copies
###   of mount-dbfs.sh that reference separate CONFIG file pathnames
# CONFIG=/etc/oracle/mount-dbfs.conf

# MCulp change location #1
# This should have a conf file unique for each mount
# The location is /oracle/admin/scripts for both the script
# and the config file
##############################################################

# CONFIG=/oracle/admin/scripts/crsdbfs/mount-dbfs_ggtxp002.conf
CONFIG=/oracle/admin/scripts/crsdbfs/mount-dbfs_ggtxp003.conf


###########################################
### No editing is required below this point
###########################################
### date-based versioning YYYYMMDD
VERSION=20160215

### source configuration file
if [ -r $CONFIG ]; then
   . $CONFIG
else
   echo "$0 ERROR: cannot read config file $CONFIG, aborting"
   exit 1
fi

### the DBNAME should be set to the CDB name (from config file)
CDB=$DBNAME

### determine platform
UNAME_S=`uname -s`
if   [ $UNAME_S = 'Linux' ]; then LINUX=1; SOLARIS=0;
elif [ $UNAME_S = 'SunOS' ]; then LINUX=0; SOLARIS=1;
fi

GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
ECHO=/bin/echo
LOGGER="/bin/logger -t DBFS_${MOUNT_POINT}"
RMF='/bin/rm -f'
TOUCH=/bin/touch
CHMOD=/bin/chmod
PS=/bin/ps
SLEEP=/bin/sleep
KILL=/bin/kill
BASENAME=/bin/basename
STAT=/usr/bin/stat
ID=/usr/bin/id
WC=/usr/bin/wc
SRVCTL=$ORACLE_HOME/bin/srvctl
DBFS_CLIENT=$ORACLE_HOME/bin/dbfs_client
HN=/bin/hostname
PERL=/usr/bin/perl
MOUNT=/bin/mount
### ensure messages are displayed in English for pattern matching
LANG=en_US.UTF-8
NLS_LANG=American_America.AL32UTF8
NUMACTL=/usr/bin/numactl
RPMCTL=/bin/rpm


if [ -z "$STATUS_TIMEOUT" ]; then STATUS_TIMEOUT=0; fi

if [ $LINUX -eq 1 ]; then
  MOUNT=/bin/mount
  XARGS='/usr/bin/xargs -r'
  FUSERMOUNT=/bin/fusermount
  LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib64
elif [ $SOLARIS -eq 1 ]; then
  MOUNT=/sbin/mount
  XARGS=/usr/bin/xargs
  UMOUNT=/usr/sbin/umount
  LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:/usr/lib:/lib
fi

DBFS_PWDFILE=$DBFS_PWDFILE_BASE.$$

export ORACLE_HOME LD_LIBRARY_PATH TNS_ADMIN
export STAT MOUNT_POINT PERL_ALARM_TIMEOUT SOLARIS LINUX
export PATH=$ORACLE_HOME/bin:$PATH
export STATUS_TIMEOUT
export LANG NLS_LANG

logit () {
  ### type: info, error, debug
  type=$1
  msg=$2
  if [ "$type" = "info" ]; then
    $ECHO $msg
    $LOGGER -p ${LOGGER_FACILITY}.info "$msg"
  elif [ "$type" = "error" ]; then
    $ECHO $msg
    $LOGGER -p ${LOGGER_FACILITY}.error "$msg"
  elif [ "$type" = "debug" ]; then
    $ECHO $msg
    $LOGGER -p ${LOGGER_FACILITY}.debug "$msg"
  fi
}

### must not be root
if [ `$ID -u` -eq 0 ]; then
  logit error "Run this as the Oracle software owner, not root"
  exit 1
fi

### determine how we were called, derive location
SCRIPTPATH=$0
SCRIPTNAME=`$BASENAME $SCRIPTPATH`

$ECHO $SCRIPTPATH | $GREP ^/ > /dev/null 2>&1
if [ $? -ne 0 ]; then
  MYDIR=`pwd`
  SCRIPTPATH=${MYDIR}/${SCRIPTPATH}
fi

### must cd to a directory where the oracle owner can get CWD
cd /tmp

case "$1" in

##########################################
# Start begins here
##########################################
'start')
  echo "Start...."
  echo
  logit info "$SCRIPTNAME mounting DBFS at $MOUNT_POINT from database $DBNAME"

  ### check to see if it is already mounted
  $SCRIPTPATH status > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    logit error "$MOUNT_POINT already mounted, use $SCRIPTNAME stop before attempting to                                   start"
    $SCRIPTPATH status
    exit 1
  fi

  ### set the ORACLE_SID dynamically based on OCR info, if it is running
  # if RAC, set SID with following command
  export ORACLE_SID=$($SRVCTL status instance -d $DBNAME -n `$HN` | \
         $GREP 'is running' | $AWK '{print $2}' )

  # if single instance, set ORACLE_SID based on below command instead
  if [ -z "$ORACLE_SID" ]; then
    export ORACLE_SID=$($SRVCTL config db -d $DBNAME | $GREP 'instance' | $AWK '{print $                                  3}')
  fi

  logit info "ORACLE_SID is $ORACLE_SID"

  ### further checks required if we are using a PDB
  ### if the local instance isn't running (because ORACLE_SID is null) don't bother
  if [ -n "$ORACLE_SID" -a "$IS_PDB" = 'true' ]; then
    logit info "IS_PDB = true"
    HOSTNAME=`$HN -s`
    ### by checking to see if the service is running on the local instance,
    ###   we can deterine whether we should continue or not
    PDB_SERVICE_STATE=$($SRVCTL status service -d $CDB -s $PDB_SERVICE | \
        $GREP "$ORACLE_SID" )
    ### if the output from the last command is > 0, service is running locally
    if [ -n "$PDB_SERVICE_STATE" ]; then
      logit info "PDB service is online"
    else
      logit error "PDB service is offline.  Exiting"
      exit 2
    fi
  fi

  ### if there's no SID defined locally or it isn't running, stop
  if [ -z "$ORACLE_SID" -a "$WALLET" = 'false' ]; then
    logit error "No running ORACLE_SID available on this host, exiting"
    exit 2
  fi

  ### version comparison function, used in numa section
  # Compare string versions
  # Returns in stdout and in the err code
  # 0        - a equal b
  # 1        - a greater than b
  # 255(-1)  - a less than b
  # version should be in format 1.2.3.4.5
  # It might be a short version like 1.2.3 or 1.2.3.

  version_cmp ()
  {
    local -a al=(`$ECHO $1 | $SED -e 's/\./ /g'`)
    local -a bl=(`$ECHO $2 | $SED -e 's/\./ /g'`)

    local -i i=0
    for ((i=0; i < ${#al[@]}; i++)); do
      # ap is always non-empty. Gap is not possible in both arrays
      local ap=${al[$i]}
      local bp=${bl[$i]}
      # Only $ap defined. $a longer (bigger) then $b
      if [ -z "$bp" ] || [ $ap -gt $bp ]; then
        $ECHO "1"
        return 1
      elif [ $ap -lt $bp ]; then
        $ECHO "-1"
        return -1
      fi
    done
    # Check for the next part from @bl. It means $a shorter (smaller) then $b
    if [ -n "${bl[$i]}" ]; then
      $ECHO "-1"
      return -1
    fi
    # Both arrays ended at the same time. They are equal
    $ECHO "0"
    return 0
  }

# MCulp commenting out the whole section as we do not need this currently
########################################################################################                                  ###
#  ### if numa system on Linux, update mount_options for bug 10004611
#  if [ $LINUX -eq 1 ]; then
#    RPMEXA=`$RPMCTL -q --queryformat '%{VERSION}' exadata-base`
#    NUMASYS=`$NUMACTL --hardware | $GREP available: | cut -c1-18`
#
#    ###Check if an X8 system and image greater than or equal to 11.2.3.3.0 to support n                                  uma mount option
#    if [ "$NUMASYS" = 'available: 8 nodes' ]; then
#      if [ `version_cmp $RPMEXA 11.2.3.3.0` -eq 0 ] || [ `version_cmp $RPMEXA 11.2.3.3.                                  0` -eq 1 ]; then
#        # MOUNT_OPTIONS=$MOUNT_OPTIONS,numa
#        MOUNT_OPTIONS=$MOUNT_OPTIONS
#      else
#        MOUNT_OPTIONS=$MOUNT_OPTIONS
#      fi
#
#    ###Check if an X5-2 system to support numa mount option
#    elif [ "$NUMASYS" = 'available: 2 nodes' ]; then
#      # MOUNT_OPTIONS=$MOUNT_OPTIONS,numa
#      MOUNT_OPTIONS=$MOUNT_OPTIONS
#    ###Check for all other X2 systems, do not use numa option
#    elif [ "$NUMASYS" = 'available: 1 nodes' ]; then
#      MOUNT_OPTIONS=$MOUNT_OPTIONS
#    ###Exit for errors or unexpected values, post in messages file
#    else
#      logit error "Unexpected numa value.  Exiting."
#      logit error "Numa hardware value is: $NUMASYS"
#      logit error "RPM version of Exadata base is: $RPMEXA"
#      exit 1
#    fi
#  else
#    logit info "skipped numa check for Solaris...not applicable"
#  fi
########################################################################################                                  ###

  ### if using password-based startup, use this
  if [ "$WALLET" = 'false' -a -n "$DBFS_PASSWD" ]; then
    $RMF $DBFS_PWDFILE
    if [ -f $DBFS_PWDFILE ]; then
      logit error "please remove $DBFS_PWDFILE and try again"
      exit 1
    fi

    $TOUCH $DBFS_PWDFILE
    $CHMOD 600 $DBFS_PWDFILE
    $ECHO $DBFS_PASSWD > $DBFS_PWDFILE

    logit info "spawning dbfs_client command using SID $ORACLE_SID"
    ### if PDB, mount with this command
    if [ "$IS_PDB" = 'true' ]; then
      (nohup $DBFS_CLIENT ${DBFS_USER}@${PDB} -o $MOUNT_OPTIONS \
          $MOUNT_POINT < $DBFS_PWDFILE | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &
    ### if not PDB, mount with this command instead
    else
      echo "Correct command...."

      ### MCulp changed

#     nohup $ORACLE_HOME/bin/dbfs_client ggtxp003/not4good@dbfs_ggtxp003 -o rw,direct_io                                   /dbfs_ggtxp003 < /oracle/admin/scripts/clle_dbfscommon/.gg_password &>/oracle/admin/scr                                  ipts/crsdbfs/nohup.out

#     nohup $ORACLE_HOME/bin/dbfs_client ggtxp003/not4good@dbfs_ggtxp003 -o rw,direct_io                                   /dbfs_ggtxp003 < /oracle/admin/scripts/clle_dbfscommon/.gg_password &
      nohup $ORACLE_HOME/bin/dbfs_client ggtxp002/not4good@dbfs_ggtxp003 -o $MOUNT_OPTIO                                  NS /dbfs_ggtxp003 < /oracle/admin/scripts/clle_dbfscommon/.gg_password &

#     MOUNT_OPTIONS=rw,direct_io

# This is the original mount command unmodified
# MAKE SURE TO MODIFY THE entry after the @ symbol

# The next line is the original line
#        (nohup $DBFS_CLIENT ${DBFS_USER}@ -o $MOUNT_OPTIONS \
#          $MOUNT_POINT < $DBFS_PWDFILE | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &


# MOUNT_TNS as added to the conf file that is read in
########################################################################################
echo
echo $DBFS_USER
echo
echo $MOUNT_TNS
echo
echo $MOUNT_OPTIONS
echo
echo


#       (nohup $DBFS_CLIENT ${DBFS_USER}@$MOUNT_TNS -o $MOUNT_OPTIONS \
#          $MOUNT_POINT < $DBFS_PWDFILE | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &

    fi
  ### if wallet is true, mount with this command
  elif [ "$WALLET" = true ]; then
    logit info "doing mount $MOUNT_POINT using SID $ORACLE_SID with wallet now"
    (nohup $DBFS_CLIENT /@${DBFS_LOCAL_TNSALIAS} -o $MOUNT_OPTIONS,wallet \
          $MOUNT_POINT | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &
  fi

  ### allow time for the mount table update before checking it
  $SLEEP 1
  $RMF $DBFS_PWDFILE
  ### set return code based on success of mounting
  $SCRIPTPATH status > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    logit info "Start -- ONLINE"
    exit 0
  else
    logit info "Start -- OFFLINE"
    exit 1
  fi

  ;;


############################################################
# MCulp Changed
# Added z to the fusermount options as the u by itself
# was not working correctly
############################################################

'stop')
  $SCRIPTPATH status > /dev/null
  if [ $? -eq 0 ]; then
     logit info "unmounting DBFS from $MOUNT_POINT"
     if [ $LINUX -eq 1 ]; then
        logit info "umounting the filesystem using '$FUSERMOUNT -uz $MOUNT_POINT'"
#       $FUSERMOUNT -u $MOUNT_POINT
        $FUSERMOUNT -uz $MOUNT_POINT

     elif [ $SOLARIS -eq 1 ]; then
        logit info "umounting the filesystem using '$UMOUNT $MOUNT_POINT'"
        $UMOUNT $MOUNT_POINT > /dev/null 2>&1
     fi
     $SCRIPTPATH status > /dev/null
     if [ $? -eq 0 ]; then
        logit error "Stop - stopped, but still mounted, error"
        exit 1
     else
        logit info "Stop - stopped, now not mounted"
        exit 0
     fi
  else
    logit error "filesystem $MOUNT_POINT not currently mounted, no need to stop"
  fi
  ;;


'check'|'status')
### check to see if it is mounted
### fire off a short process in perl to do the check (need the alarm builtin)
logit debug "Checking status now"
$PERL <<'TOT'
   $timeout = $ENV{'PERL_ALARM_TIMEOUT'};
   $SIG{ALRM} = sub {
      ### we have a problem and need to cleanup
      exit 3;
      die "timeout" ;
   };
   alarm $timeout;
   eval {
      $STATUSOUT=`$ENV{'STAT'} -f -c "%T" $ENV{'MOUNT_POINT'} 2>&1 `;
      chomp($STATUSOUT);
      ### added fuseblk check for Linux 6 output
      if ( ( $ENV{'SOLARIS'} == 1 && $STATUSOUT eq 'uvfs' ) ||
           ( $ENV{'LINUX'} == 1   && $STATUSOUT eq 'UNKNOWN (0x65735546)' ) ||
           ( $ENV{'LINUX'} == 1   && $STATUSOUT eq 'fuseblk' ) ) {
         ### status is okay
         exit 0;
      } elsif ( $STATUSOUT =~ /Transport endpoint is not connected/ ) {
        ### we have a problem, need to clean up
        exit 2;
      } else {
        ### filesystem is offline
        exit 1;
      }
    };
TOT

RC=$?
### process return codes from the perl block
if [ $RC -eq 3 ]; then
   STATUS_TIMEOUT=$(( $STATUS_TIMEOUT + 1 ))
   logit error "Found timeout while checking status, cleaning mount automatically"
   $SCRIPTPATH clean
   logit debug "Check -- OFFLINE"
   exit 1
elif [ $RC -eq 2 ]; then
   STATUS_TIMEOUT=$(( $STATUS_TIMEOUT + 1 ))
   logit error "Found error while checking status, cleaning mount automatically"
   $SCRIPTPATH clean
   logit debug "Check -- OFFLINE"
   exit 1
elif [ $RC -eq 1 ]; then
    logit debug "Check -- OFFLINE"
    exit 1
elif [ $RC -eq 0 ]; then
    logit debug "Check -- ONLINE"
    exit 0
fi
;;

'restart')
  logit info "restarting DBFS"
  $SCRIPTPATH stop
  $SLEEP 2
  $SCRIPTPATH start
  ;;

##########################################################################
# clean abort
# MCulp 08/01/2018
# Added z to the fusermount option below
##########################################################################

'clean'|'abort')
   logit info "cleaning up DBFS nicely using (fusermount -u|umount)"

   if [ $LINUX -eq 1 ]; then
      $FUSERMOUNT -u $MOUNT_POINT
   elif [ $SOLARIS -eq 1 ]; then
      $UMOUNT $MOUNT_POINT > /dev/null 2>&1
   fi

   $SLEEP 1
   FORCE_CLEANUP=0

   if [ $STATUS_TIMEOUT -gt 1 ]; then
      FORCE_CLEANUP=1
   else
      $SCRIPTPATH status > /dev/null
      if [ $? -eq 0 ]; then FORCE_CLEANUP=1; fi
   fi


   if [ $FORCE_CLEANUP -eq 1 ]; then
      logit error "tried (fusermount -u|umount), still mounted, now cleaning with (fuser                                  mount -uz -z|umount -f) and kill"

      if [ $LINUX -eq 1 ]; then
         $FUSERMOUNT -u -z $MOUNT_POINT
      elif [ $SOLARIS -eq 1 ]; then
         $ECHO "running umount -f now"
         $UMOUNT -f $MOUNT_POINT > /dev/null 2>&1
      fi

      if [ $LINUX -eq 1 ]; then
         PIDS=`$PS -ef | $GREP -w "$MOUNT_POINT" | $GREP dbfs_client| $GREP -v grep | \
         $AWK '{print $2}'`
         if [ -n "$PIDS" ]; then $KILL -9 $PIDS; fi
         PIDS=`$PS -ef | $GREP -w "$MOUNT_POINT" | $GREP mount.dbfs | $GREP -v grep | \
         $AWK '{print $2}'`
         if [ -n "$PIDS" ]; then $KILL -9 $PIDS; fi
      elif [ $SOLARIS -eq 1 ]; then
         PIDS=`$PS -ef | $GREP dbfs_client| $GREP -v grep | $AWK '{print $2}'`
         REALPIDS=' '
         for pid in $PIDS
         do
            ARGS=`pargs $pid`
            $ECHO $ARGS | $GREP  "$MOUNT_POINT$"  > /dev/null
            RET=$?

            if [ $RET -eq 0 ]; then REALPIDS="$REALPIDS $pid"; fi
         done
        if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi
        ### do it a 2nd time to clean up others
        if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi
        PIDS=`$PS -ef | $GREP dbfs_client| $GREP -v grep | $AWK '{print $2}'`
        REALPIDS=' '
        for pid in $PIDS
        do
           ARGS=`pargs $pid`
           $ECHO $ARGS | $GREP  "$MOUNT_POINT$"  > /dev/null
           RET=$?
           if [ $RET -eq 0 ]; then REALPIDS="$REALPIDS $pid"; fi
        done
        if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi

      fi
      exit 1
   fi
  ;;

'version')
  ### simply show the version
  echo "$VERSION"
  ;;

*)
  $ECHO "Usage: $SCRIPTNAME { start | stop | check | status | restart | clean | abort |                                   version }"
  ;;

esac
EOS

echo "$flnm has been created please review file and modify file....."

###### end of the file