#!/bin/sh
#
# Shell functions for managing the startup and shutdown
# of the management framework.
#
# Copyright 2001. Spinnaker Networks Inc. All Rights Reserved
#
HOMEDIR=`(cd "$BASEDIR/.."; pwd )`;

export PATH="/usr/spinmgmt/bin:/sbin:/usr/sbin:/bin:/usr/bin:$PATH"

export CLASSPATH="${HOMEDIR}/lib/tomcat-properties.jar:${HOMEDIR}/lib/servlet-properties.jar:${HOMEDIR}/lib/jasper-properties.jar:${HOMEDIR}/lib/spin-config-properties.jar";

# initialize the garbage collector heap to 20 meg
# and tell the garbage collector to ignore GCJ type information for a 
# fully conservative collector.
export GC_INITIAL_HEAP_SIZE=20971520

# if using the 3.3.1 compiler or later, use GCJ's Java object information
# as part of the garbage collection...
#export GC_IGNORE_GCJ_INFO=1

# don't print stats
#export GC_PRINT_STATS=1

# print garbage collection events
export GC_PRINT_GC_EVENT=1


# have the memory allocated in between the shared linked libraries (and 
# other memory allocations) starting at 0 and the pthread stacks that grow
# down from 0x80000000...
# Don't do this for non-SpinServer OSes since some dynamic link loaders
# get confused....
export GC_FIXED_HEAP_START=0x40000000

export DAEMON_LOG_FILE=/var/spinmgmt/logs/java_runtime.log
#
# clear out some flags
#
noInitLog=false
noDaemon=false
doGdbStartup=false


#
# Parses the options passed in on the command line and found in the options file
#
#
optparse() {
    varLoop=$@
      case ${varLoop} in
	  rdb.dir=*|-Drdb.dir=*)
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      RDBDIR=`echo "$varLoop" | sed -n -e 's/.*=\(.*\)/\1/p'`;
	      export RDB_DIR="${RDBDIR}";
	      ;;
	  rdb.site.id=*|-Drdb.site.id=*)
	      if [ -n "${RDBXXX}" ]; then
		  echo '${0}: Cannot mix arguments for RDB static and dynamic site list modes';
		  echo '       RDB_XXX defined, cannot define RDB site ID';
		  return 1;
	      fi
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      RDBSITEID=`echo "$varLoop" | sed -n -e 's/.*=\(.*\)/\1/p'`;
	      ;;
	  rdb.site.list=*|-Drdb.site.list=*)
	      if [ -n "${RDBXXX}" ]; then
		  echo '${0}: Cannot mix arguments for RDB static and dynamic site list modes';
		  echo '       RDB_XXX defined, cannot define RDB site list';
		  return 1;
	      fi
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      RDBSITELIST=`echo "$varLoop" | sed -n -e 's/.*=\(.*\)/\1/p'`;
	      ;;
	  rdb.xxx=*|-Drdb.xxx=*)
	      if [ -n "${RDBSITELIST}" -o -n "${RDBSITELIST}" ]; then
		  echo '${0}: Cannot mix arguments for RDB static and dynamic site list modes';
		  echo '       RDB site list or site ID defined, cannot define RDB_XXX';
		  return 1;
	      fi
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      RDBXXX=`echo "$varLoop" | sed -n -e 's/.*=\(.*\)/\1/p'`;
	      export RDB_XXX="${RDBXXX}";
	      ;;
	  spin.mgmt.dir=*|-Dspin.mgmt.dir=*)
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      SPINMGMTDIR=`echo "$varLoop" | sed -n -e 's/.*=\(.*\)/\1/p'`;
	      export SPINMGMT_DIR="${SPINMGMTDIR}";
	      ;;
	  -D*=*)
	      j=`echo "$varLoop" | sed -n -e 's/-D\(.*\)$/\1/p'`;
	      GCJPROPERTIES="${GCJPROPERTIES} $j";
	      ;; 
	  *=*)
	      GCJPROPERTIES="${GCJPROPERTIES} $varLoop";
	      ;;
	  -fgDebug)
	      noDaemon=true;
	      ;;
	  -gdb)
	      noDaemon=true;
	      doGdbStartup=true;
	      ;;
	  *)
	      TOMCATOPTIONS="${TOMCATOPTIONS} $varLoop";
	      ;;
      esac
}

