#! /bin/sh
#
# chkconfig: 345 91 11
# description: Starts and stops the SECUREMATRIX.
# processname: SMX
# pidfile: /var/run/smx_isb.pid
# Revision: 1.6  Date: 2009/03/27 07:16:34
# $Revision: 1.7 $ $Date: 2009/04/27 11:34:02 $

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

LANG=ja_JP.eucJP
MONITOR_PORT=8778
START_SYORI_FILE="/var/run/smx_isb.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_isb"
######################

CATALINA_BASE=/opt/cse/smx/isb/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=64m -XX:MaxNewSize=64m -XX:SurvivorRatio=8 -Xms256m -Xmx256m"

#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_isb.pid"
lockfile="/var/lock/subsys/smx-isb"
SLEEPING_COUNT=5

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

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

# ----- isb tune ----- #
#BASE_FILTER=/opt/cse/smx/isb/bin/base_filter.sh
ISB_PROCESS_START=/opt/cse/smx/isb/bin/isb_process_start.sh
ISB_PROCESS_STOP=/opt/cse/smx/isb/bin/isb_process_stop.sh
CHECK_ISBR='/opt/cse/smx/common/bin/monitor/check_isbr.sh "/var/opt/cse/smx/isb/tmp/isbr_pid" "/opt/cse/smx/isb/bin/isbr" ""'
ISB_SET_PROMISCUOUS=/opt/cse/smx/isb/bin/setPromisc.sh
# ------------------ #


# ----- 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
# ------------------ #


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(){
#  # ----- base_filter running. ----------------------------------------------- #
#  # ưˤɬbase_filter¹Ԥ
#  $BASE_FILTER
#  # -------------------------------------------------------------------------- #
  
  touch $START_SYORI_FILE 
  
  # ----- ISB Servlet running. ----------------------------------------------- #
  # ISB ư¹ԥե饰ν
  ISB_STARTING_FLAG=0
  
  # ISB Servlet ¸ǧ
  SMX_PID=`getPID`
  if [ ! -z $SMX_PID ] ; then
    # ISB Servlet ư
    # ISBR ¸ǧISBRưƤϡ֤Ȥߤʤ
    ISBR_STATUS=`eval $CHECK_ISBR`
    if [ "$ISBR_STATUS" = "on" ] ; then
      # ISBR ư.
      MSG="$SVR_NAME already running."
      $echo "$MSG" >&2
      writeLog "${PRI_INFO}" "$MSG"
    else
      # ISBR  -> ISBR ư
      writeLog "${PRI_INFO}" "ISB Servlet is running. ISBR has stopped."
      $ISB_PROCESS_START
      writeLog "${PRI_INFO}" "ISBR was started."
      
      # ISB ư¹ԥե饰ΩƤ
      ISB_STARTING_FLAG=1
    fi
  else
    # ISB Servlet  -> ư
    # ISBR ¸ǧISBRưƤϡߤ
    ISBR_STATUS=`eval $CHECK_ISBR`
    if [ "$ISBR_STATUS" = "on" ] ; then
      # ISBR ư -> ISBR ߤ
      writeLog "${PRI_INFO}" "ISB Servlet is not running, but ISBR is running!"
      $ISB_PROCESS_STOP
      writeLog "${PRI_INFO}" "ISBR was stoped."
    fi
    
    # ISB Servlet ư
    MSG="$SVR_NAME START."
    $echo "$MSG"
    writeLog "${PRI_INFO}" "$MSG"
#    $su - -c '/opt/cse/jakarta/tomcat/bin/startup.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;${START_CMD}"
    writeLog "${PRI_INFO}" "ISB Servlet start."
    $su - -c "LANG=\"${LANG}\";CATALINA_BASE=\"${CATALINA_BASE}\";CATALINA_OPTS=\"${CATALINA_OPTS_JMX}\";export LANG CATALINA_BASE CATALINA_OPTS;${START_CMD}"
    writeLog "${PRI_INFO}" "ISB Servlet was started."
    
    # ISB Servlet  ISBR εư֤ϿԤ
    writeLog "${PRI_INFO}" "Waiting a little...( $SLEEPING_COUNT )"
    $sleep $SLEEPING_COUNT
    
    # ISBR ư
    writeLog "${PRI_INFO}" "ISBR start."
    $ISB_PROCESS_START
    writeLog "${PRI_INFO}" "ISBR was started."
    
    # ISB ư¹ԥե饰ΩƤ
    ISB_STARTING_FLAG=1
  fi
  
  # ISB ưԤäϡǸ˾֤ǧ
  if [ $ISB_STARTING_FLAG -eq 1 ] ; then
    # Ǯޤ夫ˡʢ30äϵ¿λǤ
#old wait#    $sleep 30
    
    ### Ǯޤ ################################################
    writeLog "${PRI_INFO}" "Cool down..."
    
    ### ֤(ۤäɤŨ) ###
    REPEAT_NUM=120
    
    ### 󥿡ե饰 ###
    COUNTER=0
    FLAG=0
    
    while [ ${FLAG} -eq 0 ]
    do
      RET=`eval $CHECK_ISBR`
      case ${RET} in
        "on")
          FLAG=1
          ;;
        *)
          if [ ${COUNTER} -lt ${REPEAT_NUM} ] ; then
            COUNTER=`expr ${COUNTER} + 1`
            sleep 1
          else
            FLAG=1
          fi
          ;;
      esac
    done
    writeLog "${PRI_INFO}" "Cool down : COUNTER ( ${COUNTER} )"
    #################################################################
    
    # ưֳǧ(ISB Servlet  ISBR ˵ưƤȤ)
    SMX_PID=`getPID`
    ISBR_STATUS=`eval $CHECK_ISBR`
    if [ -z $SMX_PID -o "$ISBR_STATUS" != "on" ] ; then
      # Runing Error
      if [ ! -z $SMX_PID ] ; then
        # ISBRΤߵưԤƤϡISB ServletPID
        $echo $SMX_PID > $pidfile
        $touch $lockfile
        MSG="Fail to starting $SVR_NAME!! , but success to ISB Servlet [ PID=$SMX_PID ]."
        $echo "$MSG" >&2
        writeLog "${PRI_ERR}" "$MSG"
      else
        MSG="Fail to starting $SVR_NAME!!"
        $echo "$MSG" >&2
        writeLog  "${PRI_ERR}""$MSG"
      fi
    else
      # Running ok
      $echo $SMX_PID > $pidfile
      $touch $lockfile
     
      # setPromisc
      RESULT_PROMISC=`$ISB_SET_PROMISCUOUS`
      if [ $? -eq 0 ]; then
        writeLog "${PRI_INFO}" "promiscuous-mode : $RESULT_PROMISC"
      else
        writeLog  "${PRI_WARN}" "promiscuous-mode : $RESULT_PROMISC"
        $echo "promiscuous-mode : $RESULT_PROMISC" >&2
      fi

      writeLog "${PRI_INFO}" "Success to starting $SVR_NAME."
    fi
  fi
  $rm -f $START_SYORI_FILE >/dev/null 2>&1
  # -------------------------------------------------------------------------- #
}

