#!/bin/bash
VSTORAGE_NFS_LIB=/usr/libexec/vstorage-nfs/nfs_functions
ROOT=""
SHARE_NAME=""
ARGS="${@}"
CMD=""
FORCE=""

function print_usage {
        exec 1>&2
        if [ "$CMD" = "register" ] ; then
                echo "Register the specified NFS share on current host."
                echo "Usage:"
                echo " vstorage-nfs register -n,--name NAME [--force]"
                echo "Options:"
		echo "  -n,--name NAME          Name of share to register."
                echo "  --force                 Skip all validation checks."
        else
                echo "Unregister the specified NFS share."
                echo "Usage:"
                echo " vstorage-nfs unregister -n,--name NAME"
                echo "Options:"
		echo "  -n,--name NAME          name of share to unregister."
        fi
                echo " "
        exit 1
}

function parse_args {
	exec 1>&2
        if [ ${#} -eq 0 ]; then
                echo "Command not specified, expected register or unregister" 1>&2
                exit 1
        fi

        CMD="${1}"; shift
        if [ "$CMD" != "register" -a "$CMD" != "unregister" ] ; then
                echo "Unknown command '$CMD'"
                exit 1
        fi

        while [ "${#}" -gt 0 ]; do
                case "${1}" in
                        "--force")
                                FORCE="yes"
                                shift;
                                ;;
                        "-r"|"--root")
                                [ -z "${2}" ] && print_usage
                                ROOT="${2}"
                                shift
                                shift
                                ;;
                        "-n"|"--name")
                                [ -z "${2}" ] && print_usage
                                SHARE_NAME="${2}"
                                shift
                                shift
                                ;;
                        "-h"|"--help")
                                print_usage
                                ;;
                        *)
                                echo "Unknown option '${1}'." 1>&2
                                print_usage
                                ;;
                esac
        done

        if [ -z "$SHARE_NAME" ] ; then
		echo "Share name (-n,--name) must be specified."
                print_usage
        fi
}

function do_unregister {
	pcs_nfs_check_share $SHARE_NAME
	if [ -f "$NFS_SHM/.running/$SHARE_NAME" ]; then
		echo "Can't unregister running share, please stop it first." 1>&2
		exit 5
	fi
	pcs_nfs_unregister $SHARE_NAME
        if [ $? -ne 0 ]; then
                echo "Failed to unregister share '$SHARE_NAME'" 1>&2
                exit 6
        fi

        exit 0
}

function do_register {
	if [ ! -d  "$NFS_ROOT/shares/$SHARE_NAME" ] ; then
		echo "Unable find share '$SHARE_NAME in $NFS_ROOT/shares" 1>&2
		exit 1
	fi

        if [ -z "$FORCE" ] ;  then
		pcs_nfs_has_owner "$SHARE_NAME"
                if [ $? -ne 0 ] ; then
                        echo "This share already registered on another host." 1>&2
                        echo "Please unregister it first or pass --force option." 1>&2
                        exit 2
                fi
        fi

	pcs_nfs_register "$SHARE_NAME"
        if [ $? -ne 0 ]; then
                echo "Failed to register share $SHARE_NAME" 1>&2
                exit 2
        fi

        [ -n "$FORCE" ] && /usr/bin/vstorage revoke -R "$NFS_ROOT/shares/$SHARE_NAME" >/dev/null 2>&1
        exit 0
}

if [ ! -x $VSTORAGE_NFS_LIB ] ; then
        echo "Unable find executable $VSTORAGE_NFS_LIB" 1>&2
        exit 1
fi

source $VSTORAGE_NFS_LIB
[ -f $NFS_ETC/config ] && source $NFS_ETC/config

parse_args $ARGS
NFS_ROOT=`pcs_nfs_get_root "${ROOT}"`
pcs_nfs_check_root

if [ "$CMD" = "register" ] ; then
	pcs_ha_lock_exec do_register "$SHARE_NAME"
else
	pcs_ha_lock_exec do_unregister $SHARE_NAME
fi
set +
exit $?

