#!/bin/sh

PRODUCT_NAME="Plesk"
PRODUCT_ROOT_D="/usr/local/psa"
PRODUCT_RC_D="/usr/local/etc/rc.d"


PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin; export PATH
LD_LIBRARY_PATH=/usr/local/lib:/usr/local/psa/lib; export LD_LIBRARY_PATH
LANG=C; export LANG

umask 022

# get machine OS
TARGET_OS="`uname -a`"
case "$TARGET_OS" in
	BSD/OS*BSDI*i386)
		machine="BSDI"
		;;
	FreeBSD*i386)
		machine="BSD"
		;;
	SunOS*5.*sun4*)
		machine="solaris"
		;;
	Linux*2.?.*i?86*| \
	Linux*2.?.*x86_64*)
		machine="linux"
		;;
	Darwin*)
		machine="Darwin"
		;;
	*)
		;;
esac

# check for root
my_id="`id`"
case "$my_id" in
	uid=0\(root\)*)
		;;
	*)
		echo "     $0: This script must be run as root"
		echo "     Log in as root then run this script again."
		echo
		exit 1
		;;
esac

# library functions

get_pid()
{
		local proc_name proc_basename
		proc_name="$1"
		proc_basename=`basename "$proc_name"`

		PID=`ps axww | awk '($5 ~ "('"$proc_name"'|[[(]'"$proc_basename"'[)\\\\]])$") && ($1 > 0) {print $1}'`
		echo $PID
}

get_pid_withowner()
{
	local proc_name proc_basename owner
	proc_name="$1"
	owner="$2"
	proc_basename=`basename "$proc_name"`

	PID=`ps axuww | awk '{if (($1 ~ "$owner") && ($11 ~ "('"$proc_name"'|[[(]'"$proc_basename"'[)\\\\]])$") && ($1 > 0)) {print $2}}'`
	echo $PID
}

status()
{
		local proc_name="$1"
        local pid

        pid=`get_pid ${proc_name}`
        if [ "X$pid" != "X" ] ; then
                echo "${proc_name} (pid $pid) is running..."
                return 0
        fi

        echo "${proc_name} is stopped"
        return 1
}

wait_after_stop()
{
        PIDS=`echo "$1" | tr ' ' ,`
        count=${2:-50}
        while [ 0$count -gt 0 ]
        do
			if [ "X$machine" = "XDarwin" ]; then
				col_procs="`ps -p $PIDS 2>/dev/null|wc -l| xargs echo`"
				[ 0$col_procs -lt 2 ] && break
			else
				ps -p $PIDS > /dev/null 2>&1 || break
			fi

			sleep 1
			count=`expr $count - 1`
        done
        if [ 0$count -eq 0 ]; then
                echo "kill remaining processes:"
                ps w -p $PIDS 2>/dev/null
				kill -9 $1 > /dev/null 2>&1
				cleanup_shared_memory
        fi
        return 0
}

# Remove all semaphores owned by users listed in parameters
cleanup_semaphores()
{
	local i n id_n owner_n ipcrm ipcrm_opt cmd

	# Parse the header and find out on which positions do the owner
	# and id appear in ipcs output
	n=1
	for i in `ipcs -s | tr A-Z a-z | grep id | head -n 1`; do
		if [ "$i" = "id" -o "$i" = "semid" ]; then
			id_n='$'$n
		fi
		if [ "$i" = "owner" ]; then
			owner_n='$'$n
		fi
		n=$(($n+1))
	done
	if [ "X$id_n" = "X" -o "X$owner_n" = "X" ]; then
		echo "WARNING:"
		echo "cannot parse ipcs output"
		return 1
	fi

	if ipcrm -h 2>&1 | grep -q -e '-s semid'; then
		ipcrm="ipcrm"
		ipcrm_opt="-s"
	else
		ipcrm="ipcrm sem"
		ipcrm_opt=""
	fi

	# Use the parsing results to extract the information with awk and
	# remove the selected semaphores
	for i; do
		cmd="`ipcs -s | awk \"$owner_n==\\\"$i\\\" { print \\\"$ipcrm_opt \\\"$id_n }\"`"
		if [ -n "$cmd" ]; then
			$ipcrm $cmd
		fi
	done
}

# Remove all unused shared memory (whose CPID and LPID are orphaned)
cleanup_shared_memory()
{
	local i n id_n cpid_n lpid_n id cpid lpid ipcrm ipcrm_opt

	# Parse the header and find out on which positions do the owner
	# and id appear in ipcs output
	n=1
	for i in `ipcs -m -p | tr A-Z a-z | grep id | head -n 1`; do
		if [ "$i" = "id" -o "$i" = "shmid" ]; then
			id_n='$'$n
		fi
		if [ "$i" = "cpid" ]; then
			cpid_n='$'$n
		fi
		if [ "$i" = "lpid" ]; then
			lpid_n='$'$n
		fi
		n=$(($n+1))
	done
	if [ "X$id_n" = "X" -o "X$cpid_n" = "X" -o "X$lpid_n" = "X" ]; then
		echo "WARNING:"
		echo "cannot parse ipcs output"
		return 1
	fi

	if ipcrm --help 2>&1 | grep -q -e '-m shmid'; then
		ipcrm="ipcrm"
		ipcrm_opt="-m"
	else
		ipcrm="ipcrm shm"
		ipcrm_opt=""
	fi

	# Use the parsing results to extract the information with awk and
	# drop the orphaned shared memory resources
	ipcs -m -p | awk "$cpid_n ~ /[0-9]+/ { print $id_n, $cpid_n, $lpid_n }" | while read id cpid lpid; do
		if ! ps "$cpid" "$lpid" >/dev/null 2>&1; then
			$ipcrm $ipcrm_opt "$id"
		fi
	done
}

warning()
{
	file="$1"
	service="$2"

	echo "WARNING:"
	echo "something wrong with file $file"
	echo "can't handle $service"
}

stp()
{
	service="$1"
	echo "$PRODUCT_NAME: $service has been stopped"
}

f_stp()
{
	service="$1"
	echo "$PRODUCT_NAME: failed to stop $service -- may be it's not running?"
}

rst()
{
	service="$1"
	echo "$PRODUCT_NAME: $service has been restarted"
}

f_rst()
{
	service="$1"
	echo "$PRODUCT_NAME: failed to restart $service"
}

strt()
{
	service="$1"
	echo "$PRODUCT_NAME: $service has been started"
}

f_strt()
{
	service="$1"
	echo "$PRODUCT_NAME: failed to start $service"
}

grcf()
{
	service="$1"
	echo "$PRODUCT_NAME: $service has been graceful restarted"
}

f_grcf()
{
	service="$1"
	echo "$PRODUCT_NAME: failed to graceful restart $service -- may be it's not running?"
}


