#!/bin/ksh
#
# $Id: openit-startup,v 1.23.8.4 2006/05/03 07:56:23 kjetil Exp $
#
# (C) Copyright 1996-2002 Open Systems Computing AS, All rights reserved.
# (C) Copyright 2002-2012 Open iT Norge AS, All rights reserverd.
#
# This software may be used or copied only with the written permission by
# Open iT or in accordance with the terms and conditions
# stipulated in the agreement under which this software has been supplied.
#
# This file is part of Open iT
#
### BEGIN INIT INFO
# Provides:      openit-comcenter openit_comcenter
# Default-Start:   2 3 4 5
# Default-Stop:   0 6
# Required-Start: 
# Required-Stop:
# Short-Description:  Start/Stop OpeniT openit_comcenter
# Description: OpeniT openit_comcenter for measuring / optimizing IT resources.
### END INIT INFO
#
# Purpose:
#   Start and stop Open iT openit_comcenter daemons
#
# chkconfig: 2345 98 02
# description: OpeniT daemon, openit_comcenter \
#              measuring / optimizing IT resources.
#
###############################################################################
if [ -z "$OPENIT_KSH" ]; then
  OPENIT_KSH=1
  export OPENIT_KSH
  exec /bin/ksh $0 $*
fi

eval "$DBG_SH"

#!/bin/ksh



# Standard value
OPENIT_HOME=/opt/openit
OPENIT_CFG=/etc/opt/openit/openit.cfg
CONFIG_DIR=/var/opt/openit/etc
OPENIT_ENV=/etc/opt/openit/openit.env
EXIT_OK=0
EXIT_ERR=1  # Failed to startup Open iT
EXIT_NA=2   # Open iT not configured
EXIT_NOT_RUNNING=3
EXIT_UNKNOWN=4

# Some "global" variables for return values from functions
DIRECTIVE_RETURN=""
ROOT_DIR="";
OPENIT_PID=""
OPENIT_PIDS=""
OPENIT_USER=""
SU=""
USER=`id| cut -d")" -f1| cut -d"(" -f2`

# Behavior definition
ECHO_OUTPUT=""

###############################################################################
#
# Echo message
#
function find_su_command {
	if [ -x /sbin/runuser ]; then
		SU=/sbin/runuser
	else
		SU=su
	fi
}
####


# Find su command
find_su_command
####


###############################################################################
#
# Echo message
#
function echo_message {
	MESSAGE=$1
	if [[ $ECHO_OUTPUT = "" ]]; then
		return
	fi
	echo $MESSAGE
}
####


###############################################################################
#
# Get one line value of /etc/opt/openit/openit.cfg
#
function get_cfg_entry {
	DIRECTIVE=$1
	DEFAULT_RETURN=$2
	if [[ ! -r $OPENIT_CFG ]]; then
		DIRECTIVE_RETURN=$DEFAULT_RETURN
		return
	fi
	DIRECTIVE_LINE=`egrep "^$DIRECTIVE" $OPENIT_CFG`
	if [[ "$DIRECTIVE_LINE" = "" ]]; then
		DIRECTIVE_RETURN=$DEFAULT_RETURN
	else
		DIRECTIVE_RETURN=`echo $DIRECTIVE_LINE | awk '{print $2}'`
	fi
}
####


# Find root dir
get_cfg_entry ROOT_DIR /opt/openit
ROOT_DIR=$DIRECTIVE_RETURN
####


# Find openit user
get_cfg_entry OPENIT_USER openit
OPENIT_USER=$DIRECTIVE_RETURN
####


###############################################################################
#
# Get one pid for a named process
#
function get_pids {
	OPENIT_PROC=$1
	OPENIT_PIDS=`env UNIX95=1 ps -eo pid,args | grep /$OPENIT_PROC | \
        egrep "openit|$ROOT_DIR" | grep -v grep | awk '{print $1}'`
}
####


###############################################################################
#
# Start a daemon located under /opt/openit/bin
#
function start_daemon {
	OPENIT_PROG=$1
	if [ ! -x $OPENIT_HOME/bin/$OPENIT_PROG ]; then
		echo "$OPENIT_PROG has no binary"
		return $EXIT_ERR
	fi
	echo "Starting $OPENIT_PROG ..."
	if [[ "$USER" = "root" && "$USER" != "$OPENIT_USER" ]]; then
		$SU - $OPENIT_USER -c "$OPENIT_HOME/bin/$OPENIT_PROG"
	else
		$OPENIT_HOME/bin/$OPENIT_PROG
	fi
	if [[ $? -ne 0 ]]; then
		echo "Failed to start $OPENIT_PROG"
		return $EXIT_ERR
	fi
	echo_message "$OPENIT_PROG started"
	return $EXIT_OK
}
####


###############################################################################
#
# Signal openit processes
#
function signal_openit_procs
{
	OPENIT_PROC=$1
	SIG=$2
	if [[ $SIG = "" ]]; then
		SIG="15"
	fi
	get_pids $OPENIT_PROC
	echo_message "Signalling $OPENIT_PROC with signal $SIG"
	if [[ "$OPENIT_PIDS" = "" ]]; then
		echo_message "No $OPENIT_PROC to signal"
		return
	fi
	echo_message "pids"
	echo_message "$OPENIT_PIDS"
	`kill -$SIG $OPENIT_PIDS`
}
####


