#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

# qpid.stop Script
# 
# Script checks for a given pid running DEFAULT_SEARCH and attempts to quit it
#

MAX_ATTEMPTS=2
SLEEP_DELAY=1
DEFAULT_SEARCH="PNAME=QPBRKR"

if [ -z "$QPID_STOP_SEARCH" ]; then
    SEARCH=$DEFAULT_SEARCH;
else
    SEARCH=$QPID_STOP_SEARCH;
fi

#
# Forcably Quit the specified PID($1)
#
forceQuit()
{
kill -9 $1
}

#
# Gracefully ask the PID($1) to quit
#
quit()
{
kill $1
}

#
# grep for the session ID ($1) and return 0 for successful quit and 1 for process alive
#
lookup_pid()
{
result=`ps -e | grep $1 | wc -l`
}

#
# grep ps for all instances of $SEARCH for the current user and collect PIDs
#
lookup_all_pids()
{
pids=`pgrep -f -U $USER $SEARCH`
result_all=`echo -n $pids | wc -w`
}

#
# check that the PID passed in is for a Qpid broker owned by this user and alive
#
validate_pid()
{
result=`pgrep -fl $SEARCH | grep $1 | wc -l`
}

#
# Show the PS output for given set of pids
#
showPids()
{
ps -o user,pid,args -p $pids
}

#
# Sleep and then check then lookup the PID($1) to ensure it has quit
#
check()
{
echo "Waiting $SLEEP_DELAY second for $1 to exit"
sleep $SLEEP_DELAY
lookup_pid $1
}

#
# Verify the PID($1) is available
#
verifyPid()
{
validate_pid $1
if [[ $[$result] == 1 ]] ; then
 brokerspid=$1
else
 echo "Unable to locate Qpid Broker Process with PID $1. Check PID and try again."
 exit -1
fi
}

#
# Stops all Qpid brokers for current user
#
qpid_stopall_brokers()
{
for pid in $pids ; do
    lookup_pid $pid;
    brokerspid=$pid;
    stop_broker $pid;
done
}

#
# Stops Qpid broker with brokerspid id
#
stop_broker()
{
# Attempt to quit the process MAX_ATTEMPTS Times
attempt=0
while [[ $[$result] > 0 && $[$attempt] < $[$MAX_ATTEMPTS] ]] ; do
    quit $brokerspid
    check $brokerspid
    attempt=$[$attempt + 1]
done

# Check that it has quit
if [[ $[$result] == 0 ]] ; then
    echo "Process quit"
else

 attempt=0
 # Now attempt to force quit the process
    while [[ $[$result] > 0 && $[$attempt] < $[$MAX_ATTEMPTS] ]] ; do
        forceQuit $brokerspid
        check $brokerspid
        attempt=$[$attempt + 1]
    done

 # Output final status
    if [[ $[$result] > 0 && $[$attempt] == $[$MAX_ATTEMPTS] ]] ; then
	    echo "Stopped trying to kill process: $brokerspid"
	    echo "Attempted to stop $attempt times"
    else
	    echo "Done "
    fi
fi

}

#
# Main Run
#

# Check if we are killing all qpid pids or just one.
# Now uses local function qpid_stopall_brokers
if [[ $# == 0 ]] ; then
    lookup_all_pids
    if [[ $[$result_all] > 0 ]] ; then
        echo "Killing All Qpid Brokers for user: '$USER'"
        qpid_stopall_brokers
    else
        echo "No Qpid Brokers found running for user: " $USER
    fi
	exit $result
else	
	verifyPid $1
	stop_broker
    exit $result
fi

