#!/bin/ksh
#
# Copyright (c) 1994 by Sun Microsystems, Inc.
#
#pragma ident   "@(#)haswitch.sh	1.5 01/05/08  SMI"

# Usage:  haswitch destination_host logicalhostname 
#         haswitch -m logicalhostname 
#         haswitch -r

enmatch() {
        ${CLUSTERBIN}/cdbmatch $* ${cdbfile}
}

function put_to_maintenance
{
	typeset lname validnames

	validnames=""
	for lname in ${loghostnames}
	do
		check_loghostname ${lname}
		if [ $? -eq 1 ]; then
			echo "${lname} is not a valid logical host name"
			usagehalt
		else
			validnames="${validnames} ${lname}"
		fi
	done
	${CLUSTERBIN}/scadmin switch ${clustname} -m ${validnames}
}

function reconfigure_cluster
{
	${CLUSTERBIN}/scadmin switch ${clustname} -r
}

function check_loghostname
{
	typeset lname row

	lname=$1
	row=$(${CLUSTERBIN}/scccd -f ${CCDFILE} ${clustname} LOGHOST query lname ${lname})
	if [ -z "${row}" ]; then
		return 1
	else
		return 0
	fi
}

# is_node_in_membership
#
# Checks if the node is a cluster member
# returns
#	0 - If node is a cluster member.
#	1 - If node is not a cluster member.
function is_node_in_membership
{
	typeset checknode nodes
	typeset -i j

        checknode=$1

        # convert the current_nodes to current-names
        set -A nodes ${currnodenames}
        j=0
        while [ ! -z ${nodes[j]} ]
        do
                if [ ${nodes[j]} = ${checknode} ]; then
                        return 0;
                fi
                j=j+1;
        done
        return 1;

}

function do_switchover
{
	typeset dnode lname validnames

	dnode=$1
	is_node_in_membership ${dnode}
	if [ $? -eq 1 ]; then
		echo "${dnode} is not a cluster member"
		echo "${lname} can not be migrated to ${dnode}"
		exit 1
	fi
	validnames=""
	for lname in ${loghostnames}
	do
		check_loghostname ${lname}
		if [ $? -eq 1 ]; then
			echo "${lname} is not a valid logical host name"
			usagehalt
		else
			validnames="${validnames} ${lname}"
		fi
	done
	${CLUSTERBIN}/scadmin switch ${clustname} ${dnode} ${validnames}
}

function usagehalt
{
	echo "Usage:  haswitch destination_hostname logicalhostname"
	echo "        haswitch -m logicalhostname"
	echo "        haswitch -r"
	exit 1
}

function haswitch_init
{
	typeset found i clustname_file currnodes localhostname

	CLUSTERBIN=/opt/SUNWcluster/bin
	CLUSTERVAR=/var/opt/SUNWcluster
	CLUSTERETC=/etc/opt/SUNWcluster
	
	clustname_file="${CLUSTERETC}/conf/default_clustername"
	if [ -f ${clustname_file} ]; then
	        clustname=$(/bin/cat ${clustname_file} )
	else
	        echo "Could not find the default cluster name"
	        usagehalt
	fi
	cdbfile="${CLUSTERETC}/conf/${clustname}.cdb"
	tmpdir=$(enmatch env.tmpdir ${cdbfile} )
	numnodes=$(enmatch cluster.number.nodes ${cdbfile})

	currnodes=`${CLUSTERBIN}/clustm getcurrmembers ${clustname}`

	# convert currnodes to currmembers.
	currnodenames=""
	for i in ${currnodes}
	do
		name=`enmatch cluster.node.${i}.hostname`
		currnodenames="${currnodenames} ${name}"
	done
	
	found=1
	localhostname=$(/bin/uname -n)
	for i in ${currnodenames}
	do
		if [ ${i} = "${localhostname}" ]; then
			found=0
		fi
	done
	if [ ${found} -eq 1 ]; then
		echo "${localhostname} is not a cluster member"
		exit 1
	fi

	CCDFILE=$(${CLUSTERBIN}/ccdadm ${clustname} -w)
}


#
# Main
#
argv0=$(/bin/basename $0)

PATH=${PATH}:/usr/sbin:/usr/bin:/opt/SUNWcluster/bin:

# Check for root: must be run as root:
/bin/id | /bin/fgrep 'uid=0(root)' >/dev/null
if [ $? -ne 0 ]; then
        echo "This program must be executed by root"
        exit 1
fi

haswitch_init 

arg=$1
if [ -z ${arg} ]; then
	usagehalt

elif [ ${arg} = "-m" ]; then
	shift
	loghostnames=$*
	put_to_maintenance ${loghostnames}

elif [ ${arg} = "-r" ]; then
	shift
	arg=$*
	if [ -z ${arg} ]; then
		reconfigure_cluster
	else
		echo ""
		echo "No arguments are required with -r option" 
		echo ""
		usagehalt
	fi
else 
	desthost=$1
	shift
	loghostnames=$*
	do_switchover ${desthost} ${loghostnames}
fi
exit 0
