#!/usr/bin/ksh
#
# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

typeset opt

while getopts 'R:G:Q:I:O:U:B:D:S:E:' opt
do
	case "$opt" in
		R)      RESOURCE=$OPTARG;;
                G)	RESOURCEGROUP=$OPTARG;;
                Q)	QMGR=$OPTARG;;
                I)	IN_QUEUE=$OPTARG;;
                O)	OUT_QUEUE=$OPTARG;;
                U)	MQSIUSER=$OPTARG;;
                B)	BROKER=$OPTARG;;
                D)	DBUSER=$OPTARG;;
                S)      START_COMMAND=$OPTARG;;
                E)      STOP_COMMAND=$OPTARG;;
                *)	logger -p daemon.err \
                        "ERROR: `basename $0` Option $OPTARG unknown"
                        exit 1;;
	esac
done
    
. `dirname $0`/../etc/config
. `dirname $0`/functions

validate_options

debug_message "Method: `basename $0` - Begin"
$SET_DEBUG

#
# There are some dependencies that need to be observed in the event
# of either the Broker, Broker Queue Manager or Broker RDBMS being
# restarted, which are.
#    
#	Failure		Intended Action		Actual Action
#	-------		---------------		-------------
# 	Broker		Broker Start		Broker Start
#
#	Broker QMGR    	Broker Stop		Broker Stop
#			Broker QMGR Start	Broker QMGR Start
#			Broker Start		Broker Start
#
#	Broker RDBMS	Broker Stop		Restart Resource Group
#			Broker QMGR Stop
#			Broker RDBMS Start
#			Broker QMGR Start
#			Broker Start
#
#
# Restart of the Broker Queue Manager or Broker RDBMS is managed by 
# each respective data service. However, whenever the Broker RDBMS has
# either been restarted or is not available, we need to request a restart
# of the Broker Queue Manager resource - which is performed by restarting
# the Resource Group.
#
# Once the Broker has been scheduled to be restarted, RGM will call
# the STOP and START methods. START will simply wait until both the
# Broker Queue Manager and Broker RDBMS are available before it
# continues.
#
# However, START uses "wait for online" before returning control back
# to RGM. So, for "wait for online" testing we bypass  the check above
# and only test if the Broker is working. Finally, "wait for online"
# processing within the START method simply ignores exit 100.
#

if [ "$STATUS" != "OK" ] 
then
	check_broker
else
	get_resource_dependencies

	if [ "$ORA_SID" ]
	then
		test_oracle_pid
	else
		test_db2_pid
	fi

	case $rdbms_pid in
		not_changed)
			continue;;
		lost)
			set_status DEGRADED

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker RDBMS not available"

			restart_resource_group

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;
		changed)
			set_status DEGRADED

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker RDBMS has been restarted"

			restart_resource_group

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;	
		*)
			set_status DEGRADED

			scds_syslog -p daemon.error -t $(syslog_tag) -m \
			"Unexpected error - test_rdbms_pid<%s>" \
			"${rdbms_pid}"

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;
	esac

	test_qmgr_pid

	case $qmgr_pid in
		not_changed)
			continue;;
		lost)
			set_status DEGRADED

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker Queue Manager not available"

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker will be restarted"

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;
		changed)
			set_status DEGRADED

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker Queue Manager has been restarted"

			scds_syslog -p daemon.notice -t $(syslog_tag) -m \
			"WebSphere MQ Broker will be restarted"

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;	
		*)
			set_status DEGRADED

			scds_syslog -p daemon.error -t $(syslog_tag) -m \
			"Unexpected error - test_qmgr_pid<%s>" \
			"${qmgr_pid}"

			debug_message "Method: `basename $0` - End (Exit 100)"
			exit 100;;
	esac

	if pgrep -fx "bipservice ${BROKER}" > /dev/null
	then
		check_broker
	else
		# If bipservice is lost then we bail out as fast as we can as
		# this offers a faster resumption of service. ie, Issuing
		# mqsistop -i ${BROKER} has no effect as bipservice is not
		# available to service that request.

		set_status DEGRADED

		scds_syslog -p daemon.error -t $(syslog_tag) -m \
		"WebSphere MQ Broker bipservice %s failed" \
		"${BROKER}"

		cleanup_broker  

		debug_message "Method: `basename $0` - End (Exit 100)"
		exit 100
	fi
fi
	
#
# If any step in check_broker returns rc_check_broker=1, then the
# underlying Broker Queue Manager is probably restarting or not
# responding. In this case to avoid a conflict with strmqm processing
# (ie AMQ8041 messages - Run 'mqrc AMQ8041' to see the return code)
# we must exit.
#
# This ensures that strmqm can complete as quickly as possible, after
# which the Broker will be restarted. This level of dependency offers a 
# quicker resumption of service and prevents a premature failover if
# strmqm is repeatedly issued.
#

if [ "$rc_check_broker" -eq 1 ]
then
	if [ "$STATUS" != "OK" ]
	then	
		debug_message "Method: `basename $0` - End (Exit 100)"
		exit 100
	else
		set_status DEGRADED

		scds_syslog -p daemon.notice -t $(syslog_tag) -m \
		"WebSphere MQ Check Broker failed - see reason above"

		debug_message "Method: `basename $0` - End (Exit 100)"
		exit 100
	fi
else
	set_status OK
fi

debug_message "Method: `basename $0` - End (Exit 0)"
exit 0
