#!/bin/sh
#INSERT: Copyleft info 
#set -x

if [ -n "$OCF_DEBUG_LIBRARY" ]; then
    . $OCF_DEBUG_LIBRARY
else
    . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
fi

nfsserver_meta_data() {
	cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="nfsserver">
<version>1.0</version>

<longdesc lang="en">
Nfsserver represent the nfsserver in the system.
</longdesc>

<shortdesc lang="en">
Nfsserver represent the nfsserver in the system.
</shortdesc>

<parameters>

<parameter name="nfs_shared_path" unique="0" required="1">
<longdesc lang="en">
The directory which physically shared among all servers. Typically, it's a filesystem on a shared storage.
</longdesc>
<shortdesc lang="en">
Path shared among servers.
</shortdesc>
<content type="string" default="" />
</parameter>

<parameter name="nfs_info_path" unique="0" required="1">
<longdesc lang="en">
The relative directory where to store nfs related information. It defaults to .nfsserver.
</longdesc>
<shortdesc lang="en">
The directory to store nfs information.
</shortdesc>
<content type="string" default=".nfsserver" />
</parameter>

<parameter name="sharedip" unique="0" required="1">
<longdesc lang="en">
The IP address to access the nfs service
</longdesc>
<shortdesc lang="en">
IP address.
</shortdesc>
<content type="string" default="*" />
</parameter>

</parameters>

<actions>
<action name="start"   timeout="40" />
<action name="stop"    timeout="10" />
<action name="status"   timeout="90" />
<action name="monitor" depth="0"  timeout="20" interval="10" start-delay="1m"/>
<action name="meta-data"  timeout="5" />
<action name="validate-all"  timeout="30" />
</actions>
</resource-agent>
END

return $OCF_SUCCESS
}

nfsserver_usage() {
	cat <<END
		usage: $0 {start|stop|monitor|status|validate-all|meta-data}
END
}


if [ $# -ne 1 ]; then
	nfsserver_usage
	exit $OCF_ERR_ARGS
fi

case $__OCF_ACTION in
	meta-data)  nfsserver_meta_data
		exit $OCF_SUCCESS
		;;
	usage|help) nfsserver_usage
		exit $OCF_SUCCESS
		;;
	*)
		;;	
esac

nfsserver_monitor ()
{
	/etc/init.d/nfsserver status
	rc=$?
	if [ $rc == 0 ]; then
		return $OCF_SUCCESS
	fi
	return $OCF_NOT_RUNNING	
}

nfsserver_daemon_start ()
{
	ocf_log info "Starting NFS Server via init script"
	/etc/init.d/nfsserver start
	if [ $? -ne 0 ]; then
		ocf_log err "Failed to start NFS Server via init script"
		return 1
	fi
	ocf_log info "NFS Server started via init script"
	return 0
}

nfsserver_daemon_stop ()
{
	ocf_log info "Stopping NFS Server via init script"
	/etc/init.d/nfsserver stop
	if [ $? -ne 0 ]; then
		ocf_log err "Failed to stop NFS Server via init script"
		return 1
	fi
	ocf_log info "NFS Server stopped via init script"
	return 0
}

prepare_directory ()
{
	declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"

	[ -d "$fp" ] || mkdir -p fp
	[ -d "$fp/rpc_pipefs" ] || mkdir -p $fp/rpc_pipefs
	[ -d "$fp/sm" ] || mkdir -p $fp/sm
	[ -d "$fp/sm.ha" ] || mkdir -p $fp/sm.ha
	[ -d "$fp/sm.bak" ] || mkdir -p $fp/sm.bak
	[ -d "$fp/v4recovery" ] || mkdir -p $fp/v4recovery
}

is_bound ()
{
	mount | grep -q "$1 on $2 type none (.*bind)"
	return $?
}

prepare_tree ()
{
	declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"
	if is_bound $fp /var/lib/nfs; then
		ocf_log debug "$fp is already bound to /var/lib/nfs"
		return 0
	fi
	mount --bind $fp /var/lib/nfs
}

unprepare_tree ()
{
	declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"
	if is_bound $fp /var/lib/nfs; then
		umount /var/lib/nfs
	fi
}

nfsserver_start ()
{
	prepare_direcotry
	prepare_tree

	cp -f /var/lib/nfs/sm/* /var/lib/nfs/sm.ha 2> /dev/null
	nfsserver_daemon_start						
	rc=$?

	#Notify the nfs server has been moved or rebooted
	#The init script do that once, and we do it again with the sharedip anyway
	sm-notify -v $OCF_RESKEY_sharedip -P /var/lib/nfs/sm.ha
	rm -f /var/lib/nfs/sm.ha/* 2> /dev/null

	if [ $rc == 0 ]; then
		return $OCF_SUCCESS
	fi
	return $OCF_ERR_GENERIC
}

nfsserver_stop ()
{
	nfsserver_daemon_stop
	rc=$?
	if [ $rc == 0 ]; then
		unprepare_tree 
		return $OCF_SUCCESS
	fi
	return $OCF_ERR_GENERIC
}

nfsserver_validate ()
{
	if [ -x /etc/init.d/nfsserver && -x /usr/sbin/sm-notify ]; then
		return $OCF_SUCCESS
	else
		return $OCF_ERR_INSTALLED
	fi
}

case $__OCF_ACTION in
	start)      nfsserver_start
		;;
	stop)       nfsserver_stop
		;;
	monitor)    nfsserver_monitor
		;;
	validate-all)   nfsserver_validate
		;;
	*)      nfsserver_usage
	exit $OCF_ERR_UNIMPLEMENTED
	;;
esac

