#!/bin/bash
#
# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# This file is part of LVM2.
# It is required for the proper handling of failures of LVM2 mirror
# devices that were created using the -m option of lvcreate.
#
#
# chkconfig: 12345 02 99
# description: Starts and stops dmeventd monitoring for lvm2
#	       
### BEGIN INIT INFO
# Provides: 
### END INIT INFO

. /etc/init.d/functions

VGCHANGE="/usr/sbin/vgchange"
WARN=1

start()
{
	ret=0
	# TODO do we want to separate out already active groups only?
	VGS=`vgs --noheadings -o name --config 'log{command_names=0 prefix="  "}' 2> /dev/null`
	for vg in $VGS
	do
	    action "Starting monitoring for VG $vg:" $VGCHANGE --monitor y --config 'log{command_names=0 prefix="  "}' $vg || ret=$?
	done

	return $ret
}


stop()
{
	ret=0
	# TODO do we want to separate out already active groups only?
	if test "$WARN" = "1"; then
	   echo "Not stopping monitoring, this is a dangerous operation. Please use force-stop to override."
	   return 1
	fi
	VGS=`vgs --noheadings -o name --config 'log{command_names=0 prefix="  "}' 2> /dev/null`
	for vg in $VGS
	do
	    action "Stopping monitoring for VG $vg:" $VGCHANGE --monitor n --config 'log{command_names=0 prefix="  "}' $vg || ret=$?
	done
	return $ret
}

result=1

# See how we were called.
case "$1" in
  start)
	start
	result=$?
	;;

  force-stop)
	WARN=0
	stop
	result=$?
	;;

  stop)
	test "$runlevel" = "0" && WARN=0
	test "$runlevel" = "6" && WARN=0
	stop
	result=$?
	;;

  restart)
	WARN=0
	if stop
	then
		start
	fi 
	result=$?
	;;

  status)
	# TODO anyone with an idea how to dump monitored volumes?
	;;

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

exit $result
