#!/bin/sh
#
# @(#)IceWall SSO Performance Monitor (iwpm)
# @(#)File        : iwpmdd
# @(#)Description : dfw activity reporter daemon.
# @(#)Version     : 10.00.00.100706A
#                   $Revision: 5 $
# (c) Copyright 2007-2010 Hewlett-Packard Development Company, L.P.
#
# Synopsis
#   iwpmdd [ start | stop | status ]
#
# Environment Parameter
#   GL_FL_PERF
#   GL_FL_SRC_PERF
#   GL_FL_SRC_ERR
#
# Return
#   0      : success
#            iwpmdd is not running.(when status command is used)
#
#   1      : duplication startup
#            duplication stop
#            iwpmdd is running. (when status command is used)
#            can't stop iwpmdd. ( another iwpmd used iwpmdd )
#
#   others : error
#
#===============================================================================
#
#                                  Parameter define
#
#===============================================================================
PROGDIR=`dirname $0`
PROGNAME=`basename $0`
TMPDIR=$PROGDIR/../tmp
RUNDIR=$PROGDIR/../run
SCRIPTDIR=$PROGDIR/../script
LOCKFILE=$RUNDIR/iwpmdd.lock
CLEANFILE=$RUNDIR/iwpmdd.clean

# script file defile
SC_ANALYSE_LOG=$SCRIPTDIR/iwpmd_analyselog.pl
SC_CNT_ERRLOG=$SCRIPTDIR/iwpmd_count_errlog.pl

FL_SRC_DATE=$TMPDIR/iwpmdd.date.dat
FL_TMP_BLOG=$TMPDIR/iwpmdd.beforelog.dat
FL_TMP_CLOG=$TMPDIR/iwpmdd.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 iwpmdd process is running.
  fn_status > /dev/null
  if [ $? -ne 0 ]
  then
    fn_status
    exit 1
  fi

  ## print message
  echo "iwpmdd started."

  ## create analyze file
  touch $GL_FL_ERRCNT;
  touch $GL_FL_PERF
  touch $FL_SRC_DATE

  ## error count
  while [ ! -f $CLEANFILE ]; do tail -f $GL_FL_SRC_ERR 2> /dev/null | perl $SC_CNT_ERRLOG; done &
  echo $! > $LOCKFILE

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

}

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 iwpmd is running.
  ls -ltr $RUNDIR/iwpmd.lock.* 2> /dev/null > /dev/null
  if [ $? -eq 0 ]
  then
    echo "warning: another iwpmd process is running."
    return 1
  fi

  return 0
}

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_ERRCNT $FL_SRC_DATE $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 "iwpmdd stopped."
    fi
    exit $?
    ;;

  status)
    fn_status
    exit $?
    ;;

  *)
    usage
    exit 1
    ;;
esac

cleanup 0 ""

