#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)
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:" # <size>
"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'
;;
(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 "$@"