#!/bin/bash
VSTORAGE_NFS_LIB=/usr/libexec/vstorage-nfs/nfs_functions
ROOT=""
SHARE_NAME=""
EXPORT_NAME=""
EXPORT_CONFIG=""
EXPORT_ID=""
IP_ADDR=""
KEYTAB=""
NOAUTH=""
PARAM=""
NFS_SHARE_MOUNT_POINT="/vstorage-nfs"

ARGS="${@}"

function do_cleanup {
        [ -z "$TMP_DIRS" -o -z "$NFS_ROOT" ] && return
        for dir in $TMP_DIRS; do
                parent=`dirname ${dir}`
                [ "$parent" = "$NFS_ROOT/tmp" -a -d "${dir}" ] && rm -rf "${dir}"
        done
}

function check_param {

	if [ -z "$PARAM" ]; then
		PARAM="$1"
		return
	fi

	if [ -n "$PARAM" -a "$PARAM" != "$1" ]; then
		echo "Can't change different parameters at once." 1>&2
		print_usage
	fi
}


function print_usage {
        exec 1>&2
	if [ "x$CMD" = "xadd-export" ] ; then
		[ -n "$1" ] && echo "Add export for NFS share."
		echo "Usage:"
		echo "vstorage-nfs add-export -n,--name SHARE_NAME -e,--export EXPORT_NAME -c,--config CONFIG"
		echo "Options:"
		echo " -n,--name SHARE_NAME             name of NFS share."
		echo " -e,--export EXPORT_NAME          name for new NFS export."
		echo " -c,--config CONFIG               path to export config."
	elif [ "x$CMD" = "xdel-export"  ] ; then
		[ -n "$1" ] && echo "Delete existing NFS export."
		echo "Usage:"
		echo "vstorage-nfs del-export -n,--name SHARE_NAME -e,--export EXPORT_NAME"
		echo "Options:"
		echo " -n,--name SHARE_NAME             name of NFS share."
		echo " -e,--export EXPORT_NAME          name of NFS export."
	elif [ "x$CMD" = "xupdate-export" ] ; then
		[ -n "$1" ] && echo "Update existing NFS export."
		echo "Usage:"
		echo "vstorage-nfs update-export -n,--name SHARE_NAME -e,--export EXPORT_NAME -c,--config CONFIG"
		echo "Options:"
		echo " -n,--name SHARE_NAME             name of NFS share."
		echo " -e,--export EXPORT_NAME          name of NFS export."
		echo " -c,--config CONFIG               path to export config."
	elif [ "x$CMD" = "xset" ] ; then
		[ -n "$1" ] && echo "Change parameters of existing NFS share."
		echo "Usage:"
		echo "vstorage-nfs set -n,--name SHARE_NAME [-a,--address ADDR] [-k, --keytab KEYTAB] [--noauth]"
		echo "Options:"
		echo " -a,--address ADDR                address of NFS share."
		echo " -k,--keytab KEYTAB               path to keytab file."
		echo " --noauth                         disable authentication and remove keytab."
	fi

        exit 1
}

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

        CMD="${1}"; shift
        if [ "x$CMD" != "xadd-export" -a "x$CMD" != "xdel-export" -a "x$CMD" != "xupdate-export" -a "x$CMD" != "xset" ] ; then
                echo "Unknown command '$CMD'"
                exit 1
        fi

        while [ "${#}" -gt 0 ]; do
                case "${1}" in
                        "-h"|"--help")
                                print_usage 1
                                ;;
                        "-r"|"--root")
                                [ -z "${2}" ] && print_usage
                                ROOT="${2}"
                                shift
                                shift
                                ;;
                        "-n"|"--name")
                                [ -z "${2}" ] && print_usage
                                SHARE_NAME="${2}"
                                shift
                                shift
                                ;;
			"-e"|"--export")
				[ -z "${2}" ] && print_usage
				EXPORT_NAME="${2}"
				shift
				shift
				;;
                        "-c"|"--config")
                                [ -z "${2}" ] && print_usage
                                EXPORT_CONFIG="${2}"
                                shift
                                shift
                                ;;
			"-a"|"--address")
				[ -z "${2}" ] && print_usage
				[ -n "$IP_ADDR" ] && print_usage
				IP_ADDR="${2}"
				check_param IP_ADDR
				shift
				shift
                                ;;
			"-k"|"--keytab")
				[ -z "${2}" ] && print_usage
				[ -n "$KEYTAB" ] && print_usage
				KEYTAB="${2}"
				check_param KEYTAB
				shift
				shift
                                ;;
			"--noauth")
				NOAUTH="1"
				check_param NOAUTH
				shift
				;;
                        *)
                                echo "Unknown option '${1}'." 1>&2
                                print_usage
                                ;;
                esac
        done

        if [ -z "$SHARE_NAME" ] ; then
                echo "Name of share (-n,--name) must be specified." 1>&2
                print_usage
        fi

	if [ -n "$IP_ADDR" ] ; then
                IP_ADDR=`pcs_ha_validate_addr "$IP_ADDR"`
		[ -z "$IP_ADDR" ] && print_usage
        fi

        if [ "x$CMD" = "xadd-export" ]; then
		if [ -z "$EXPORT_NAME" ] ; then
			echo "Name for export (-E,--export) must be specified." 1>&2
			print_usage
		fi
                if [ -z "$EXPORT_CONFIG" ] ; then
                        echo "Export config (-c,--export-config) must be specified." 1>&2
                        print_usage
                fi
	elif [ "x$CMD" = "xdel-export" ]; then
		if [ -z "$EXPORT_NAME" ] ; then
			echo "Name for export (-E,--export) must be specified." 1>&2
			print_usage
		fi
	elif [ "x$CMD" = "xupdate-export" ]; then
		if [ -z "$EXPORT_NAME" ] ; then
			echo "Name for export (-E,--export) must be specified." 1>&2
			print_usage
		fi
                if [ -z "$EXPORT_CONFIG" ] ; then
                        echo "Export config (-c,--export-config) must be specified." 1>&2
                        print_usage
                fi
	elif [ "x$CMD" = "xset" ]; then
		if [ -z "$PARAM"  ] ; then
		        echo "At least one parameter must be specified." 1>&2
		        print_usage
		fi
	else
		echo "Unknown command $CMD" 1>&2
		print_usage
        fi
}


