#
# /etc/bash_completion.d/drbdadm
#
# Bash completion for the DRBD top-level management application, drbdadm.
#
# If you have bash completion enabled, this module will
#
# - provide tab completion for drbdadm sub-commands (up, down, primary,
#   secondary etc.);
#
# - try to detect your current resource state and provide appropriate
#   command completion for the sub-command you provided. For example,
#   when if you have entered the "primary" sub-command, it will list
#   only those resources that are currently in the Secondary role;
#
# - differentiate between stacked and unstacked resources.
#
# This module does NOT guarantee that the DRBD state engine will in
# fact agree to do what you ask it to. For example, resources that are
# currently Primary and not connected are not excluded from the
# completion list for the "detach" sub-command.
#
# Finally, this module is only capable of parsing resources correctly
# if you are using the default location for your DRBD configuration
# file (/etc/drbd.conf).

__drbdadm_all_resources() {
	# Detects all resources currently listed in drbd.conf
	local resources="$(${DRBDADM} sh-resources) all"
	COMPREPLY=( $(compgen -W "$resources" -- "$current") )
}

__drbdadm_resources_by_status() {
	# Detects only those resources that match a particular status
	local status_type="$1"
	shift 1
	local status_filter="$*"
	local resources="$(${DRBDADM} sh-resources)"
	local filtered_resources
	local res
	for res in $resources; do
		local resource_status="$(${DRBDADM} $status_type $res 2>/dev/null)"
		# In case of multiple volumes, consider only the first line
		set -- $resource_status
		resource_status=$1
		local i
		for i in $status_filter; do
			if [ "${resource_status%%/*}" = $i ]; then
				filtered_resources="$filtered_resources $res"
			fi
		done
	done
	COMPREPLY=( $(compgen -W "$filtered_resources" -- "$current") )
}

__drbdadm_commands() {
	# Lists drbdadm sub-commands
	COMPREPLY=( $(compgen -W "$drbdadm_command_list" -- "$current") )
}

__drbdadm_options() {
	# Lists global drbdadm options
	local options='-d --dry-run -v --verbose -S --stacked -t --config-to-test'
	COMPREPLY=( $(compgen -W "$options" -- "$current") )
}

__drbdadm_subcmd_options() {
	local subcmd="$1"
	local options=($(drbdadm help $subcmd | sed -e '1,/OPTIONS FOR/ d;/^$/,$ d;s/  \(--[a-z-]*\).*/\1/'))
	local filtered
	local o have
	for o in ${options[@]}; do
		for have in ${COMP_WORDS[@]}; do
			[[ $o = "$have" ]] && continue 2
		done
		filtered="$filtered $o"
	done
	COMPREPLY=( $(compgen -W "$filtered" -- "$current") )
}

_drbdadm() {
	local DRBDADM="env DRBD_DONT_WARN_ON_VERSION_MISMATCH=1 ${COMP_WORDS[0]}"
	local drbdadm_command_list=' attach disk-options detach connect net-options disconnect up resource-options down primary secondary invalidate invalidate-remote outdate verify pause-sync resume-sync resize adjust wait-connect role cstate dstate dump wait-connect wait-con-int create-md dump-md wipe-md get-gi show-gi help apply-al hidden-commands '

	# Redefine the drbdadm we use in __drbdadm_all_resources and
	# __drbdadm_resources_by_status, if running in stacked mode
	case "$COMP_LINE " in
	*" -S "*|*" --stacked "*)
		DRBDADM="$DRBDADM --stacked"
		;;
	esac

	local current previous
	# The word currently being evaluated for completion
	current=${COMP_WORDS[COMP_CWORD]}
	# The word that precedes the currently-evaluated one
	previous=${COMP_WORDS[COMP_CWORD-1]}

	case "$previous" in
		drbdadm)
			case "$current" in
				-*)
					__drbdadm_options
					;;
				*)
					__drbdadm_commands
					;;
			esac
			;;
		primary)
			__drbdadm_resources_by_status "role" "Secondary"
			;;
		secondary)
			__drbdadm_resources_by_status "role" "Primary"
			;;
		detach|disk-options)
			__drbdadm_resources_by_status "dstate" "UpToDate" "Inconsistent" "Outdated"
			;;
		outdate)
			__drbdadm_resources_by_status "dstate" "UpToDate"
			;;
		attach|apply-al)
			__drbdadm_resources_by_status "dstate" "Diskless" "Unconfigured"
			;;
		connect)
			__drbdadm_resources_by_status "cstate" "StandAlone" "Unconfigured"
			;;
		invalidate-remote)
			__drbdadm_resources_by_status "cstate" "Connected"
			;;
		disconnect|net-options)
			__drbdadm_resources_by_status "cstate" "Connected" "WFConnection" "VerifyT" "VerifyS"
			;;
		verify)
			__drbdadm_resources_by_status "cstate" "Connected"
			;;
		pause-sync)
			__drbdadm_resources_by_status "cstate" "SyncSource" "SyncTarget"
			;;
		resume-sync)
			__drbdadm_resources_by_status "cstate" "PausedSyncS" "PausedSyncT"
			;;
		*)
			if (( COMP_CWORD > 2 )); then
				local subcmd
				subcmd=${COMP_WORDS[1]}
				case "$drbdadm_command_list" in
				    *" $subcmd "*)
					__drbdadm_subcmd_options $subcmd
					;;
				esac
			else
				__drbdadm_all_resources
			fi
			;;
	esac
}

complete -o default -F _drbdadm drbdadm