###############################################################################
#
# Terminate openit processes, try TERM first, the KILL
#
function terminate_openit_procs
{
	OPENIT_PROC=$1
	OPENIT_PID=""
	echo "Stopping $OPENIT_PROC ..."
	signal_openit_procs $OPENIT_PROC 15
	usleep 100000
	get_pids $OPENIT_PROC
	if [[ $OPENIT_PIDS = "" ]]; then
		echo_message "Terminated $OPENIT_PROC"
		return
	fi
	sleep 4
	get_pids $OPENIT_PROC
	if [[ $OPENIT_PIDS = "" ]]; then
		echo_message "Terminated $OPENIT_PROC"
		return
	fi
	signal_openit_procs $OPENIT_PROC 9
	echo_message "Some processes killed"
	get_pids $OPENIT_PROC
	if [[ "$OPENIT_PIDS" != "" ]]; then
		echo "Some processes still running"
		return $EXIT_ERR
	fi
	return $EXIT_OK
}
####


###############################################################################
#
# Return status of a daemon process, return value 0 means that there is one
# process (or more, which is erronous) with parent pid 1
#
function status_of_daemon
{
	OPENIT_PROC=$1
	MESSAGE_OFF=$2
	PPID_ONE_PROCESS=`env UNIX95=1 ps -eo ppid,args | grep /$OPENIT_PROC | \
        egrep "^ *1 .*(openit|$ROOT_DIR)" | grep -v grep | awk '{print $1}'`
	ALL_PROCESSES=`env UNIX95=1 ps -eo pid,args | grep /$OPENIT_PROC | \
        egrep "openit|$ROOT_DIR" | grep -v grep | awk '{print $1}' | \
        xargs echo`
	if [[ $PPID_ONE_PROCESS = "" ]]; then
		if [[ "$MESSAGE_OFF" = "" ]]; then
			echo "$OPENIT_PROC is stopped"
		fi
		return $EXIT_NOT_RUNNING
	fi
	if [[ $PPID_ONE_PROCESS != "1" ]]; then
		if [[ "$MESSAGE_OFF" = "" ]]; then
			echo "$OPENIT_PROC has unknown status"
			return $EXIT_UNKNOWN
		fi
	fi
	if [[ "$MESSAGE_OFF" = "" ]]; then
		echo "$OPENIT_PROC (pid $ALL_PROCESSES) is running..."
	fi
	return 0
}
####


###############################################################################
#
# Verify that the user is root or eventually the openit user and give a
# message
#
function assert_user
{
	if [[ "$USER" != "root" &&  "$USER" != "$OPENIT_USER" ]]; then
		if [[ "$OPENIT_USER" != "root" ]]; then
			echo "Must be run as root or $OPENIT_USER"
		else
			echo "Must be run as root"
		fi
		exit $EXIT_ERR
	fi
}
####

PATH=/sbin:/usr/sbin:/usr/bin:/bin:/usr/ucb # For Solaris, HP-UX 10.0 and 9.x.
export PATH

OPENIT_DAEMON=openit_comcenter

if [[ "$1" != "status" ]]; then
	assert_user
fi
if [[ ! -r "$OPENIT_CFG" || ! -r "$OPENIT_ENV" ]]; then
	PROGS=`ps -eo args | grep $OPENIT_DAEMON | grep libexec | grep -v grep`
	if [[ "$PROGS" = "" ]]; then
		echo "Missing $OPENIT_CFG or $OPENIT_ENV"
		exit $EXIT_ERR
	fi
	echo "$PROGS"
	echo "Missing $OPENIT_CFG or $OPENIT_ENV, trying to kill $OPENIT_DAEMON"
	signal_openit_procs $OPENIT_DAEMON 9
	exit $EXIT_ERR
fi

case "$1" in
	'start_msg')
	# Used by HPUX 10.x
		echo "Starting the Open iT server"
		exit $EXIT_OK
		;;
	'stop_msg')
	# Used by HPUX 10.x
		echo "Stopping the Open iT server"
		exit $EXIT_OK
		;;
	'start')
		status_of_daemon $OPENIT_DAEMON nomessage
		RET_VAL=$?
		if [ $RET_VAL -eq 0 ]; then
			echo "$OPENIT_DAEMON is already running, try restart"
			exit $EXIT_ERR
		fi
		echo_message "status exit value $RET_VAL"
		if [ $RET_VAL -ne 3 ]; then
			terminate_openit_procs $OPENIT_DAEMON
		fi
		start_daemon $OPENIT_DAEMON
		exit $?
		;;
	'stop')
		status_of_daemon $OPENIT_DAEMON nomessage
		RET_VAL=$?
		if [ $RET_VAL -eq 3 ]; then
			echo "$OPENIT_DAEMON is not running"
			exit $EXIT_ERR
		fi
		terminate_openit_procs $OPENIT_DAEMON
		exit $?
		;;
	'restart')
		status_of_daemon $OPENIT_DAEMON nomessage
		if [[ "$?" != "3" ]]; then
			terminate_openit_procs $OPENIT_DAEMON
		fi
		start_daemon $OPENIT_DAEMON
		exit $?
        ;;
	'status')
		status_of_daemon $OPENIT_DAEMON
		exit $?
        ;;
	*)
        echo "Usage: $0 start|stop|restart|status"
		exit $EXIT_ERR
        ;;
esac
