#compdef zpool # Synced with the S11U1 man page _zpool() { local context state line expl implementation local -a subcmds fields ro_props rw_props versions create_properties_dataset _pick_variant -r implementation -c 'zpool upgrade -v' openzfs='This system supports ZFS pool feature flags' solaris subcmds=( create destroy add remove list iostat status online offline clear attach detach replace scrub import export upgrade history get set split help ) if [[ $implementation = openzfs ]] && [[ $OSTYPE != solaris* ]]; then subcmds+=( labelclear initialize ) fi versions=( ${${${(M)"${(f)$(_call_program versions zpool upgrade -v)}":#[[:space:]]#<->*}##[[:space:]]}%%[[:space:]]*} ) ro_props=( "all[All properties]" "allocated[Space allocated]" "capacity[Space used (percentage)]" "dedupratio[Deduplication ratio]" "free[Space unallocated]" "guid[Unique identifier]" "health[Health status]" "size[Total size]" ) rw_props=( "altroot[Alternate root directory]:value:" "autoexpand[Automatic pool expansion]:value:(on off)" "autoreplace[Automatic device replacement]:value:(on off)" "bootfs[Default bootable dataset]:value:" "cachefile[Pool configuration cache file location]:value:" "dedupditto[Threshold for number of copies]:value:" "delegation[Delegated administration]:value:(on off)" "failmode[Failure-mode behavior]:value:(wait continue panic)" "listshares[Show shares in 'zfs list']:value:(on off)" "listsnaps[Show snapshots in 'zfs list']:value:(on off)" "readonly[Controls whether the pool can be modified]:value:(on off)" "version[Pool version]:version:($versions)" ) fields=( ${ro_props%%:*} ${rw_props%%:*} ) create_properties_dataset=( "aclinherit:value:(discard noallow restricted passthrough passthrough-x)" "aclmode:value:(discard mask passthrough)" "atime:value:(on off)" "canmount:value:(on off noauto)" "checksum:value:(on off fletcher2 fletcher4 sha256 sha256+mac)" "compression:value:(on off lzjb gzip gzip-{1..9} zle)" "copies:value:(1 2 3)" "dedup:value:(on off verify sha256 sha256,verify)" "devices:value:(on off)" "encryption:value:(off on aes128-ccm aes-192-ccm aes-256-ccm aes-128-gcm aes-192-gcm aes-256-gcm)" "exec:value:(on off)" "groupquota@:value:" # TODO: complete group=size|none "keysource:value:_zfs_keysource_props" "logbias:value:(latency throughput)" "mlslabel:value:(none)" # TODO: list sensitivity labels "mountpoint:path, 'legacy', or 'none':{if [[ -prefix /* ]]; then _path_files -/; else _wanted mountpoints expl 'mountpoint (type \"/\" to start completing paths)' compadd legacy none; fi}" "nbmand:value:(on off)" "primarycache:value:(all none metadata)" "quota:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == quota= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'quota' compadd none; fi}" "readonly:value:(on off)" "recordsize:value:(512 1K 2K 4K 8K 16K 32K 64K 128K 256K 512K 1M)" "refquota:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == refquota= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'refquota' compadd none; fi}" "refreservation:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == refreservation= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'refreservation' compadd none; fi}" "reservation:value:{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == reservation= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'reservation' compadd none; fi}" "rstchown:value:(on off)" "secondarycache:value:(all none metadata)" "setuid:value:(on off)" "shadow:value:" # TODO: complete URI|none "share:share properties:" "sharenfs:value:(on off)" "sharesmb:value:(on off)" "snapdir:value:(hidden visible)" "sync:value:(standard always disabled)" "userquota@:value:" # TODO: complete user=size|none "version:value:(1 2 3 4 current)" "volsize:value:" # "vscan:value:(on off)" "xattr:value:(on off)" "zoned:value:(on off)" ) if [[ $service == "zpool" ]]; then _arguments -C \ '-\?[show help information]' \ '1:subcommand:compadd -a subcmds' \ '*:: :->subcmd' && return service="$words[1]" curcontext="${curcontext%:*}-$service:" fi case $service in (help) _arguments -A "-*" \ - set1 \ ':command/property:($subcmds ${fields%%\[*} properties)' \ - set2 \ '-l[Display property information]' \ ': :(properties)' ;; (clear) _arguments -A "-*" \ '-F[Discard transactions to allow pool opening]' \ '-f[Ignore fmadm acquit and fmadm repair failures]' \ '-n[With -F, check if discarding transactions would work]' \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (create) # TODO: investigate better vdev handling _arguments -A "-*" \ '-B[Create EFI boot partition on whole disks]' \ '-o[Set pool property at creation time]:property:_values -s , "property" $rw_props' \ '-O[Set dataset property at creation time]:property:_values -s , "property" $create_properties_dataset' \ '-f[Force use of in-use devices]' \ '-l[Display configuration in /dev/chassis location form]' \ '-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]' \ '-l[Display configuration in /dev/chassis location form]' \ '-n[Display configuration without modifying pool]' \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (list) _arguments \ '-H[Scripted mode]' \ '-T[timestamp]:value:(u d)' \ '-o[Fields to list]:field:_values -s , "field" $fields' \ '::pool name:_zfs_pool' ;; (initialize) _arguments -A "-*" \ '(-c --cancel)'{-c,--cancel}'[cancel initializing on specified devices]' \ '(-s --suspend)'{-s,--suspend}'[suspend initializing on specified devices]' \ ':pool name:_zfs_pool' \ '*:device:_files' ;; (iostat) _arguments -A "-*" \ '-l[Display configuration in /dev/chassis location form]' \ '-T[timestamp]:value:(u d)' \ '-v[Verbose statistics]' \ '*::pool name:_zfs_pool' \ '::interval:' \ '::count:' ;; (labelclear) _arguments -A "-*" \ '-f[treat exported or foreign devices as inactive]' \ '*:virtual device:_files' ;; (status) _arguments -A "-*" \ '-l[Display configuration in /dev/chassis location form]' \ '-v[Verbose information]' \ '-x[Show only unhealthy pools]' \ '-T[timestamp]:value:(u d)' \ '*::pool name:_zfs_pool' ;; (offline) _arguments -A "-*" \ '-t[Offline until next reboot]' \ ':pool name:_zfs_pool' \ '*:virtual device:_files' ;; (online) _arguments \ '-e[Expand device to use all available space]' \ ':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 mount options, too _arguments -A "-*" \ '-D[Destroyed pools]' \ '(-d)*-c[Use cache file]:cache file:_files' \ '(-c -D)*-d[Search for devices or files in directory]:directory:_files -/' \ '-F[Recovery mode: discard transactions if required]' \ '-f[Force import]' \ '-l[Display configuration in /dev/chassis location form]' \ '-m[Ignore missing log devices]' \ '-N[Import pool without mounting any filesystems]' \ '-n[With -F; do not perform input]' \ '-R[Alternate root]:alternate root:_files -/' \ '-o[Set pool or dataset property]:property:_values -s , "property" $create_properties_dataset $rw_props' \ - set1 \ '*:pool name or id:_zfs_pool' \ '::new pool name:' \ - set2 \ '-N[Do not mount any filesystems]' \ '-a[All pools]' ;; (get) _arguments -A "-*" \ ':property:_values -s , "property" $fields' \ '*:pool name:_zfs_pool' ;; (set) _arguments -A "-*" \ ':property:_values -s , "property" $rw_props' \ '*:pool name:_zfs_pool' ;; (split) _arguments -A "-*" \ '-R[Alternate root]:alternate root:_files -/' \ '-l[Display configuration in /dev/chassis location form]' \ '-n[Display configuration without splitting]' \ '-o[Set pool or dataset property]:property:_values -s , "property" $create_properties_dataset $rw_props' \ ':pool name or id:_zfs_pool' \ ':new pool name:' \ '*::virtual device:_files -/' ;; (upgrade) _arguments -A "-*" \ - set1 \ '-v[Display ZFS versions and descriptions]' \ - set2 \ "-V[Upgrade to given version]:version:($versions)" \ '-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 "$@"