#!/bin/bash
#
# chkconfig: - 24 76
# description: Starts and stops clvmd
#
#	       
### BEGIN INIT INFO
# Provides: 
### END INIT INFO

. /etc/init.d/functions

LVDISPLAY="/usr/sbin/lvdisplay"
VGCHANGE="/usr/sbin/vgchange"
VGSCAN="/usr/sbin/vgscan"
VGDISPLAY="/usr/sbin/vgdisplay"
VGS="/usr/sbin/vgs"
CLVMDOPTS="-T20"

[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster

LOCK_FILE="/var/lock/subsys/clvmd"

start()
{
	for rtrn in 0
	do
		if ! pidof clvmd > /dev/null 
		then 
			echo -n "Starting clvmd: "
			daemon clvmd $CLVMDOPTS
			rtrn=$?
			echo
			if [ $rtrn -ne 0 ]
			then
				break
			fi
 		fi	
		# refresh cache
		$VGSCAN  > /dev/null 2>&1
		
		if [ -n "$LVM_VGS" ]
		then
			for vg in $LVM_VGS
			do
				action "Activating VG $vg:" $VGCHANGE -ayl $vg || rtrn=$?
			done
		else
			action "Activating VGs:" $VGCHANGE -ayl || rtrn=$?
		fi
	done

	return $rtrn
}

stop()
{
	for rtrn in 0
	do
		if [ -n "$LVM_VGS" ]
		then
			for vg in $LVM_VGS
			do
				action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
			done
		else
			# Hack to only deactivate clustered volumes
			clustervgs=`$VGDISPLAY 2> /dev/null | awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'`
			for vg in $clustervgs; do
				action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
			done
		fi

		[ $rtrn -ne 0 ] && break

		echo -n "Stopping clvm:"
		killproc clvmd -TERM
		rtrn=$?
		echo
	done
	
	return $rtrn
}

wait_for_finish()
{
	count=0

	while [ "$count" -le 10 -a -n "`pidof clvmd`" ]
	do
		sleep 1
		count=$((count + 1))
	done
	
	if [ `pidof clvmd` ]
	then
		return 1
	else
		return 0
	fi
}

rtrn=1

# See how we were called.
case "$1" in
  start)
	start
	rtrn=$?
	[ $rtrn = 0 ] && touch $LOCK_FILE
	;;

  stop)
	stop
	rtrn=$?
	[ $rtrn = 0 ] && rm -f $LOCK_FILE
	;;

  restart)
	if stop
	then
		wait_for_finish
		start
	fi 
	rtrn=$?
	;;

  status)
	status clvmd
	rtrn=$?
	vols=$( $LVDISPLAY -C --nohead 2> /dev/null | awk '($3 ~ /....a./) {print $1}' )
	echo active volumes: ${vols:-"(none)"}
	;;

  *)
	echo $"Usage: $0 {start|stop|restart|status}"
	;;
esac

exit $rtrn
