| # |
| # /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 |