#!/bin/bash
# Licensed Materials - Property of IBM Corp.
# IBM UrbanCode Build
# IBM UrbanCode Deploy
# IBM UrbanCode Release
# IBM AnthillPro
# (c) Copyright IBM Corporation 2002, 2014. All Rights Reserved.
#
# U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by
# GSA ADP Schedule Contract with IBM Corp.
#
# == BEGIN INSTALL MODIFICATIONS ===============================================
#
# Startup script for the Agent
#
# chkconfig: 345 80 20
# description: IBM UrbanCode Deploy agent process
# processname: ibm-ucdagent
### BEGIN INIT INFO
# Provides: ibm-ucdagent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Short-Description: IBM UrbanCode Deploy agent process
# Description: IBM UrbanCode Deploy agent process
### END INIT INFO

AGENT_HOME="@AGENT_HOME@"
AGENT_USER=@AGENT_USER@
AGENT_GROUP=@AGENT_GROUP@

# == END INSTALL MODIFICATIONS =================================================

ANT_HOME="$AGENT_HOME/opt/apache-ant-1.8.4"
GROOVY_HOME="$AGENT_HOME/opt/groovy-1.8.8"
SCRIPT="$AGENT_HOME/bin/agent"

# detect lock dir
unique_name="`basename "$0"`"
if [ -d /run/lock ]; then
  agent_lock="/run/lock/$unique_name"
elif [ -f /etc/redhat-release ]; then
  agent_lock="/var/lock/subsys/$unique_name"
elif [ -f /etc/debian_version ]; then
  agent_lock="/var/lock/$unique_name"
else
  agent_lock=$AGENT_HOME/bin/ibm-ucdagent_lock
fi

# detect pid dir
if [ -d /run ]; then
  agent_pid="/run/$unique_name.pid"
else
  agent_pid="/var/run/$unique_name.pid"
fi

if [ -x /etc/rc.d/init.d/functions ]; then
  . /etc/rc.d/init.d/functions
else
  # Check if any of $pid (could be plural) are running
  checkpid() {
    for i in $* ; do
      [ -d "/proc/$i" ] && return 0
    done
    return 1
  }
fi

retval=0

# -- Option Implementations ----------------------------------------------------

start() {
  touch $agent_pid
  echo -n "Starting ibm-ucdagent: "

# AMD -- Made lock location variable.
  if [ -f $agent_lock ]; then
    if [ -f $agent_pid ]; then
      read kpid < $agent_pid
      if checkpid $kpid 2>&1; then
        echo "process already running"
        return 1
      else
        echo "lock file found but no process running for pid $kpid, continuing"
      fi
    fi
  fi

  if [ ! -z "$AGENT_GROUP" ]; then
    chown "$AGENT_USER:$AGENT_GROUP" $agent_pid
  else
    chown "$AGENT_USER" $agent_pid
  fi

  if [ -x /etc/rc.d/init.d/functions ]; then
    daemon --user "$AGENT_USER" "$SCRIPT" start $agent_pid
  elif [ -x /sbin/start-stop-daemon ]; then
    usergroup="$AGENT_USER"
    if [ ! -z "$AGENT_GROUP" ]; then
      usergroup="$usergroup:$AGENT_GROUP"
    fi
    start-stop-daemon --start --oknodo --chuid "$usergroup" --pidfile "$agent_pid" --startas "$SCRIPT" -- start "$agent_pid"
  else
    su - "$AGENT_USER" -c "\"$SCRIPT\" start $agent_pid"
  fi

  retval=$?
  echo
  [ $retval = 0 ] && touch $agent_lock
  return $retval
}

stopMe() {
  shutdown_wait=5
  echo -n "Stopping ibm-ucdagent: "

  if [ -f $agent_lock ] ; then
    if [ -x /etc/rc.d/init.d/functions ]; then
      daemon --force --user "$AGENT_USER" "$SCRIPT" stop $agent_pid
    elif [ -x /sbin/start-stop-daemon ]; then
      start-stop-daemon --stop --oknodo --pidfile "$agent_pid" --retry 5
    else
      su - "$AGENT_USER" -c "\"$SCRIPT\" stop $agent_pid"
    fi
    retval=$?

    sleep 3

    if [ $retval = 0 ]; then
      count=0;

      if [ -f $agent_pid ]; then

        read kpid < $agent_pid
        kwait=$shutdown_wait

        until [ `ps -p $kpid | grep -c $kpid` = '0' ] || [ $count -gt $kwait ]; do
          echo "waiting for processes to exit";
          sleep 2
          count=`expr $count + 1`;
        done

        if [ $count -gt $kwait ]; then
          echo "didn't stop after $((shutdown_wait*2)) seconds; force killing process"
          kill -9 $kpid
        fi
      fi
      rm -f "$agent_lock" "$agent_pid"
    fi
  fi
  echo
}

# -- Execute -------------------------------------------------------------------

case "$1" in
  start)
    start
    ;;
  stop)
    stopMe
    ;;
  restart)
    stopMe
    sleep 2
    start
    ;;
  condrestart)
    if [ -f $agent_pid ]; then
      stopMe
      start
    fi
    ;;
  *)
    echo "Usage: ibm-ucdagent {start|stop|restart|condrestart}"
    exit 1
esac

exit $retval
