#!/bin/sh
# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. 
# Ops Center Harvester for Oracle Configuration Manager

MAIN="oracle.sysman.ccr.ocharvester.OpsCenterHarvester"
FORCE=
UPDATE=
ALT_OCM_HOME=
DEBUGLVL="INFO"
SHOWENV=

# Default OCM location on Enterprise Controller, per Ops Center installation
OCM_HOME=/var/opt/sun/xvm/ocm

addclasspath() {
    tgtjar=$1
    if [ ! -f $tgtjar ]; then
       echo "Error:  Required jar \"${tgtjar}\" not found"
       exit 1
    else
       XCLASSPATH=${XCLASSPATH}:${tgtjar}
    fi
}

addclasspath_by_os() {
    jpathsym="$1_${TGTOS}"
    eval tgtjarpath=\$$jpathsym
    tgtjar="${tgtjarpath}/$2"
    if [ ! -f $tgtjar ]; then
       echo "Error:  Required jar \"${tgtjar}\" not found"
       exit 1
    else
       XCLASSPATH=${XCLASSPATH}:${tgtjar}
    fi
}

opscenter_version() {
    release=
    version=

    vmain="oracle.sysman.ccr.ocharvester.OpsCenterVersion"
    results=`${JVM} -classpath "${XCLASSPATH}" "${vmain}"`
    if [ $? -eq 0 ]; then
        release=`echo "$results" | awk 'NR==1' 2>/dev/null`
        version=`echo "$results" | awk 'NR==2' 2>/dev/null`
    fi
}

# Simple sanity-check that OCM is fully installed and configured
check_ocm_install() {
    tgtocmdir=$1
    if [ ! -x $tgtocmdir/ccr/bin/configCCR ]; then
       echo "Error:  Oracle Configuration Manager not found at: $tgtocmdir"
       exit 1
    fi
}

# Simple sanity-check that this is a Ops Center Enterprise Controller
check_oc_install() {
    ERRPKG=1
    case "$TGTOS" in
        LINUX) 
           rpm -q sun-xvm-xvmocbui 1>/dev/null 2>&1
           ERRPKG=$?
           ;;
        SOLARIS)       
           pkginfo -q SUNWxvmocbui
           ERRPKG=$?
           ;;
        *)
           ;;
    esac

    if [ "$ERRPKG" -ne 0 ]; then
        echo "Error:  This system is not an Ops Center Enterprise Controller"
        exit 1
    fi
}

# Solaris locations of jars needed by the Harvester
OC_HOME_SOLARIS=/opt/sun/n1gc/lib
OC_HOME_XVM_SOLARIS=/opt/sun/xvm/lib
OC_CONNMGT_HOME_SOLARIS=/opt/SUNWscnsatmgmt/lib
OC_CONNMGT_USR_HOME_SOLARIS=/usr/share/lib/scn
CACAO_HOME_SOLARIS=/usr/lib/cacao/lib
JDMK_HOME_SOLARIS=/opt/SUNWjdmk/5.1/lib

# Linux locations of jars needed by the Harvester
OC_HOME_LINUX=/opt/sun/n1gc/lib
OC_HOME_XVM_LINUX=/opt/sun/xvm/lib
OC_CONNMGT_HOME_LINUX=/opt/sun/sun-scn-satmgmt/lib
OC_CONNMGT_USR_HOME_LINUX=/usr/share/lib/scn
CACAO_HOME_LINUX=/opt/sun/cacao2/share/lib
JDMK_HOME_LINUX=/opt/sun/cacao2/me/support_lib

#
# Main
#

TGTOS=
UNAMES=`/bin/uname -s`
if [ "$UNAMES" = "SunOS" ]; then
   TGTOS=SOLARIS
elif [ "$UNAMES" = "Linux" ]; then
   TGTOS=LINUX
else
   echo "Unrecgonized Operating System ("$UNAMES"); Cannot proceed"
   exit 1
fi

PATH=
if [ "$TGTOS" = "SOLARIS" ]; then
   PATH=${PATH}:/usr/bin
   PATH=${PATH}:/usr/sbin
else
   PATH=${PATH}:/bin
   PATH=${PATH}:/usr/bin
   PATH=${PATH}:/usr/sbin
   PATH=${PATH}:/opt/sun/cacao2/bin
fi