stop(){
  # ISB ߼¹ԥե饰ν
  ISB_STOPPING_FLAG=0
  
  # Check running.
  SMX_PID=`getPID`
  if [ ! -z $SMX_PID ] ; then
    # ISB Servlet ư -> ISBR ߤ -> ISB Servlet ߤʢ֤ա
    MSG="$SVR_NAME STOP."
    $echo "$MSG"
    writeLog "${PRI_INFO}" "$MSG"
    
    # ISBR ߤ
    writeLog "${PRI_INFO}" "ISBR stop."
    $ISB_PROCESS_STOP
    writeLog "${PRI_INFO}" "ISBR was stoped."
    
    # ISBR  ISB Servlet ߴ֤ϿԤ
    writeLog "${PRI_INFO}" "Waiting a little...( $SLEEPING_COUNT )"
    $sleep $SLEEPING_COUNT
    
    # ISB Servlet ߤ
#    $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}"
    writeLog "${PRI_INFO}" "ISB Servlet stop."
    $su - -c "LANG=\"${LANG}\";CATALINA_BASE=\"${CATALINA_BASE}\";CATALINA_OPTS=\"${CATALINA_OPTS}\";export LANG CATALINA_BASE CATALINA_OPTS;${STOP_CMD}"
    writeLog "${PRI_INFO}" "ISB Servlet was stoped."
    
    # ISB ߼¹ԥե饰ΩƤ
    ISB_STOPPING_FLAG=1
  else
    # ISB Servlet  -> ISBR ưξ硢ߤ
    ISBR_STATUS=`eval $CHECK_ISBR`
    if [ "$ISBR_STATUS" = "on" ] ; then
      # ISBR ߤ
      writeLog "${PRI_INFO}" "ISB Servlet is not running, but ISBR is running!"
      $ISB_PROCESS_STOP
      writeLog "${PRI_INFO}" "ISBR was stoped."
      
      # ISB ߼¹ԥե饰ΩƤ
      ISB_STOPPING_FLAG=1
    else
      # ISBR ߤǧ -> Ȥ߾֤Ǥ
      $echo "$SVR_NAME is not running." >&2
      writeLog "${PRI_INFO}" "$SVR_NAME is not running."
    fi
  fi
  
  # ISB ߽ԤäϡǸ˾֤ǧ
  if [ $ISB_STOPPING_FLAG -eq 1 ] ; then
    # Ǯޤ夫ˡʢ10٤ǽʬȻפ
    writeLog "${PRI_INFO}" "Waiting a little...( 10 )"
    $sleep 10
    
    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
  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`
  ISBR_STATUS=`eval $CHECK_ISBR`
  if [ -n "$SMX_PID" ] ; then
    if [ -n "$FILE_PID" -a "$FILE_PID" = "$SMX_PID" ] ; then
      if [ "$ISBR_STATUS" = "on" ] ; then
        MSG="$SVR_NAME is running."
        $echo "$MSG"
        writeLog "${PRI_INFO}" "$MSG"
      else
        MSG="$SVR_NAME is running , but not full running."
        $echo "$MSG"
        writeLog "${PRI_INFO}" "$MSG"
      fi
    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
