#! /bin/sh
#
# Copyright 2000-2002 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# @version "@(#)wcfmver.sh  1.11   02/10/04 SMI"
#
# This script is responsible for invoking the wcfmver utility.
#

#
# Some underived constants
# =====================================================================
HOSTFLAG="--host"
PORTFLAG="-p"
CONFIGFLAG="-c"
NODESFLAG="-n"
FM_BASE_DIR_FLAG="-fm_base_dir"
FM_DATA_DIR_FLAG="-fm_data_dir"
SHOW_USAGE_FLAG="--showusage"

FM_PKG=SUNWwcfmu
FM_PKG_DIR=SUNWwcfm

CLASSES=classes
JARFILE=wcfmver.jar
JDOMJAR=jdom.jar
XERCESJAR=xerces.jar
FMJAR=wcfm.jar
SCJAR=sc_shared.jar
DCJAR=RSMDirectConnect.jar
WCIXJAR=RSMWcixSwitch.jar
WCIXSHJAR=wcix_shared.jar

DATA_DIR_FILENAME="wcfm_base_data_dir.cfg"
CMD_LOG_FILE="wcfmver.log"

LOG_AND_CONFIG_DIR="config"
LOG_DIR="log"
FM_DTD_FILE_DIR=dtds
VERCFGSWITCH=-config

APP="tools.wcfmver.WildcatFMVer"

SHOW_USAGE=0
# =====================================================================


#
# Small function to set the FABRIC_NAME variable to be the last arg on the
# command line
set_fabric_name()
{
  TMP=""
  while [ -n "$1" ]
  do
    TMP=$1
    shift
  done

  FABRIC_NAME=$TMP
  
  if [ -z "$FABRIC_NAME" ] ; then
    echo "You must provide the fabric name"
    SHOW_USAGE=1
  fi
  
  return $SHOW_USAGE
}

#
# Function to check for config path setting, which we will have to set read
# permissions for
check_config_file()
{
  TMP=""
  while [ -n "$1" ]
  do
    TMP=$1
    if [ "${TMP}" = "${CONFIGFLAG}" ] ; then
      XMLCFGPATH=$2
      return
    fi
    
    shift
  done
}

#
# Function to find & verify the FM packages & related stuff
find_fm_package()
{

  FM_BASE_DIR=`/usr/bin/pkgparam ${FM_PKG} BASEDIR`
  FM_INFO_BASE_DIR=`/usr/bin/cat ${FM_BASE_DIR}/${FM_PKG_DIR}/${LOG_AND_CONFIG_DIR}/wcfm_base_data_dir.cfg`  

  # Set up the Java classpath
  CLASSES_DIR=${FM_BASE_DIR}/${FM_PKG_DIR}/${CLASSES}
  CLASS_LOC=${CLASSES_DIR}/${JARFILE}:${CLASSES_DIR}/${FMJAR}:${CLASSES_DIR}/${SCJAR}:${CLASSES_DIR}/${JDOMJAR}:${CLASSES_DIR}/${XERCESJAR}:${CLASSES_DIR}/${DCJAR}:${CLASSES_DIR}/${WCIXJAR}:${CLASSES_DIR}/${WCIXSHJAR};

  # Set up our logfile
  LOG_FILE="${FM_INFO_BASE_DIR}/${FABRIC_NAME}/${LOG_DIR}/${CMD_LOG_FILE}"
  if [ -f  "${LOG_FILE}" ]; then
    /usr/bin/rm ${LOG_FILE}
  fi
}

#
# Verify that the fabric's configuration exists.  Also set the LOG_FILE variable
# so we can record what we're doing.
verify_fabric()
{

  FM_CFG_DIR="${FM_INFO_BASE_DIR}/${FABRIC_NAME}"
  if [ ! -d "${FM_CFG_DIR}" ]; then
    echo "Error: the configuration directory \"${FM_CFG_DIR}\" does not exist."
    echo "Run \"createfabric ${FABRIC_NAME}\" to construct a new fabric."
    SHOW_USAGE=1
  fi

}