while getopts "fuh:d:e" opt
do
    case $opt in
        f) FORCE="-f" ;;
        h) ALT_OCM_HOME=$OPTARG ;;
        d) DEBUGLVL=$OPTARG ;;
        u) UPDATE="-u" ;;
        e) SHOWENV="-e" ;;
        *) gettext "Unknown option "$OPTARG"\n"
           exit 1
    esac
done

OCM_HOME_ARG=
if [ ! -z "${ALT_OCM_HOME}" ]; then
   OCM_HOME_ARG="${ALT_OCM_HOME}"
   OCM_HOME=${ALT_OCM_HOME}
fi

# Quick sanity checks that OCM and Ops Center are fully installed.
check_ocm_install "${OCM_HOME}"
check_oc_install

# Always use the same JDK as EC Cacao is using.
java_param=`cacaoadm get-param -i oem-ec java-home`
if [ $? -eq 0 ]; then
    JAVA_HOME=`echo ${java_param} | awk -F'=' '{print $2}'`
else
    echo "Error:  Unable to resolve JDK location via Cacao"
    exit 1
fi

JVM=${JAVA_HOME}/bin/java
if [ ! -x "${JVM}" ]; then
    echo "Error:  Cannot find Java at: ${JAVA_HOME}"
    exit 1
fi

ARGS="${FORCE} ${UPDATE} ${SHOWENV} ${DEBUGLVL} ${OCM_HOME_ARG}"

# OS-independent JAR location(s)
OCM_LIB_HOME=${OCM_HOME}/ccr/lib

# Build $CLASSPATH, ensuring every jar is present
PWD=`pwd`
XCLASSPATH=

# Core Ops Center 
addclasspath_by_os OC_HOME domain.jar
addclasspath_by_os OC_HOME gear.jar
addclasspath_by_os OC_HOME mos.jar
addclasspath_by_os OC_HOME pkgdeployment-impl.jar
addclasspath_by_os OC_HOME scn-jobmanager-common-api.jar
addclasspath_by_os OC_HOME svrmgmt.jar
addclasspath_by_os OC_HOME svccommon.jar
addclasspath_by_os OC_HOME user.jar
addclasspath_by_os OC_HOME virt.jar
addclasspath_by_os OC_HOME commons-httpclient-3.0.jar
addclasspath_by_os OC_HOME_XVM xvmoc-client.jar
addclasspath_by_os OC_HOME_XVM scn-ucecommon.jar

# Ops Center Connection management
addclasspath_by_os OC_CONNMGT_HOME scn-common.jar
addclasspath_by_os OC_CONNMGT_HOME scn-vo.jar
addclasspath_by_os OC_CONNMGT_USR_HOME scn-connmgt.jar

# Cacao-related
addclasspath_by_os CACAO_HOME cacao_cacao.jar
addclasspath_by_os CACAO_HOME cacao_rmi.jar
addclasspath_by_os JDMK_HOME jmxremote_optional.jar

# Oracle Configuration Manager-related
addclasspath ${OCM_LIB_HOME}/emCCR.jar
addclasspath ${OCM_LIB_HOME}/emocmclnt-14.jar
addclasspath ${OCM_LIB_HOME}/emocmclnt.jar
addclasspath ${OCM_LIB_HOME}/http_client.jar
addclasspath ${OCM_LIB_HOME}/jcert.jar
addclasspath ${OCM_LIB_HOME}/jsse.jar
addclasspath ${OCM_LIB_HOME}/log4j-core.jar
addclasspath ${OCM_LIB_HOME}/ojpse.jar
addclasspath ${OCM_LIB_HOME}/osdt_jce.jar
addclasspath ${OCM_LIB_HOME}/xml.jar
addclasspath ${OCM_LIB_HOME}/xmlparserv2.jar
addclasspath ${OCM_LIB_HOME}/regexp.jar
addclasspath ${OCM_LIB_HOME}/emgcharvester.jar
addclasspath ${OCM_LIB_HOME}/OpsCenterHarvester.jar

# Conditional JAR inclusion for later Ops Center versions
opscenter_version
if [ ! -z "$release" ]; then
    if [ "ECHELON" != "$release" ]; then
        addclasspath_by_os OC_HOME_XVM xvm-client.jar
        addclasspath_by_os OC_HOME bootenv.jar
    fi
fi

exec ${JVM} -classpath "${XCLASSPATH}" "${MAIN}" ${ARGS}
