#! /bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=cman
DESC="cluster manager"

test -x /sbin/cman_tool || exit 0

CLUSTERNAME=""
NODENAME=""
USE_CCS="yes"
CLUSTER_JOIN_OPTIONS=""
CLUSTER_JOIN_TIMEOUT=300

if [ -f /etc/default/cman ] ; then
	. /etc/default/cman
fi

[ "$CLUSTERNAME" ] && CLUSTERNAME_OPT="-c $CLUSTERNAME"
[ "$NODENAME" ] || NODENAME=$(hostname -s)
NODENAME_OPT="-n $NODENAME"

set -e

membership()
{
	cman_tool status | grep "Membership state" | awk '{print $3}'
}

is_active()
{
	membership=$(membership)
	[ "$membership" = "Cluster-Member" ] && return 0
	( echo "$membership" | grep -q "Transition" ) && return 0
	return 1
}

is_joining()
{
	membership=$(membership)
	[ "$membership" = "Starting" ] && return 0
	[ "$membership" = "New-Cluster?" ] && return 0
	( echo "$membership" | grep -q "Join" ) && return 0
	return 1
}

if [ "$USE_CSS" = "yes" ]; then
	output=$(ccs_test connect force 2>&1) || rt=$?
	if [ "$rt" ]; then
		echo "Can't connect to ccsd!"
		exit 1
	fi
	descriptor=$(echo $output | sed -n -e 's,^.*or = \(.*\)$,\1,p')
	output=$(ccs_test get $descriptor /cluster/cman 2>&1) || rt=$?
	if [ "$rt" ]; then
		echo "Disabled, not a cman cluster!"
		exit 1
	fi
	output=$(ccs_test disconnect $descriptor 2>&1)
fi

case "$1" in
  start)
	if is_active; then
		echo "Not starting $DESC: already part of cluster."
		exit 0
	fi

	echo -n "Starting $DESC"

	is_joining || cman_tool join $CLUSTER_JOIN_OPTIONS $CLUSTERNAME_OPT $NODENAME_OPT

	if [ "$CLUSTER_JOIN_TIMEOUT" -lt 0 ]; then
		echo "."
		exit 0
	fi
	time=0
	while [ "$CLUSTER_JOIN_TIMEOUT" -eq 0 ] || [ "$time" -lt "$CLUSTER_JOIN_TIMEOUT" ]; do
		if is_active; then
			echo "."
			exit 0
		elif is_joining; then
			sleep 1
			time=$(($time + 1))
		else
			echo ": not possible."
			exit 1
		fi
	done
	;;
  stop)
	echo -n "Stopping $DESC"
	cman_tool leave
	echo "."
	;;
  remove)
	echo -n "Stopping $DESC, removing node from cluster"
	cman_tool leave remove
	echo "."
	;;
  force-stop)
	echo -n "Stopping $DESC, force"
	cman_tool leave force
	echo "."
	;;
  restart|force-reload)
  	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|remove|force-stop}" >&2
	exit 1
	;;
esac

exit 0
