#!/bin/sh
# cms           Start and Stops Watchpoint Content Management System Services
#
# Authors:      Matthew Kruer <matthew.kruer@ericsson.com>
#
# description:  Ericsson / SA Media Watchpoint CMS Start Up Script
# processname:  org.jacorb.naming.NameServer (java)
# processname:  org.jboss.Main (java)
# config:       NONE
# pidfile:      NONE

### BEGIN INIT INFO
# Should-Start: $remote_fs $network
# Required-Start: alerts sshd
# Provides: cms
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Content Management System Server
### END INIT INFO

PRODUCT_HOME=/opt/tandbergtv/cms
ACS_SERVER_HOME=/usr/local/acsserver
JAVA_HOME=/usr/java/default/bin
JSTACK_CMD=$JAVA_HOME/jstack

#define the user under which jboss will run, or use RUNASIS to run as the current user
JBOSSUS=${JBOSSUS:-"nobody"}

if [ "$JBOSSUS" = "RUNASIS" ]; then
    SUBIT=""
else
    SUBIT="su $JBOSSUS -c "
fi

PROGNAME=`basename $0`

#define where jboss is - this is the directory containing directories log, bin, conf etc
JBOSS_HOME=${JBOSS_HOME:-"$PRODUCT_HOME/jboss"}

if [ ! -d "$JBOSS_HOME" ]; then
    echo JBOSS_HOME does not exist as a valid directory : $JBOSS_HOME
    exit 1
fi

# Setup the java endorsed dirs
JBOSS_ENDORSED_DIRS="$JBOSS_HOME/lib/endorsed"

#define the classpath for the shutdown class
JBOSSCP=${JBOSSCP:-"$JBOSS_HOME/bin/shutdown.jar"}

# Setup the classpath
JBOSS_BOOT_CLASSPATH="$JBOSS_HOME/bin/run.jar"
JBOSS_CLASSPATH="$JBOSS_BOOT_CLASSPATH:$PRODUCT_HOME/workflow/lib:/usr/local/platform/lib/SignatureVerifier.jar"

# Setup properties
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.tandbergtv.cms.product.dir=$PRODUCT_HOME -Xmx48g -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=512m -XX:StackShadowPages=20 -Dcom.tandbergtv.workflow.message.origin=true"
JAVA_OPTS="$JAVA_OPTS -Dhibernate.dialect=org.hibernate.dialect.Oracle10gDialect"
JAVA_OPTS="$JAVA_OPTS -Dnetworkaddress.cache.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"

CMD_START="java -server $JAVA_OPTS -Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" -classpath "$JBOSS_CLASSPATH" org.jboss.Main "$1" --configuration=standard -b 0.0.0.0"
CMD_STOP="java -server -classpath $JBOSSCP org.jboss.Shutdown --shutdown"

# Checks to see if the license key is installed
licensekey_check() 
{
    if [[ ! -f "/opt/tandbergtv/cms/conf/workflow/licensekey.lic" ]] ; then
        printf "  CMS license key not found; Aborting start up of CMS\n"
        exit 1
    fi
}

# Checks to see if alerts services are running
alerts_check() 
{
    nameserver_pid=$(ps axww | grep "[o]rg.openorb.ins.Server" | sed -e 's/^\s*//' | cut -d' ' -f1)
    settingsserver_pid=$(ps axww | grep "[c]om.n2bb.SSModule.SettingsServer" | sed -e 's/^\s*//' | cut -d' ' -f1)
    alerts_pid=$(ps axww | grep "[c]om.n2bb.AlertsModule.AlertServer" | sed -e 's/^\s*//' | cut -d' ' -f1)
    if [[ -z "${nameserver_pid}" ]] || [[ -z "${settingsserver_pid}" ]] || [[ -z "${alerts_pid}" ]] ; then
        printf "  The required service Alerts has not started; Unable to start Content Management System Services\n"
        exit 1
    fi
}