#
# Create a temporary policy file to use
# Set the policy file to be able to read the xml config file and dtd
create_policy()
{
  POLICY_FILE="/tmp/wcfmver.policy.java"
  if [ -f  "${POLICY_FILE}" ]; then
    /usr/bin/rm ${POLICY_FILE}
  fi

  echo "grant {" >> $POLICY_FILE
  if [ -n "${XMLCFGPATH}" ]
    then
    echo "  permission java.io.FilePermission \"${XMLCFGPATH}\", \"read\";" >> $POLICY_FILE
  fi

  echo "  permission java.io.FilePermission \"${FM_BASE_DIR}/${FM_PKG_DIR}/${FM_DTD_FILE_DIR}/*\", \"read\";" >> $POLICY_FILE
  echo "  permission java.net.SocketPermission \"*\", \"connect, resolve, listen, accept\";" >> $POLICY_FILE
  echo "  permission java.io.FilePermission \"${FM_INFO_BASE_DIR}/security.info\", \"read, execute\";" >> $POLICY_FILE
  echo "};" >> $POLICY_FILE

  echo "Created policy file \"${POLICY_FILE}\"" >> ${LOG_FILE}

}

#
# Function to find & verify the Java VM is available, and set up the needed
# variables
find_java()
{

  JAVA_BIN_NV=`/usr/bin/cat ${FM_BASE_DIR}/${FM_PKG_DIR}/${LOG_AND_CONFIG_DIR}/jre_home.cfg | /usr/bin/grep JAVA_BIN | /usr/bin/grep -v \#`
  echo "JAVA_BIN_NV = ${JAVA_BIN_NV}" >> ${LOG_FILE}
  JAVA_BIN=`echo ${JAVA_BIN_NV} | /usr/bin/cut -d = -f2`
  echo "JAVA_BIN = ${JAVA_BIN}" >> ${LOG_FILE}

  if [ -n "${JAVA_BIN}" ]; then
    JAVA="${JAVA_BIN}java"
    JAVA_VERSION=`${JAVA} -version 2>&1`
    echo "Using java version: \"${JAVA_VERSION}\"" >> ${LOG_FILE}
  else
    echo "ERROR: no valid JVM specified.  Please specify one in the \"${FM_BASE_DIR}/${FM_PKG_DIR}/${LOG_AND_CONFIG_DIR}/jre_home.cfg\" file"
    exit 1
  fi

}

#
# Function to launch the Java VM & display the usage message.
show_java_usage()
{

  JAVA_BIN_NV=`/usr/bin/cat ${FM_BASE_DIR}/${FM_PKG_DIR}/${LOG_AND_CONFIG_DIR}/jre_home.cfg | /usr/bin/grep JAVA_BIN | /usr/bin/grep -v \#`
  JAVA_BIN=`echo ${JAVA_BIN_NV} | /usr/bin/cut -d = -f2`

  if [ -n "${JAVA_BIN}" ]; then
    JAVA="${JAVA_BIN}java"
    JAVA_VERSION=`${JAVA} -version 2>&1`
  else
    echo "ERROR: no valid JVM specified.  Please specify one in the \"${FM_BASE_DIR}/${FM_PKG_DIR}/${LOG_AND_CONFIG_DIR}/jre_home.cfg\" file"
    exit 1
  fi

  RUN="${JAVA} -Djava.security.policy=${POLICY_FILE} -classpath ${CLASS_LOC} ${APP} ${SHOWUSAGE}"

  ${RUN}

}

#
# Actually run the application
run_app()
{

  # Add the FM data dir to the commands for security purposes.
  CMDOPTIONS="${FM_BASE_DIR_FLAG} ${FM_BASE_DIR} ${FM_DATA_DIR_FLAG} {$FM_INFO_BASE_DIR}"

  RUN="${JAVA} -Djava.security.policy=${POLICY_FILE} -classpath ${CLASS_LOC} ${APP} ${CMDOPTIONS} $*"

  echo >> ${LOG_FILE}
  echo "${RUN}" >> ${LOG_FILE}
  echo >> ${LOG_FILE}
  ${RUN}

}


#
# =========================================================================
# START OF MAIN
# =========================================================================
#

set_fabric_name $*
check_config_file $*
find_fm_package
verify_fabric

if [ $SHOW_USAGE -ne 0 ] ; then

  show_java_usage

else

  find_java
  create_policy

  # Start it up
  run_app $*

fi
