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