#!/bin/bash

TOOL=`basename "$0"`
ARGS="${@}"
NETDEV=''
FORCE=0

source /usr/libexec/vstorage-iscsi/fcoe_functions
source /usr/libexec/vstorage-iscsi/vstorage_functions

function print_command_list {
	exec 1>&2
	echo "Usage:"
	echo "  fcoe-create -n,--netdev=NET_DEVICE          Create a FCoE HBA"
	echo "  fcoe-destroy -n,--netdev=NET_DEVICE         Destroy a FCoE HBA"
	echo "  fcoe-list [-n,--netdev=NET_DEVICE]          Print created FCoE HBA"
}

function print_usage {
	exec 1>&2
	if [ "$CMD" = "fcoe-create" ] ; then
		echo "Create a FCoE HBA."
		echo "Usage:"
		echo "  $TOOL fcoe-create -n,--netdev=NET_DEVICE -f,--force"
		echo "Options:"
		echo "  -n,--netdev=NET_DEVICE    FCoE compatible net HBA"
		echo "  -f,--force                Try to create FCoE HBA despite restrictions"

	elif [ "$CMD" = "fcoe-destroy" ] ; then
		echo "Destroy a FCoE HBA."
		echo "Usage:"
		echo "  $TOOL fcoe-destroy -n,--netdev=NET_DEVICE"
		echo "Options:"
		echo "  -n,--netdev=NET_DEVICE    FCoE compatible net HBA"

	elif [ "$CMD" = "fcoe-list" ]; then
		echo "Print created FCoE HBA."
		echo "Usage:"
		echo " $TOOL account-list"
		echo "Options:"
		echo "  -n,--netdev=NET_DEVICE    FCoE compatible net HBA"
	fi
	echo " "
	exit 1
}

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

	CMD="${1}"; shift
	if [ "$CMD" != "" -a "$CMD" != "fcoe-create" -a "$CMD" != "fcoe-destroy" -a "$CMD" != "fcoe-list" ] ; then
		echo "Unknown command '$CMD'" 1>&2
		print_command_list
		exit 1
	fi

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

function _check_fcoe_netdev() {
	_list_netdev 2>&1 | grep $NETDEV >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		echo "No such device '$NETDEV'" 1>&2
		exit 1
	fi

	_list_hw_netdev 2>&1 | grep $NETDEV >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		echo "Network device '$NETDEV' is virtual device, specify a hardware network adapter" 1>&2
		exit 1
	fi

	fcoe_check_device_dcb_support $NETDEV
	dcb_check=$?
	if [ $dcb_check -ne 0 -a "${CMD}" == "fcoe-create" ]; then
		echo "Warning: network device '$NETDEV' doesn't look like a CNA" 1>&2
	fi

	ifconfig $NETDEV | grep "inet[^6]" >/dev/null 2>&1
	if [ $? -eq 0 -a $FORCE -eq 0 -a "${CMD}" == "fcoe-create" ]; then
		echo "Network device has an ip address and doesn't look like a CNA, remove address or use --force option" 1>&2
		exit 1
	fi
}

function do_fcoe_create() {
	if [ -z $NETDEV ]; then
		echo "Name of FCoE device (-n,--netdev) must be specified." 1>&2
		exit 1
	fi

	_check_fcoe_netdev
	fcoe_up_hba $NETDEV

	RET=$?
}

function do_fcoe_destroy() {
	if [ -z $NETDEV ]; then
		echo "Name of FCoE device (-n,--netdev) must be specified." 1>&2
		exit 1
	fi

	_check_fcoe_netdev
	fcoe_down_hba $NETDEV

	RET=$?
}

function do_fcoe_list() {
	local list=""

	if [ ! -z $NETDEV ]; then
		_check_fcoe_netdev
		list=$NETDEV
	else
		list=`_list_hw_netdev 2>/dev/null`
	fi

	for l in $list; do
		wwpn=`fcoe_hba_wwpn $l 2>/dev/null`
		if [ $? -eq 0 ]; then
			echo "$l               $wwpn"
		fi
	done

	RET=0
}

parse_args $ARGS

case "${CMD}" in
	"fcoe-create")
		do_fcoe_create
		;;
	"fcoe-destroy")
		do_fcoe_destroy
		;;
	"fcoe-list")
		do_fcoe_list
		;;
esac

exit $RET
