#!/sbin/openrc-run
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

[ -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
	want cman corosync openais
}

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
}
