123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- # Copyright (c) 2010, Aneurin Price <aneurin.price@gmail.com>
- # Permission is hereby granted, free of charge, to any person
- # obtaining a copy of this software and associated documentation
- # files (the "Software"), to deal in the Software without
- # restriction, including without limitation the rights to use,
- # copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the
- # Software is furnished to do so, subject to the following
- # conditions:
- # The above copyright notice and this permission notice shall be
- # included in all copies or substantial portions of the Software.
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- # OTHER DEALINGS IN THE SOFTWARE.
- __zfs_get_commands()
- {
- zfs 2>&1 | awk '/^\t[a-z]/ {print $1}' | uniq
- }
- __zfs_get_properties()
- {
- zfs get 2>&1 | awk '$2 == "YES" || $2 == "NO" {print $1}'; echo all
- }
- __zfs_get_editable_properties()
- {
- zfs get 2>&1 | awk '$2 == "YES" {printf("%s=\n", $1)}'
- }
- __zfs_get_inheritable_properties()
- {
- zfs get 2>&1 | awk '$3 == "YES" {print $1}'
- }
- __zfs_list_datasets()
- {
- zfs list -H -o name
- }
- __zfs_list_filesystems()
- {
- zfs list -H -o name -t filesystem
- }
- __zfs_list_snapshots()
- {
- zfs list -H -o name -t snapshot
- }
- __zfs_list_volumes()
- {
- zfs list -H -o name -t volume
- }
- __zfs_argument_chosen()
- {
- for word in $(seq $((COMP_CWORD-1)) -1 2)
- do
- local prev="${COMP_WORDS[$word]}"
- for property in $@
- do
- if [ "x$prev" = "x$property" ]
- then
- return 0
- fi
- done
- done
- return 1
- }
- __zfs_complete_ordered_arguments()
- {
- local list1=$1
- local list2=$2
- local cur=$3
- local extra=$4
- if __zfs_argument_chosen $list1
- then
- COMPREPLY=($(compgen -W "$list2 $extra" -- "$cur"))
- else
- COMPREPLY=($(compgen -W "$list1 $extra" -- "$cur"))
- fi
- }
- __zfs_complete()
- {
- local cur prev cmd cmds
- COMPREPLY=()
- cur="${COMP_WORDS[COMP_CWORD]}"
- prev="${COMP_WORDS[COMP_CWORD-1]}"
- cmd="${COMP_WORDS[1]}"
- cmds=$(__zfs_get_commands)
- if [ "${prev##*/}" = "zfs" ]
- then
- COMPREPLY=($(compgen -W "$cmds -?" -- "$cur"))
- return 0
- fi
- case "${cmd}" in
- clone)
- __zfs_complete_ordered_arguments "$(__zfs_list_snapshots)" "$(__zfs_list_filesystems) $(__zfs_list_volumes)" $cur
- return 0
- ;;
- get)
- __zfs_complete_ordered_arguments "$(__zfs_get_properties)" "$(__zfs_list_datasets)" "$cur" "-H -r -p"
- return 0
- ;;
- inherit)
- __zfs_complete_ordered_arguments "$(__zfs_get_inheritable_properties)" "$(__zfs_list_datasets)" $cur
- return 0
- ;;
- list)
- if [ "x$prev" = "x-o" ]
- then
- COMPREPLY=($(compgen -W "$(__zfs_get_properties)" -- "${cur##*,}"))
- local existing_opts=$(expr "$cur" : '\(.*,\)')
- if [ ! "x$existing_opts" = "x" ]
- then
- COMPREPLY=( "${COMPREPLY[@]/#/${existing_opts}}" )
- fi
- else
- COMPREPLY=($(compgen -W "$(__zfs_list_datasets) -H -r -o" -- "$cur"))
- fi
- return 0
- ;;
- promote)
- COMPREPLY=($(compgen -W "$(__zfs_list_filesystems)" -- "$cur"))
- return 0
- ;;
- rollback|send)
- COMPREPLY=($(compgen -W "$(__zfs_list_snapshots)" -- "$cur"))
- return 0
- ;;
- snapshot)
- COMPREPLY=($(compgen -W "$(__zfs_list_filesystems) $(__zfs_list_volumes)" -- "$cur"))
- return 0
- ;;
- set)
- __zfs_complete_ordered_arguments "$(__zfs_get_editable_properties)" "$(__zfs_list_filesystems) $(__zfs_list_volumes)" $cur
- return 0
- ;;
- *)
- COMPREPLY=($(compgen -W "$(__zfs_list_datasets)" -- "$cur"))
- return 0
- ;;
- esac
- }
- __zpool_get_commands()
- {
- zpool 2>&1 | awk '/^\t[a-z]/ {print $1}' | uniq
- }
- __zpool_get_properties()
- {
- zpool get 2>&1 | awk '$2 == "YES" || $2 == "NO" {print $1}'; echo all
- }
- __zpool_get_editable_properties()
- {
- zpool get 2>&1 | awk '$2 == "YES" {printf("%s=\n", $1)}'
- }
- __zpool_list_pools()
- {
- zpool list -H -o name
- }
- __zpool_complete()
- {
- local cur prev cmd cmds
- COMPREPLY=()
- cur="${COMP_WORDS[COMP_CWORD]}"
- prev="${COMP_WORDS[COMP_CWORD-1]}"
- cmd="${COMP_WORDS[1]}"
- cmds=$(__zpool_get_commands)
- if [ "${prev##*/}" = "zpool" ]
- then
- COMPREPLY=($(compgen -W "$cmds" -- "$cur"))
- return 0
- fi
- case "${cmd}" in
- get)
- __zfs_complete_ordered_arguments "$(__zpool_get_properties)" "$(__zpool_list_pools)" $cur
- return 0
- ;;
- import)
- if [ "x$prev" = "x-d" ]
- then
- _filedir -d
- else
- COMPREPLY=($(compgen -W "$(__zpool_list_pools) -d" -- "$cur"))
- fi
- return 0
- ;;
- set)
- __zfs_complete_ordered_arguments "$(__zpool_get_editable_properties)" "$(__zpool_list_pools)" $cur
- return 0
- ;;
- add|attach|clear|create|detach|offline|online|remove|replace)
- local pools="$(__zpool_list_pools)"
- if __zfs_argument_chosen $pools
- then
- _filedir
- else
- COMPREPLY=($(compgen -W "$pools" -- "$cur"))
- fi
- return 0
- ;;
- *)
- COMPREPLY=($(compgen -W "$(__zpool_list_pools)" -- "$cur"))
- return 0
- ;;
- esac
- }
- complete -F __zfs_complete zfs
- complete -o filenames -F __zpool_complete zpool
|