startTomcat() {

    export GCJPROPERTIES=${GCJPROPERTIES:-""};
    TOMCATOPTIONS="";
    RDBPROP="";
    RDBDIR="";
    RDBSITEID="";
    RDBSITELIST="";
    RDBXXX="";
    SPINMGMTPROP="";
    SPINMGMTDIR="";

    # kill any errant c++filt processes hanging about.
    killproc "${HOMEDIR}/bin/c++filt" > /dev/null 2>&1;
    killproc "/bin/addr2line" > /dev/null 2>&1;

    # kill any stunnel processes hanging about
    killproc "/usr/sbin/stunnel" > /dev/null 2>&1;

    PID=`getParentPid "${HOMEDIR}/bin/Tomcat"`;
    RETVAL=$?
    if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	 echo "spinmgmt (pid ${PID}) is already running. "
	 return -1;
    fi

    #
    # Process java system properties and add them to
    # the GCJ_PROPERTIES. These properties are additive
    # and do not override any properties already defined
    # in the GCJ_PROPERTIES variable.
    #
    for i in $*
    do
      optparse ${i}
    done

    noInitLog=true;

    if [ -z "${RDBDIR}" ]; then
       if [ -z "${RDB_DIR}" ]; then
          RDBDIR="/var/spinmgmt/rdb";
	  export RDB_DIR="${RDBDIR}";
       else 
          RDBDIR="${RDB_DIR}";
       fi 
       GCJPROPERTIES="${GCJPROPERTIES} rdb.dir=${RDBDIR}";
    fi

    if [ ! -d "${RDBDIR}" ]; then
       mkdir -p $RDBDIR;
       if [ $? -ne 0 ]; then
	    return -1;
       fi
    fi

    if [ -z "${RDBSITELIST}" -a -z "${RDBSITEID}" ]; then
	#default to using RDB_XXX mode
	if [ -z "${RDBXXX}" ]; then
	    RDBXXX="1";
	fi
	export RDB_XXX="${RDBXXX}"
	GCJPROPERTIES="${GCJPROPERTIES} rdb.xxx=${RDBXXX}";
    else
	#run in the old static site list mode
	if [ -z "${RDBSITEID}" ]; then
	    if [ -z "${RDB_LOCAL_SITE_FILE}" ]; then
		RDBSITEID="/var/spinmgmt/rdb/cluster/siteid";
		export RDB_LOCAL_SITE_FILE="${RDBSITEID}";
	    else 
		RDBSITEID="${RDB_LOCAL_SITE_FILE}";
		export RDB_LOCAL_SITE_FILE="${RDBSITEID}";
	    fi 
	    GCJPROPERTIES="${GCJPROPERTIES} rdb.site.id=${RDBSITEID}";
	fi
	
	if [ -z "${RDBSITELIST}" ]; then
	    if [ -z "${RDB_SITE_LIST_FILE}" ]; then
		RDBSITELIST="/var/spinmgmt/rdb/cluster/sitelist";
		export RDB_SITE_LIST_FILE="${RDBSITELIST}";
	    else 
		RDBSITELIST="${RDB_SITE_LIST_FILE}";
		export RDB_SITE_LIST_FILE="${RDBSITELIST}";
	    fi 
	    GCJPROPERTIES="${GCJPROPERTIES} rdb.site.list=${RDBSITELIST}";
	fi
    fi

    if [ -z "${SPINMGMTDIR}" ]; then
        if [ -z "${SPINMGMT_DIR}" ]; then
	   SPINMGMTDIR="/var/spinmgmt";
           export SPINMGMT_DIR="${SPINMGMTDIR}";
        else 
	   SPINMGMTDIR="${SPINMGMT_DIR}";
        fi
        GCJPROPERTIES="${GCJPROPERTIES} spin.mgmt.dir=${SPINMGMTDIR}";
    fi;

    if [ ! -d "${SPINMGMTDIR}" ]; then
        mkdir -p ${SPINMGMTDIR};
        if [ $? -ne 0 ]; then
	   return -1;
        fi
    fi

    LOGFILE="${SPINMGMTDIR}/log/messages";
    if [ -f "${LOGFILE}" ]; then
        file "${LOGFILE}" | grep -q "Java serialization"
	if [ $? -eq 0 ]; then
	    SpinLogReader.exe -x ${LOGFILE} > ${SPINMGMTDIR}/log/messages.xml;
	    if [ $? -ne 0 ]; then
	       echo "Error: /var/spinmgmt/log/messages to XML - resetting log cache file.";
	       rm -f  ${SPINMGMTDIR}/log/messages.xml;
	    fi
	    rm -f ${LOGFILE};
	else
	    echo "Error: /var/spinmgmt/log/messages is not a log cache file."
	    rm -f ${LOGFILE};
	fi
    fi

    export GCJ_PROPERTIES="${GCJPROPERTIES} ${GCJ_PROPERTIES}  cim.mof=${HOMEDIR}/mof/ cim.password=${HOMEDIR}/conf/cim.password";

    # preload yp bind rsv port module so we can 
    # work around ip chains issues.
    export LD_PRELOAD=/usr/spinmgmt/lib/libbindresvport.so

    #
    # Save out pid in a tmp file incase someone
    # wants to find it. Note that since we are exec'ing
    # Tomcat the pid will be the pid of this shell.
    if [ "$BOOTUP" = "verbose" ]; then
       echo "Tomcat -home ${HOMEDIR} ${TOMCATOPTIONS} [ ${GCJ_PROPERTIES} ]";
    fi
    
    if [ "$noDaemon" = "false" ]; then
        # daemonize Tomcat
        echo -n "starting spinmgmt:";
        (${HOMEDIR}/bin/daemonizer ${HOMEDIR}/bin/Tomcat -home ${HOMEDIR} ${TOMCATOPTIONS} -daemon) \
		&& success "$base startup" || failure "$base startup"
        echo;
    else
	if [ "$doGdbStartup" = "true" ]; then
	    echo  "under gdb...";
            rm -f /tmp/gdb.$$
            echo  "+++ NOTE: Ignoring the following signals: PWR, XCPU, 32, PIPE and SEGV"
            echo  "handle SIGPWR nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIGXCPU nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIG32 nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIGPIPE nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIGSEGV nostop noprint" >> /tmp/gdb.$$
            echo  "+++ The 'run' command is '"run -home ${HOMEDIR}"'"
            ${HOMEDIR}/bin/gdb5.2.1 --command=/tmp/gdb.$$ ${HOMEDIR}/bin/Tomcat 
        else
	    echo  "running in the foreground...";
	    ${HOMEDIR}/bin/Tomcat -home ${HOMEDIR} ${TOMCATOPTIONS}
	fi
    fi

    if [ -f /usr/sbin/stunnel ] && [ -f /var/spinmgmt/keys/spinmgmt.pem ];
    then
	/usr/sbin/stunnel -d 443 -r 8008 -p /var/spinmgmt/keys/spinmgmt.pem -D 2
    fi

    if [ $UID -eq 0 ]; then
       echo  $! > /var/run/spinmgmt.pid
    fi

    return 0;
}