function delete_share {
	trap do_cleanup EXIT
	echo "Not implement yet" 1>&2
	exit 1
}

function do_ctl {
	pcs_nfs_check_share $SHARE_NAME
        trap do_cleanup EXIT
	tmp=`mktemp -d "$NFS_ROOT/tmp/del-export-$CMD.XXXXXXXX"`
	if [ $? -ne 0 ] ; then
                echo "Can't create temporary directory." 1>&2
		exit 2
	fi

	TMP_DIRS="$tmp $TMP_DIRS"

	if [ "x$CMD" = "xadd-export" ]; then
		pcs_nfs_make_export $tmp $SHARE_NAME $EXPORT_NAME $EXPORT_CONFIG
		RET=$?
		[ $RET -ne 0 ] && exit $RET
		if [ -f "$NFS_SHM/.running/$SHARE_NAME" ]; then
			pcs_nfs_up_export $SHARE_NAME $EXPORT_NAME
			RET=$?
			if [ $RET -ne 0 ]; then
				#cleanup new export if it can't be started 
				mv "$NFS_ROOT/shares/$SHARE_NAME/exports/$EXPORT_NAME" "$tmp"
				rm -rf "$tmp" >/dev/null 2>&1
				exit $RET
			fi
		fi
	elif [ "x$CMD" = "xdel-export" ]; then
		if [ ! -d "$NFS_ROOT/shares/$SHARE_NAME/exports/$EXPORT_NAME" ] ; then
			echo "Unable find export $EXPORT_NAME for share $SHARE_NAME" 1>&2
			exit 1
		fi
		if [ -f "$NFS_SHM/.running/$SHARE_NAME" ]; then
			pcs_nfs_down_export $SHARE_NAME $EXPORT_NAME
			RET=$?
			[ $RET -ne 0 ] && exit $RET
		fi
		mv "$NFS_ROOT/shares/$SHARE_NAME/exports/$EXPORT_NAME" "$tmp"
		rm -rf "$tmp" >/dev/null 2>&1
		RET=$?
	elif [ "x$CMD" = "xupdate-export" ]; then
		if [ ! -d "$NFS_ROOT/shares/$SHARE_NAME/exports/$EXPORT_NAME" ] ; then
			echo "Unable find export $EXPORT_NAME for share $SHARE_NAME" 1>&2
			exit 1
		fi

		if [ ! -f "$EXPORT_CONFIG" ]; then
                	echo "Unable find export config '$EXPORT_CONFIG'" 1>&2
                	exit 1
        	fi

		cp "$EXPORT_CONFIG" "$NFS_ROOT/shares/$SHARE_NAME/exports/$EXPORT_NAME/${SHARE_NAME}_${EXPORT_NAME}.conf"
		RET=$?
        	if [ $RET -ne 0 ] ; then
                	echo "Can't copy config $EXPORT_CONFIG to $NFS_ROOT/shares/$SHARE_NAME/exports/${SHARE_NAME}_${EXPORT_NAME}.conf" 1>&2
			exit $RET
        	fi
		
		if [ -f "$NFS_SHM/.running/$SHARE_NAME" ]; then
			pcs_nfs_down_export $SHARE_NAME $EXPORT_NAME
			pcs_nfs_up_export $SHARE_NAME $EXPORT_NAME
			RET=$?
			[ $RET -ne 0 ] && exit $RET
		fi
	elif [ "x$CMD" = "xset" ]; then
		if [ -f "$NFS_SHM/.running/$SHARE_NAME" ]; then
			echo "Can't set parameters for running share, please stop it first" 1>&2
			exit 1
		fi

		if [ -n "$IP_ADDR" ] ; then
			tmp=`mktemp  ${NFS_ROOT}/tmp/set-address-$SHARE_NAME.XXXXXXXX`
			RET=$?
			if [ $RET -ne 0 ] ; then
				echo "Can't create temporary file." 1>&2
				exit $RET
			fi

			msg=`echo "$IP_ADDR" | dd of="$tmp" conv=fsync >/dev/null 2>&1`
			RET=$?
			if [ $RET -ne 0 ]; then
				echo "$msg"
				echo "Unable save addresses in $tmp" 1>&2
				rm -f "$tmp"
				exit $RET
			fi
			msg=`mv -f "$tmp" "$NFS_ROOT/shares/$SHARE_NAME/control/address" 2>&1`
			RET=$?
			if [ $RET -ne 0 ]; then
				echo "$msg" 2>&1
				echo "Failed to move $tmp in $NFS_ROOT/shares/$SHARE_NAME/control/address" 2>&1
				rm -f "$tmp"
				exit $RET
			fi
		fi

		if [ -n "$KEYTAB" ] ; then
			pcs_nfs_check_keytab $KEYTAB
			RET=$?
			if [ $RET -ne 0 ] ; then
		        	echo "Invalid keytab $KEYTAB" 1>&2
				exit $RET
			fi

			cp "$KEYTAB" "$NFS_ROOT/shares/$SHARE_NAME/control/krb5.keytab"
			RET=$?
			if [ $RET -ne 0 ] ; then
		        	echo "Can't copy $KEYTAB to $NFS_ROOT/shares/$SHARE_NAME/control/krb5.keytab" 1>&2
				exit $RET
			fi
		fi

		if [ -n "$NOAUTH" ] ; then
			msg=`rm "$NFS_ROOT/shares/$SHARE_NAME/control/krb5.keytab" 2>&1`
			RET=$?
			if [ $RET -ne 0 ]; then
				echo "$msg" 2>&1
				echo "Failed to remove keytab $NFS_ROOT/shares/$SHARE_NAME/control/krb5.keytab" 2>&1
				exit $RET
			fi
		fi
		
	else
		echo "Unknown command $CMD" 1>&2
		exit 1
	fi

	exit $RET
}

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
pcs_ha_lock_exec do_ctl "$SHARE_NAME" "$CMD" 
exit $?

