This file is indexed.

/etc/bash_completion.d/drbdadm is in drbd8-utils 2:8.4.4-1ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
# /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=${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