#compdef vmctl
local context line state state_descr
local -a subcommands vmctl_status
local -A opt_args
_vm_name() {
compadd "$@" - ${${${(@f)"$(_call_program vmctl_status vmctl status)"}[2,-1]}##* }
}
_vm_switch() {
[[ -r /etc/vm.conf ]] &&
compadd "$@" - ${${${(M)${(f)"$(</etc/vm.conf)"}:#switch *}##switch ##\"#}%%\"# *}
}
subcommands=(
console:'connect to the console of the VM'
create:'create a VM disk image'
load:'load additional configuration'
log:'change logging verbosity'
pause:'pause a VM'
receive:'receive a VM from stdin'
reload:'remove stopped VMs and reload config'
reset:'reset specified component'
send:'send VM to stdout and terminate it'
{show,status}:'list VMs running or just the specified id'
start:'start a VM'
stop:'stop a VM'
unpause:'unpause a VM'
)
if (( CURRENT == 2 )); then
_describe subcommand subcommands
else
shift words; (( CURRENT-- ))
case $words[1] in
console|pause|send|show|status|stop|unpause)
_arguments ':id:_vm_name'
;;
create)
_arguments \
':path:_files' \
': :(-s)' \
':disk size in megabytes: '
;;
load)
_arguments ':configuration file:_files'
;;
log)
_arguments ':logging verbosity:(brief verbose)'
;;
receive)
_arguments ':name: '
;;
reset)
_arguments ':reset option:((
all\:"reset the running state"
switches\:"reset the configured switches"
vms\:"reset and terminate all VMs"
))'
;;
start)
if (( CURRENT == 2 )); then
_vm_name
else
shift words; (( CURRENT-- ))
_arguments -s \
'-b+[boot with the specified kernel or BIOS image]:boot image:_files' \
'-c[automatically connect to the VM console]' \
'*-d+[disk image file]:disk image:_files' \
'-i+[number of network interfaces]:number: ' \
'-L[add a local network interface]' \
'-m+[memory size in megabytes]:megabytes: ' \
'-n+[specify switch to attach]:switch:_vm_switch' \
'-r+[ISO image file for virtual CD-ROM]:ISO image:_files'
fi
;;
esac
fi