#!/bin/sh
#
# @(#)IceWall SSO Performance Monitor (iwpm)
# @(#)File        : iwpmcd
# @(#)Description : certd activity reporter daemon.
# @(#)Version     : 10.00.00.100706A
#                   $Revision: 5 $
# (c) Copyright 2007-2010 Hewlett-Packard Development Company, L.P.
#   iwpmcd - analyze certd logs
#
# Synopsis
#   iwpmcd [ start | stop | status ]
#
# Environment Parameter
#   GL_FL_PERF
#   GL_FL_INFO
#   GL_FL_SRC_PERF
#   GL_FL_SRC_INFO
#
# Return
#   0      : success
#            iwpmcd is not running.(when status command is used)
#
#   1      : duplication startup
#            duplication stop
#            iwpmcd is running. (when status command is used)
#            can't stop iwpmcd. ( another iwpmc used iwpmcd )
#
#   others : error
#
#

#===============================================================================
#
#                                  Parameter define
#
#===============================================================================
PROGDIR=`dirname $0`
PROGNAME=`basename $0`
RUNDIR=$PROGDIR/../run
SCRIPTDIR=$PROGDIR/../script
LOCKFILE=$RUNDIR/iwpmcd.lock
CLEANFILE=$RUNDIR/iwpmcd.clean

# script file defile
SC_ANALYSE_LOG=$SCRIPTDIR/iwpmc_analyselog.pl

FL_SRC_DATE=$GL_TMPDIR/iwpmcd.date.dat
FL_TMP_BLOG=$GL_TMPDIR/iwpmcd.beforelog.dat
FL_TMP_CLOG=$GL_TMPDIR/iwpmcd.currentlog.dat

#===============================================================================
#
#                                  Sub Function
#
#===============================================================================
usage()
{
  echo "usage: $0 start|stop|status"
}

fn_status()
{
  #######  chech daemon status #######
  # check whether process is running.
  if [ -r $LOCKFILE ]
  then
    echo $PROGNAME process is running.\(`cat $LOCKFILE`\)
    return 1
  else
    echo $PROGNAME process is not running.
    return 0
  fi
}

fn_start()
{
  #######  start daemon #######
  # check whether another iwpmcd process is running.
  fn_status > /dev/null
  if [ $? -ne 0 ]
  then
    fn_status
    exit 1
  fi

  ## print message
  echo "iwpmcd started."

  ## create analyze file
  touch $GL_FL_PERF
  touch $GL_FL_INFO
  touch $FL_SRC_DATE

  ## do info-cert
  while [ ! -f $CLEANFILE ]; do do_infocert 2>&1 > /dev/null; done  &
  echo $! > $LOCKFILE

  ## do analyze file
  export GL_PARALLEL_MODE=0;

  if [ _$GL_FL_SRC_PERF = _$GL_FL_SRC_INFO ]
  then
    while [ ! -f $CLEANFILE ]; do tailmarge $GL_FL_SRC_PERF | perl $SC_ANALYSE_LOG; done &
    echo $! >> $LOCKFILE
  else
    ## analyze file
    BDATE=_;
    CDATE=_;
    while [ ! -f $CLEANFILE ];\
    do \
      tail -1 $GL_FL_SRC_PERF > $FL_TMP_BLOG; \
      sleep 1; \
      tail -1 $GL_FL_SRC_PERF > $FL_TMP_CLOG; \
      diff $FL_TMP_BLOG $FL_TMP_CLOG > /dev/null; \
      if [ $? -eq 0 ];\
      then \
        STRING=`date '+[%Y/%m/%d %H:%M:%S] DUMMY'`;\
        CDATE=`echo $STRING | awk '{print substr($0,2,10);}'`; \
##        if [ $BDATE != $CDATE ];\
##        then\
##          echo " " > $FL_SRC_DATE; \
##        fi;\
        echo $STRING >> $FL_SRC_DATE; \
        BDATE=$CDATE; \
      fi;\
    done &
    echo $! >> $LOCKFILE

    while [ ! -f $CLEANFILE ]; do tailmarge $FL_SRC_DATE $GL_FL_SRC_PERF | perl $SC_ANALYSE_LOG; done &
    echo $! >> $LOCKFILE

    export GL_PARALLEL_MODE=1; while [ ! -f $CLEANFILE ]; do tailmarge $GL_FL_SRC_INFO | perl $SC_ANALYSE_LOG; done &
    echo $! >> $LOCKFILE
  fi

}

tailmarge()
{
  if [ _$1 != _ ]
  then
    tail -f $1 2> /dev/null &
    echo $! >> $LOCKFILE
  fi

  if [ _$2 != _ ]
  then
    tail -f $2 2> /dev/null &
    echo $! >> $LOCKFILE
  fi

}

fn_stop()
{
  #######  stop daemon #######
  fn_status > /dev/null
  if [ $? -eq 0 ]
  then
    fn_status
    return 1
  fi
 
  # check another iwpmc is running.
  ls -ltr $RUNDIR/iwpmc.lock.* 2> /dev/null > /dev/null
  if [ $? -eq 0 ]
  then
    echo "warning: another iwpmc process is running."
    return 1
  fi

  return 0
}

do_infocert()
{
  while [ 1 ]
  do
    $GL_CERTDIR/bin/info-cert 2>&1 > /dev/null
    sleep 1
  done
}

cleanup()
{
  ## program exit function.
  # massage print
  if [ "_$2" != _ ]
  then
    echo "$2"
  fi
  
  touch $CLEANFILE
  sleep 3

  # PPID list get
  PPIDLIST=`cat $LOCKFILE | tr '\n' ' '`

  for IW_PPID in $PPIDLIST
  do
    PIDLIST=`ps -ef | grep -v perl | awk -v PPID=$IW_PPID '{ if ( $3 == PPID ) print $2; }'`

    # kill parent process
    ps -ef | awk -v PID=$IW_PPID '{ if ( $2 == PID ) print $2; }' | grep $IW_PPID > /dev/null
    if [ $? -eq 0 ]
    then
      kill $IW_PPID
    fi

    # kill child process
    for CPID in $PIDLIST
    do
      # kill parent process
      ps -ef | awk -v PID=$CPID '{ if ( $2 == PID ) print $2; }' | grep $CPID > /dev/null
      if [ $? -eq 0 ]
      then
        kill $CPID
      fi
    done

  done


  # remove temporary file
  rm -f $GL_FL_PERF $GL_FL_INFO $LOCKFILE $FL_SRC_DATE $FL_TMP_BLOG $FL_TMP_CLOG $CLEANFILE;

  exit $1
}

#===============================================================================
#
#                                    Main Function
#
#===============================================================================
trap 'cleanup 0 "";' HUP INT QUIT KILL TERM;

case $1 in
  start)
    fn_start
    exit $?
    ;;

  stop)
    fn_stop
    if [ $? -eq 0 ]
    then
      cleanup 0 "iwpmcd stopped."
    fi
    exit $?
    ;;

  status)
    fn_status
    exit $?
    ;;

  *)
    usage
    exit 1
    ;;
esac

cleanup 0 ""

