#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/lvm2/files/clvmd.rc-2.02.39,v 1.3 2013/04/09 11:00:26 ssuominen Exp $

[ -x /usr/sbin/clvmd ] && CLVMD_BIN="/usr/sbin/clvmd" || CLVMD_BIN="/sbin/clvmd"

[ -z "$CLVMD_CLUSTER_TIMEOUT" ] && CLVMD_CLUSTER_TIMEOUT=30
[ -n "$CLVMD_NODES_TIMEOUT" ] || CLVMD_NODES_TIMEOUT=60

VGCHANGE="/sbin/vgchange"
VGSCAN="/sbin/vgscan"
VGDISPLAY="/sbin/vgdisplay"
CLVMD_PIDFILE="/var/run/clvmd.pid"

depend() {
	use net dns logger dmeventd
	need cman
}

load_modules() {
	local module modules
	modules=$1
	
	for module in ${modules}; do
		ebegin "Loading ${module} kernel module"
		modprobe ${module}
		eend $? "Failed to load ${module} kernel module"
	done
}

unload_modules() {
	local module modules
	modules=$1
	
	for module in ${modules}; do
		ebegin "Unloading ${module} kernel module"
		modprobe -r ${module}
		eend $? "Failed to unload ${module} kernel module"
	done
}

umount_gfs_filesystems() {
	local sig retry
	local remaining="$(awk '$3 == "gfs" { print $2 }' /proc/mounts | sort -r)"

	if [ -n "${remaining}" ]
	then
	        sig=
	        retry=3
	        while [ -n "${remaining}" -a "${retry}" -gt 0 ]
	        do
	                if [ "${retry}" -lt 3 ]
			then
	                        ebegin "Unmounting GFS filesystems (retry)"
	                        umount ${remaining} &>/dev/null
	                        eend $? "Failed to unmount GFS filesystems this retry"
	                else
	                        ebegin "Unmounting GFS filesystems"
	                        umount ${remaining} &>/dev/null
	                        eend $? "Failed to unmount GFS filesystems"
	                fi
	                remaining="$(awk '$3 == "gfs" { print $2 }' /proc/mounts | sort -r)"
	                [ -z "${remaining}" ] && break
	                /bin/fuser -k -m ${sig} ${remaining} &>/dev/null
	                sleep 5
	                retry=$((${retry} -1))
	                sig=-9
	        done
	fi
}


start_volumes() {
	ebegin "Scanning LVM volumes"
	$VGSCAN > /dev/null 2>&1
	eend $?

	ret=$?
	if [ "$ret" -eq 5 ]
	then
		einfo "  Waiting for other nodes to join the cluster ($CLVMD_NODES_TIMEOUT seconds)"
	fi

	clustervgs=`$VGDISPLAY 2> /dev/null | awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'`
	for vg in $clustervgs; do
		ebegin "  Activating Clustered VG: ${vg} "

		wait=0
		while [ -n "$($VGCHANGE -a y ${vg} 2>&1 |grep "clvmd not running")" ]; do
			if [ $wait -lt $CLVMD_NODES_TIMEOUT ]; then
				sleep 3
				wait=$(($wait + 3))
			else
				eend 1
			fi
		done
		eend 0
	done
}

stop_volumes() {
	# Deactivate only clustered volumes
	clustervgs=`$VGDISPLAY 2> /dev/null | awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'`
	for vg in $clustervgs; do
		ebegin "  Shutting Down Clustered VG: ${vg} "
		$VGCHANGE -anl ${vg} >/dev/null
		eend $?
	done
}


start() {
	local module=$(awk '$1 == "dm_mod" { print $1 }' /proc/{modules,devices})

	if [ -z "${module}" ]; then
		load_modules "dm-mod"
		sleep 1s
	fi

	ebegin "Starting clvmd ($CLVMD_CLUSTER_TIMEOUT seconds)"

	start-stop-daemon --start --quiet --exec ${CLVMD_BIN} -- -T ${CLVMD_CLUSTER_TIMEOUT}
	eend $?

	start_volumes
}

stop() {

	# umount GFS filesystems
	umount_gfs_filesystems

	#stop_volumes

	ebegin "Stopping clvmd"
	#start-stop-daemon --stop -s TERM --quiet --exec ${CLVMD_BIN} --name clvmd
	killall -TERM ${CLVMD_BIN} >/dev/null
	eend $?

        #local module=$(awk '$1 == "dm_mod" { print $1 }' /proc/modules)

	#if [[ "$?" -eq 0 && ! -z "${module}" ]]; then
        #        unload_modules "dm-mod"
        #fi
}