adinameserver() 
{
    if [[ -d "$ACS_SERVER_HOME" ]] ; then #Check if ACSServer is installed
        pid=$(ps axww | grep "[o]rg.jacorb.naming.NameServer" | sed -e 's/^\s*//' | cut -d' ' -f1)
        if [[ -z "${pid}" ]] && [[ "start" = $1 ]] ; then
            printf "  Starting ADI NameServer \n"
            "$ACS_SERVER_HOME/scripts/AdiNameService" $1 >/dev/null 2>&1 &
        elif [[ -n "${pid}" ]] && [[ "stop" = $1 ]] ; then
            printf "  Stopping ADI NameServer"
            "$ACS_SERVER_HOME/scripts/AdiNameService" $1 >/dev/null 2>&1 &
            sleep_dots 3
        elif [[ -n "${pid}" ]] && [[ "status" = $1 ]]; then
            printf "  ADI NameServer (pid "$pid") is running \n"
        elif [[ -z "${pid}" ]] && [[ "status" = $1 ]]; then
            printf "  ADI NameServer is stopped \n"
        else
            exit 1
        fi
    else
        printf "  ADI NameServer Not Installed\n"
    fi
}

cms() 
{
    pid=$(ps axww | grep "[o]rg.jboss.Main" | sed -e 's/^\s*//' | cut -d' ' -f1)
    if [[ -z "${pid}" ]] && [[ "start" = $1 ]] ; then
        printf "  Starting CMS Service"
        $SUBIT "env LANG=en_US.UTF-8 $CMD_START >/dev/null 2>&1 &"
        sleep_dots 5
    elif [[ -n "${pid}" ]] && [[ "stop" = $1 ]] ; then
        printf "  Stopping CMS Service"
        $SUBIT "$JSTACK_CMD -l $pid" > $PRODUCT_HOME/cms_stackdump.txt
        $SUBIT "$CMD_STOP >/dev/null 2>&1 &"
        cms_shutdown_check
        cms_shutdown_cleanup
    elif [[ -n "${pid}" ]] && [[ "status" = $1 ]]; then
        printf "  CMS Service (pid "$pid") is running \n"
    elif [[ -z "${pid}" ]] && [[ "status" = $1 ]]; then
        printf "  CMS Service is stopped\n"
    else
        exit 1
    fi
}

cms_shutdown_check() 
{
    count=0
    delay=1
    timeout=30
    while [[ $count -le "$timeout" ]] ; do
        sleep $delay
        pid=$(ps axww | grep "[o]rg.jboss.Main" | sed -e 's/^\s*//' | cut -d' ' -f1)
        if [[ -n "$pid" ]] && [[ $count -ge $timeout ]]; then
            printf " killing process $pid"
            kill -9 $pid
        elif [[ -n "$pid" ]]  ; then
            printf "."
            count=$(( $count + $delay ))
        else
            count=$(( $count + $timeout ))
        fi
    done
    printf "\n"
}

cms_shutdown_cleanup() 
{
    #printf "  Purging temporary jboss files... This may take a while\n"
    if [[ "$(ls -A /opt/tandbergtv/cms/jboss/server/standard/tmp)" ]] ; then
        `find /opt/tandbergtv/cms/jboss/server/standard/tmp/* -name '*' -print0 | xargs -0 rm -rf`
    fi
    #printf "  Purging temporary jboss files complete.\n"
}

sleep_dots() 
{
    for (( start = 1; start <= $1; start++ )); do
        printf "."
        sleep 1
    done
    printf "\n"
}

case "$1" in
    start)
        printf "Starting Content Management System Services: \n"
        licensekey_check
        #alerts_check
        adinameserver $1
        cms $1
        $0 status
        ;;
    stop)
        printf "Stopping Content Management System Services: \n"
        cms $1
        adinameserver $1
        $0 status
        ;;
    status)
        printf " Status of Content Management System Services: \n"
        adinameserver $1
        cms $1
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        printf "Usage: $0 ( start | stop | status | restart ) \n"
        exit 1
        ;;
esac
exit 0

