#!/bin/bash
##############################################################################
#
# RSA Command Line Utility wrapper script (Unix)
#
# Copyright (c) 2003-2010 RSA, the Security Division of EMC.
# All rights reserved.
# #RSA_VERSION-ims-riat-1.0.2.1#
#
##############################################################################

SCRIPT_NAME=${0##*/}    # The name of the script based on argument $0
SCRIPT_VERSION=#RSA_VERSION-ims-riat-1.0.2.1#
SCRIPT_DESCRIPTION="RSA Command Line Utility wrapper script"
SCRIPT_COPYRIGHT="Copyright (c) 2003-2010 RSA, the Security Division of EMC. All rights reserved."
PATHSEP=:

UTILS_DIR=${0%/*}        # Directory where the script is located

# Source the environment variables
if [ -f "$UTILS_DIR/rsaenv" ]; then
    . "$UTILS_DIR/rsaenv"
fi

# Set RSA_IMS_HOME if it was not set by rsaenv
if [ -z "$RSA_IMS_HOME" ]; then
    RSA_IMS_HOME=$UTILS_DIR/..
fi

# Try everything we know...
if [ ! -z "$CLU_USER" ]; then
    u=`id 2>/dev/null | cut -d'(' -f2 | cut -d')' -f1`

    if [ "$u" = "" ]; then
        u=$LOGNAME
        if [ "$u" = "" ]; then
            u=$USER
            if [ "$u" = "" ]; then
                u=$USERNAME
            fi
        fi
    fi

    if [ "$u" != "$CLU_USER" ]; then
        echo "Error: Cannot run as user '$u'"
        echo "       'rsautil' can only be run by '$CLU_USER' user"
        exit 1
    fi
fi

if [ ! -d $UTILS_DIR/lib ] || [ ! -d $UTILS_DIR/jars ]; then
    echo "Error: 'lib' or 'jars' directories do not exist in '$UTILS_DIR'."
    exit 1
fi

if [ -z "$PROPERTIES_DIRECTORY" ]; then
    PROPERTIES_DIRECTORY="$UTILS_DIR/etc"
fi

#DATE=`date +%Y%m%d`
uname=`uname`

if [ ! -d "$RSA_IMS_HOME" ]; then
    echo "Error: RSA_IMS_HOME environment variable is not set,"
    echo "       or '$RSA_IMS_HOME' directory does not exist."
    exit 1
fi

# Set up the JDK Arguments
JRE_HOME=${RSA_JRE_HOME:-$JRE_HOME}
RSA_JAVA_HOME=${RSA_JAVA_HOME:-$JRE_HOME}
JAVA_HOME=${RSA_JAVA_HOME:-$JAVA_HOME}
if [ -x "$JAVA_HOME/jre/bin/java" ]; then
    # Setup the Java executable location
    JAVA_EXE="$JAVA_HOME/jre/bin/java"
    # Setup Java Extension Directories
    JAVA_EXT_DIRS="$JAVA_HOME/jre/lib/ext$PATHSEP$UTILS_DIR/jars/drivers"
elif [ -x "$JAVA_HOME/bin/java" ]; then
    # Setup the Java executable location
    JAVA_EXE="$JAVA_HOME/bin/java"
    # Setup Java Extension Directories
    JAVA_EXT_DIRS="$JAVA_HOME/lib/ext$PATHSEP$UTILS_DIR/jars/drivers"
else
    echo "Error: JAVA_HOME or RSA_JAVA_HOME environment variable is not set,"
    echo "       or '$JAVA_HOME/bin/java' does not exist."
    exit 1
fi

JVM_64=0
JVM_OSARGS=-server
case $uname in
    AIX)
    ;;
    CYGWIN*)
        PATHSEP=\;
        RSA_IMS_HOME=`cygpath -w -s "$RSA_IMS_HOME"`
		if [ ! -z "$CATALINA_HOME" ] ; then
			CATALINA_HOME=`cygpath -w -s "$CATALINA_HOME"`
		fi
        JAVA_HOME=`cygpath -w -s "$JAVA_HOME"`
        JAVA_EXE=`cygpath -w -s "$JAVA_EXE"`
    ;;
    *)
        if [ $JVM_64 -eq 1 ]; then
            JVM_OSARGS="$JVM_OSARGS -d64"
        else
            JVM_OSARGS="$JVM_OSARGS -d32"
        fi
    ;;
esac

# This code isn't necessary (yet)
case $uname in
    CYGWIN*)
        PS="ps | grep"
        KILL="/bin/kill -f"
    ;;
    HP-UX)
        test "`tty`" = "not a tty" && NOHUP="/bin/nohup"
        PS="/bin/ps -p"
        KILL=kill
    ;;
    Linux)
        PS=ps
        KILL=kill
    ;;
    SunOS)
        PS=ps
        KILL=kill
        # Increase the open file handle limit for Solaris only
        ulimit -n 1024
    ;;
    *)
        PS="/bin/ps -p"
        KILL=kill
    ;;
esac

generate_classpath() {
    echo "Generating RSAUTIL Class-Path Manifest JAR file."

    cd $UTILS_DIR/jars
    rm -f classpath.jar MANIFEST-CLASSPATH

    echo "Manifest-Version: 1.0" > MANIFEST-CLASSPATH
    echo "Implementation-Vendor: RSA, the Security Division of EMC" >> MANIFEST-CLASSPATH
    echo "Implementation-Title: RSAUTIL Class-Path Manifest JAR File" >> MANIFEST-CLASSPATH
    echo "Implementation-Version: 1.0" >> MANIFEST-CLASSPATH
    echo "Class-Path: " >> MANIFEST-CLASSPATH

    # Note: The extra space before and after the $f is NECESSARY!
    echo " ../resources/ .. " >> MANIFEST-CLASSPATH
    for f in *.jar thirdparty/*.jar ../lib/*.jar
    do
        echo " $f " >> MANIFEST-CLASSPATH
    done

    # Add other fully qualified paths here
    # Remember to put an extra space before and after the file name
    if [ -f $WLS_HOME/lib/weblogic.jar ]; then
        echo " $WLS_HOME/lib/weblogic.jar " >> MANIFEST-CLASSPATH
    fi

    MANIFEST_JAR_BUILDER=`eval echo manifest-jar-builder-*.jar`
    $JAVA_EXE -jar $MANIFEST_JAR_BUILDER classpath.jar MANIFEST-CLASSPATH
    if [ $? -ne 0 ]; then
        echo "Error: Failed to generate RSAUTIL Class-Path Manifest JAR file."
        exit 1
    fi

    rm -f MANIFEST-CLASSPATH
    cd -

    echo "RSAUTIL Class-Path Manifest JAR file generated successfully."
}

debug() {
    echo "RSA_IMS_HOME = $RSA_IMS_HOME"
	echo "CATALINA_HOME = $CATALINA_HOME"
    echo "UTILS_DIR = $UTILS_DIR"
    echo "JAVA_HOME = $JAVA_HOME"
    echo "JAVA_EXE = $JAVA_EXE"
    echo "JAVA_OPTIONS = $JAVA_OPTIONS"
    echo "JAVA_EXT_DIRS = $JAVA_EXT_DIRS"
    echo
}

list() {
    java_directory=$1
    sh_directory=$2

    if [ ! -f $UTILS_DIR/jars/classpath.jar ]; then
        generate_classpath
    fi

    echo 'List of available Command Line Utilities:'
    $JAVA_EXE -cp $UTILS_DIR/jars/classpath.jar $LOG4J_CONF $JAVA_OPTIONS com.rsa.tools.common.CLUVersionList $java_directory

    CLU=`find $sh_directory -type f -name '*.sh' | sed -e "s,$sh_directory/\(.*\).sh,\1,"`
    for clu in $CLU; do
        case "$clu" in
        collect-*)
        ;;
        *)
            echo "$clu"
        ;;
        esac
    done
}

usage() {
    command=$1
    echo "Usage:"
    echo "    $command <CLU-name> [<CLU option flags / arguments>]"
    echo "        set up and execute CLU and pass in CLU arguments listed after CLU name"
    echo "    $command -h,-? [--help]"
    echo "        display rsautil usage"
    echo "    $command -v [--version]"
    echo "        display version and copyright information"
    echo "    $command -X [--debug]"
    echo "        display value of environment variables (RSA_IMS_HOME, JAVA_HOME, etc.)"
    echo "        and possibly other information that might help CLU user debug problem"
    echo "    $command -l [--list]"
    echo "        display a list of available CLUs"
    echo "    $command -g [--generate-classpath]"
    echo "        generate classpath.jar with classpath manifest to locate third party JAR files"
}

version() {
    version=$1
    description=$2
    copyright=$3

    echo "$description $version"
    echo "$copyright"
}

# Standard java option parameters that are passed to all Command Line Utilities.
JAVA_OPTIONS="$JAVA_OPTIONS -DRSA_UTILS_DIR=$UTILS_DIR"
JAVA_OPTIONS="$JAVA_OPTIONS -DRSA_IMS_HOME=$RSA_IMS_HOME"
JAVA_OPTIONS="$JAVA_OPTIONS -DCATALINA_HOME=$CATALINA_HOME"
JAVA_OPTIONS="$JAVA_OPTIONS -Dproperties.directory=$PROPERTIES_DIRECTORY"
JAVA_OPTIONS="$JAVA_OPTIONS -Dnls.directory=$UTILS_DIR/nls"
JAVA_OPTIONS="$JAVA_OPTIONS -Djava.library.path=$UTILS_DIR/lib/$PLATFORM_LIBS"
JAVA_OPTIONS="$JAVA_OPTIONS -Djna.library.path=$JNA_LIBRARY_PATH"
JAVA_OPTIONS="$JAVA_OPTIONS -Djava.ext.dirs=$JAVA_EXT_DIRS"
JAVA_OPTIONS="$JAVA_OPTIONS -Dims.clu=true"

# Setup the default override for log4j logging configuration
LOG4J_CONF="-Dlog4j.configuration=file:$UTILS_DIR/resources/clu-log4j.xml"

if [ "$1" = "" ]; then
    usage $SCRIPT_NAME
    exit 2
fi

while [ "${1:0:1}" = "-" ]; do
    case "$1" in
        -h|-\?|--help)
            usage $SCRIPT_NAME
            exit 2
        ;;
        -g|--generate-classpath)
            generate_classpath
            exit $?
        ;;
        -l|--list)
            list $UTILS_DIR/lib $UTILS_DIR/bin
            exit 0
        ;;
        -v|--version)
            version "$SCRIPT_VERSION" "$SCRIPT_DESCRIPTION" "$SCRIPT_COPYRIGHT"
            exit 0
        ;;
        -S|--script-exit)
            # This is a Windows only option but we must at least acknowledge it
        ;;
        -X|--debug)
            debug
            # Set the debug mode override for log4j logging configuration
            LOG4J_CONF="-Dlog4j.configuration=file:$UTILS_DIR/resources/clu-log4j-debug.xml"
        ;;
        *)
            echo "Invalid command line argument: '$1'"
            usage $SCRIPT_NAME
            exit 2
        ;;
    esac
    shift
done

case "$1" in
    "")
        exit 1
    ;;
    help|usage)
        usage $SCRIPT_NAME
        exit 2
    ;;
    generate-classpath)
        generate_classpath
        exit $?
    ;;
    list)
        list $UTILS_DIR/lib $UTILS_DIR/bin
        exit 0
    ;;
    *)
        CLU_SH=$UTILS_DIR/bin/$1*.sh
        CLU_SH=`eval echo $CLU_SH`
        CLU_JAR=$UTILS_DIR/lib/$1*.jar
        CLU_JAR=`eval echo $CLU_JAR`
        if [ ! -f "$CLU_JAR" ] && [ ! -f "$CLU_SH" ]; then
            # If the simple name without wildcards is a file accept it
            if [ -f "$UTILS_DIR/lib/$1.jar" ]; then
                CLU_JAR=$UTILS_DIR/lib/$1.jar
            else
                count=0
                for clu_jar in $CLU_JAR; do
                    clu=${clu_jar#$UTILS_DIR/lib/}
                    clu=${clu%.jar}
                    if [ ! -f $clu_jar ]; then
                        echo "Invalid argument. '$1' is not a valid Command Line Utility."
                        echo "Type '$SCRIPT_NAME --list' for a full list."
                    else
                        test $count -eq 0 && echo "Invalid argument. Multiple CLU's starting with '$1' found:"
                        count=$((count+1))
                        echo "	$clu"
                    fi
                done
                exit 1
            fi
        fi
    ;;
esac
shift

if [ -f "$CLU_SH" ]; then
    UTILS_DIR=$UTILS_DIR \
    RSA_IMS_HOME=$RSA_IMS_HOME \
    RSA_JAVA_HOME=$JAVA_HOME \
    JAVA_HOME=$JAVA_HOME \
    JAVA_EXT_DIRS=$JAVA_EXT_DIRS \
    JAVA_OPTIONS=$JAVA_OPTIONS $CLU_SH "$@"
    exit $?
fi

if [ ! -f $UTILS_DIR/jars/classpath.jar ]; then
    generate_classpath
fi

umask 0077 # Files generated by the CLU will have no permissions for group and others
$JAVA_EXE -cp $UTILS_DIR/jars/classpath.jar $LOG4J_CONF $JAVA_OPTIONS -jar $CLU_JAR "$@" || exit $?

exit 0
# vim: sw=4 ts=4 nowrap