stopTomcat() {

     PID=`getParentPid "${HOMEDIR}/bin/Tomcat"`;
     RETVAL=$?;
     if [ $RETVAL -eq 0 -a -n "$PID" ]; then
        echo -n "stopping spinmgmt:";

	# Use Tomcat AJP12 protocol to shutdown Tomcat (only if loopback port is up)
	RC=0
	IF_UP=`ifconfig lo | grep UP | sed 's/.*\(UP\{1\}\) .*/\1/'`
	if [ ! -z ${IF_UP} ] && [ ${IF_UP} == "UP" ]; then
	    ${HOMEDIR}/bin/Tomcat -home ${HOMEDIR} -stop  > /dev/null 2>&1
	    RC=$?
	    sleep 2
	fi

        CHECKPID=`getParentPid "${HOMEDIR}/bin/Tomcat"`;
	[ $RC -eq 0 -a -z "$CHECKPID" ] && \
	    success "spinmgmt (pid ${PID}) stop" || \
	    killproc ${HOMEDIR}/bin/Tomcat > /dev/null 2>&1;
        echo;    			  


        # kill any errant c++filt processes hanging about.
        killproc "${HOMEDIR}/bin/c++filt" > /dev/null 2>&1;
        killproc "/bin/addr2line" > /dev/null 2>&1;

        # kill any stunnel processes hanging about
	killproc "/usr/sbin/stunnel" > /dev/null 2>&1;
	RC=0 #we don't really care if killproc succeeded for c++filt, addr2line or stunnel

     else
	echo "spinmgmt is not running.";
     fi
     return $RC;
}

tomcatStatus() {

     PID=`getParentPid "${HOMEDIR}/bin/Tomcat"`;
     RETVAL=$?
     if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	 echo "spinmgmt (pid ${PID}) is running...";
     else
	echo "spinmgmt is not running.";
     fi
     return $RETVAL;
}

getParentPid() {
    pidlist=`/sbin/pidof -x $1`
    retval=$?
    if [ $retval -eq 0 ]; then
        ps -o pid,ppid $pidlist | awk '/[0-9]/{X[P=$1]=$2}END{while(X[P]in X)P=X[P];print P}'
	retval=$?
    fi
    return $retval;
}


#
# Functions for starting and stopping the stats
# server.
#
startStatsServer() {

    PID=`getParentPid "${HOMEDIR}/bin/StatsServer"`;
    RETVAL=$?
    if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	 echo "stats server (pid ${PID}) is already running.";
	 return -1;
    fi

    echo -n "starting stats server:";
    bgdaemon ${HOMEDIR}/bin/StatsServer;
    echo;

    if [ $UID -eq 0 ]; then
       echo  $! > /var/run/statsserver.pid;
    fi


    return 0;
    
}


stopStatsServer() {

   PID=`getParentPid "${HOMEDIR}/bin/StatsServer"`;
   RETVAL=$?;
   if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	echo -n "stopping stats server:";
       kill "$PID"
       RETVAL=$?;
       [ $RETVAL -eq 0 ] && success "stats server (pid ${PID}) stop" ||
          killproc ${HOMEDIR}/bin/StatsServer > /dev/null 2>&1;
       echo;
       RETVAL=$?	  
   else
       echo "stats server is not running.";
   fi
   return $RETVAL;
}

statsServerStatus() {

    PID=`getParentPid "${HOMEDIR}/bin/StatsServer"`;
    RETVAL=$?
    if [ $RETVAL -eq 0 -a -n "$PID" ]; then
        echo "stats server (pid ${PID}) is running...";
    else
	echo "stats server is not running.";
    fi
}
