#!/bin/bash
#
# chkconfig: 345 24 76
# description: export gnbd devices as gnbd devices specified \
# by GNBD_EXPORTS in /etc/sysconfig/gfs
#
### BEGIN INIT INFO
# Provides: 
### END INIT INFO

. /etc/init.d/functions
. /etc/init.d/gfs-functions
[ -f /etc/sysconfig/gfs ] && . /etc/sysconfig/gfs

# do not start if there are no exports configured
[ -z "$GNBD_EXPORTS" ] && exit 0

find_master()
{
        gulm_master=""
        line=$(gulm_tool getstats localhost 2>/dev/null |
                awk 'BEGIN{xit=1}
                        ($1 == "I_am"){xit=0}
                        ($0 ~ /^(I_am = Master|Master =)/) {print}
                        END{exit xit}')
        [ $? -ne 0 ] && return 1

        case $line in
                I_am\ =\ Master)
                        gulm_master=$(hostname)
                        ;;
                Master\ =*)
                        server=${line#*= }

                        if gulm_tool getstats $server 2>/dev/null |
                                grep -q "I_am = Master"
                        then
                                gulm_master=$server
                        fi
                        ;;
                *) ;;
        esac

        [ -n "$gulm_master" ]
}


start()
{
	# Make sure that we've logged in to a quorate gulm server
	if ! find_master 
	then
		echo "no master gulm server found"
		return 1
	fi

	# copy banned list from running servers
	# FIXME -- this is an ugly hack because GNBD does not do this itself
	for server in $GNBD_SERVERS
	do
		# FIXME -- should remove ourselves from this list?
		if list=$(gnbd_import -c $server 2> /dev/null)	
		then
			for ban in $list
			do
				# should we check for duplicates 
				gnbd_import -t localhost -s $ban
			done
		fi
	done

	# start exporting
	sts=0
	for gnbd in $GNBD_EXPORTS
	do
		name=$(hostname):${gnbd##*/}
		if gnbd_export -q -d $gnbd -e $name $GNBD_OPTS
		then
			echo "exporting $gnbd ($name)"
		else
			sts=$?
		fi
	done
	return $sts
}

stop()
{
	sts=0
        for gnbd in $GNBD_EXPORTS
        do
		name=$(hostname):${gnbd##*/}
		if gnbd_export -q -O -r $name
		then
			echo "stopping $gnbd ($name)"
		else
			sts=$?
		fi
	done
	return $sts
}	

status()
{
	sts=0
	return $sts
}

rtrn=1

# Simply exit if there are no GNBD_EXPORTS listed.  Command line 
# are not checked if there are no servers.
[ -z "$GNBD_EXPORTS" ] && exit 0

# See how we were called.
case "$1" in
  start)
	load_module lock_harness MODULE_LOCK_HARNESS
	load_module crc32	 MODULE_CRC32
	load_module lock_gulm    MODULE_LOCK_GULM
	load_module gnbd_serv    MODULE_GNBD_SERV

	# Make sure that ccsd is running 
	if ! ccs_read list 2>/dev/null >/dev/null 
	then
		echo ccsd is not responding
		exit 0
	fi

	start
	rtrn=$?
	[ $rtrn -eq 0 ] && touch /var/lock/subsys/gnbd_export
	;;

  stop)
	stop 
	rtrn=$?
	[ $rtrn -eq 0 ] && rm -f /var/lock/subsys/gnbd_export

	unload_module gnbd_serv    MODULE_GNBD_SERV
	unload_module lock_gulm    MODULE_LOCK_GULM
	unload_module crc32	   MODULE_CRC32
	unload_module lock_harness MODULE_LOCK_HARNESS
	;;

  restart)
	$0 stop
	$0 start
	rtrn=$?
	;;

  status)
	status
	rtrn=0
	;;

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

exit $rtrn

