#! /bin/sh

# chkconfig: 345 91 11
# description: Starts and stops the SECUREMATRIX.
# processname: SMX
# pidfile: /var/run/smx_gsb.pid
#
# Revision: 1.7  Date: 2009/04/27 11:32:43
# $Revision: 1.7.2.1.8.1 $ $Date: 2009/12/09 02:58:29 $
#

. /etc/profile.d/smx.sh
. /etc/profile.d/jakarta.sh
. /etc/profile.d/java.sh

LANG=ja_JP.eucJP
ulimit -n 4096
MONITOR_PORT=8778
START_SYORI_FILE=/var/run/smx_gsb.start

### syslog setting ###
SYSLOG_FLAG=1       # 0=off , 1=on
FACILITY="local5"   # smx shellscript's log use facility 'local5'
PRI_DEBUG="debug"   # 7
PRI_INFO="info"     # 6
PRI_WARN="warning"  # 4
PRI_ERR="err"       # 3
PRI_CRIT="crit"     # 2
#
SYSLOG_TAG="smx_gsb"
######################


CATALINA_BASE=/opt/cse/smx/gsb/servlet
CATALINA_OPTS="-Dnanako.param=$CATALINA_BASE/api/ -Dlog4j.configuration=file:$CATALINA_BASE/api/log4j.properties"
CATALINA_OPTS_JMX="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=$MONITOR_PORT -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
#JAVA_OPTS="-XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m"
JAVA_OPTS="-Xms512m -Xmx512m -Xss128k"

#export LANG CATALINA_BASE CATALINA_OPTS JAVA_OPTS
START_CMD="/opt/cse/jakarta/tomcat/bin/startup.sh"
STOP_CMD="/opt/cse/jakarta/tomcat/bin/shutdown.sh"

pidfile="/var/run/smx_gsb.pid"
lockfile="/var/lock/subsys/smx-gsb"
SLEEPING_COUNT=5

PRC_STR="nanako.param=$CATALINA_BASE/api/"
SVR_NAME="SECUREMATRIX GSB SERVER"

SMX_BOOTLOG="$SMX_LOG_HOME/gsb/smx_boot.log"

# ----- define ----- #
awk=/bin/awk
cat=/bin/cat
date=/bin/date
echo=/bin/echo
grep=/bin/grep
head=/usr/bin/head
kill=/bin/kill
logger=/usr/bin/logger  # for syslog
ps=/bin/ps
rm=/bin/rm
sleep=/bin/sleep
sort=/bin/sort
su=/bin/su
touch=/bin/touch

# Ver-3.3 add
iptables=/sbin/iptables
# ------------------ #

IPTABLES_ADD(){
    iptables_list=`$iptables --list INPUT | $grep 'dpt:'$MONITOR_PORT | $grep -c 'DROP' 2>/dev/null`

    [ $iptables_list -eq 0 ] 2>/dev/null
    case $? in
        0)
            $iptables -A INPUT -p tcp -i ! lo --dport $MONITOR_PORT -j DROP
            if [ $? -ne 0 ]; then
                return 1
            fi
        ;;
        1)
            return 0
        ;;
        *)
            return 1
        ;;
    esac
    
    return 0
}

writeLog(){   # args : priority(for syslog) , log_msg
  PRIORITY="$1"
  LOG_MSG="$2"
  CRT_DATE=`$date`;CRT_DATE="[$CRT_DATE]"
  $echo "$CRT_DATE $LOG_MSG" >> $SMX_BOOTLOG
  writeSyslog "$PRIORITY" "$LOG_MSG"
}

writeSyslog(){  # args : priority(for syslog) , log_msg
  if [ ${SYSLOG_FLAG} -eq 1 ] ; then
    $logger -p ${FACILITY}.${1} -t "${SYSLOG_TAG}[$$]" "${2}"
  fi
}

getPID(){
  $ps -eww -o pgid,pid,ppid,s,args | $grep "$PRC_STR" | $grep -v 'grep' | $sort -n -k 3 | $head -n1 | $awk '{print $2}'
}


euthanasia(){
  # kill with dignity
  writeLog "${PRI_WARN}" "Fail to stopping $SVR_NAME , therefore kill $SVR_NAME."
  SMX_PID=`getPID`
  $kill ${SMX_PID} > /dev/null 2>&1
  
  $sleep $SLEEPING_COUNT
  
  SMX_PID=`getPID`
  if [ -z $SMX_PID ] ; then
    # Kill ok
    $rm -f $pidfile > /dev/null
    $rm -f $lockfile > /dev/null
    writeLog "${PRI_INFO}" "Success to killing $SVR_NAME."
  else
    # Kill Error
    MSG="Fail to killing $SVR_NAME!! Serious error occurred."
    $echo "$MSG" >&2
    writeLog "${PRI_ERR}" "$MSG"
  fi
}



