#compdef zpool _zpool() { local -a subcmds fields subcmds=( create destroy add remove list iostat status online offline clear attach detach replace scrub import export upgrade history get set ) fields=( name\:"Pool name" size\:"Total size" used\:"Space used" available\:"Space available" capacity\:"Space used (percentage)" health\:"Health status" ) properties=( "bootfs:value:" "autoreplace:value:(on off)" "delegation:value:(on off)" ) propnames=( ${properties%%:*} ) import_properties=( xattr copies shareiscsi canmount share sharenfs userprop mount ) if [[ $service == "zpool" ]]; then _arguments -C -A "-*" \ '-\?[Help]' \ '*::command:->subcmd' && return 0 if (( CURRENT == 1 )); then _wanted commands expl "zpool subcommand" compadd -a subcmds return fi service="$words[1]" curcontext="${curcontext%:*}=$service:" fi case $service in (clear) _arguments \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (create) # TODO: investigate better vdev handling _arguments -A "-*" \ '-f[Force use of in-use devices]' \ '-n[Display configuration without creating pool]' \ '-R[Use alternate root]:alternate root:_files -/' \ '-m[Set mountpoint for root dataset]:mountpoint:' \ ':pool name:' \ '*:virtual device:_files' ;; (destroy) _arguments -A "-*" \ '-f[Force active datasets to be unmounted]' \ ':pool name:_zfs_pool' ;; (add) _arguments -A "-*" \ '-f[Force use of in-use devices]' \ '-n[Display configuration without modifying pool]' \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (list) _arguments \ '-H[Scripted mode]' \ '-o[Fields to list]:field:_values -s , "field" ${^fields/\:/[}\]' \ '::pool name:_zfs_pool' ;; (iostat) _arguments -A "-*" \ '-v[Verbose statistics]' \ '*::pool name:_zfs_pool' \ '::interval:' \ '::count:' ;; (status) _arguments -A "-*" \ '-v[Verbose information]' \ '-x[Show only unhealthy pools]' \ '*::pool name:_zfs_pool' ;; (offline) _arguments -A "-*" \ '-t[Offline until next reboot]' \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (online) _arguments \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (attach) # TODO: first device should choose first from existing. _arguments \ '-f[Force attach, even if in use]' \ ':pool name:_zfs_pool' \ ':virtual device:_files' \ ':virtual device:_files' ;; (detach) _arguments \ ':pool name:_zfs_pool' \ ':virtual device:_files' ;; (replace) _arguments -A "-*" \ '-f[Force attach, even if in use]' \ ':pool name:_zfs_pool' \ ':virtual device:_files' \ '::virtual device:_files' ;; (scrub) _arguments -A "-*" \ '-s[Stop scrubbing]' \ '*:pool name:_zfs_pool' ;; (export) _arguments -A "-*" \ '-f[Forcefully unmount all datasets]' \ '*:pool name:_zfs_pool' ;; (import) # TODO: -o should complete options _arguments -A "-*" \ '*-d[Search for devices or files in directory]:_files -/' \ '-D[Destroyed pools]' \ '-f[Force import]' \ - set1 \ '-o[Mount options]' \ '-p[Set property]:property:_values -s , "property" $import_properties' \ '-R[Alternate root]:_files -/' \ '*:pool name or id:_zfs_pool' \ '::new pool name:' \ - set2 \ '-a[All pools]' ;; (get) _arguments -A "-*" \ ':property:_values -s , "property" $propnames all' \ '*:pool name:_zfs_pool' ;; (set) _arguments -A "-*" \ ':property:_values -s , "property" $properties' \ '*:pool name:_zfs_pool' ;; (upgrade) _arguments -A "-*" \ - set1 \ '-v[Display ZFS versions and descriptions]' \ - set2 \ '-a[Upgrade all pools]' \ '*:pool name:_zfs_pool' ;; (history) _arguments -A "-*" \ '-i[Display internal events]' \ '-l[Long format]' \ '*:pool name:_zfs_pool' ;; (*) _message "unknown zpool subcommand: $service" ;; esac } _zpool "$@"