start(){
  # Check duplicate boot
  SMX_PID=`getPID`
  if [ ! -z $SMX_PID ] ; then
    # Service already started.
    MSG="$SVR_NAME already running."
    $echo "$MSG" >&2
    writeLog "${PRI_INFO}" "$MSG"
  else
    touch $START_SYORI_FILE
    MSG="$SVR_NAME START."
    $echo "$MSG"
    writeLog "${PRI_INFO}" "$MSG"
#    $su - -c '/opt/cse/jakarta/tomcat/bin/startup.sh'

    IPTABLES_ADD
    if [ $? -eq 0 ]; then
        $su - -c "LANG=\"${LANG}\";CATALINA_BASE=\"${CATALINA_BASE}\";CATALINA_OPTS=\"${CATALINA_OPTS_JMX}\";JAVA_OPTS=\"${JAVA_OPTS}\";export LANG CATALINA_BASE CATALINA_OPTS JAVA_OPTS;${START_CMD}"
        writeLog "${PRI_INFO}" "Selected to Monitoring Mode"
    else
        $su - -c "LANG=\"${LANG}\";CATALINA_BASE=\"${CATALINA_BASE}\";CATALINA_OPTS=\"${CATALINA_OPTS}\";JAVA_OPTS=\"${JAVA_OPTS}\";export LANG CATALINA_BASE CATALINA_OPTS JAVA_OPTS;${START_CMD}"
    fi
    $sleep $SLEEPING_COUNT
    
    SMX_PID=`getPID`
    if [ -z $SMX_PID ] ; then
      # Runing Error
      MSG="Fail to starting $SVR_NAME!!"
      $echo "$MSG" >&2
      writeLog "${PRI_ERR}" "$MSG"
    else
      # Running ok
      $echo $SMX_PID > $pidfile
      $touch $lockfile
      writeLog "${PRI_INFO}" "Success to starting $SVR_NAME."
    fi
    $rm -f $START_SYORI_FILE >/dev/null 2>&1
  fi
}

stop(){
  # Check running.
  SMX_PID=`getPID`
  if [ ! -z $SMX_PID ] ; then
    MSG="$SVR_NAME STOP."
    $echo "$MSG"
    writeLog "${PRI_INFO}" "$MSG"
#    $su - -c '/opt/cse/jakarta/tomcat/bin/shutdown.sh'
    $su - -c "LANG=\"${LANG}\";CATALINA_BASE=\"${CATALINA_BASE}\";CATALINA_OPTS=\"${CATALINA_OPTS}\";JAVA_OPTS=\"${JAVA_OPTS}\";export LANG CATALINA_BASE CATALINA_OPTS JAVA_OPTS;${STOP_CMD}"
    
    $sleep $SLEEPING_COUNT
    
    SMX_PID=`getPID`
    if [ -z $SMX_PID ] ; then
      # Stop ok
      $rm -f $pidfile > /dev/null
      $rm -f $lockfile > /dev/null
      writeLog "${PRI_INFO}" "Success to stopping $SVR_NAME."
    else
      # Stop Error -> kill process
      euthanasia
#      MSG="Fail to stopping $SVR_NAME!!"
#      $echo "$MSG" >&2
#      writeLog "$MSG"
    fi
  else
    # Service not runnning.
    MSG="$SVR_NAME is not running."
    $echo "$MSG" >&2
    writeLog "${PRI_INFO}" "$MSG"
  fi
}

restart(){
  MSG="$SVR_NAME RESTART."
  $echo "$MSG"
  writeLog "${PRI_INFO}" "$MSG"
  stop
  start
}

status(){
  SMX_PID=`getPID`
  FILE_PID=`$cat $pidfile 2>/dev/null`
  if [ -n "$SMX_PID" ] ; then
    if [ -n "$FILE_PID" -a "$FILE_PID" = "$SMX_PID" ] ; then
      MSG="$SVR_NAME is running."
      $echo "$MSG"
      writeLog "${PRI_INFO}" "$MSG"
    else
      MSG="$SVR_NAME is running , but PID_FILE not exist."
      $echo "$MSG"
      writeLog "${PRI_INFO}" "$MSG"
    fi
  else
    # Process not found.
    MSG="$SVR_NAME has stopped."
    $echo "$MSG"
    writeLog "${PRI_INFO}" "$MSG"
  fi
}


# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
	status postmaster
	;;
  restart)
	restart
	;;
  *)
	echo "Usage: $SVR_NAME {start|stop|status|restart}"
	exit 1
esac

exit 0
