# bash command-line completion for virtualbox # development version, or specially used for my opts # Author: Sebastian T. Hafner # # [ ] adoptstate # [ ] bandwidthctl # [ ] clonehd # [ ] clonevm # [ ] closemedium # [ ] controlvm # [ ] convertfromraw # [ ] createhd # [ ] createvm # [ ] debugvm # [ ] dhcpserver # [ ] discardstate # [ ] export # [ ] extpack # [ ] getextradata # [ ] guestcontrol # [ ] guestproperty # [ ] hostonlyif # [ ] import # [x] list # [ ] metrics # [ ] modifyhd # [ ] modifyvm # [ ] natnetwork # [ ] registervm # [ ] setextradata # [ ] setproperty # [ ] sharedfolder # [ ] showhdinfo # [ ] showvminfo # [ ] snapshot # [x] startvm # [ ] storageattach # [ ] storagectl # [ ] unregistervm # [ ] usbfilter _VBoxManage() { local cur prev opts vms vms cmd count item # TODO: This function works quite well with option 'default'. Unfortunately # there is an issue with filenames which contain space with that setting. # OTOH I don't know how to force bash (or readline) to display full path in # possible matches, so there would be a problem with completion of filenames # if they are in different place on the fs. After an hour or so of trying to # make it work I just gave up :/ _hdcomp() { local cur=$1 local hdds hdds=$(VBoxManage list hdds | \ grep "Location:" | \ sed 's/Location:\s\+//' | \ tr '\n' '|' | \ sed 's/|$//') IFS='|' read -ra hdds <<< "$hdds" for item in "${hdds[@]}" do [[ ${item^^} == ${cur^^}* ]] && COMPREPLY+=("$item") && echo "added hd $item" done } # Custom function to fill up the COMPREPLY. Works well with spaces in the # names of the VMs using option 'filename' for the complete function. Will # not work if you have a pipe in the VM names. Sorry. _vmscomp() { local cur=$1 local vms vms=$(VBoxManage list vms | \ awk -F ' {' '{ print $1 }' | \ tr '\n' '|' | \ sed 's/|$//' | \ sed 's/"//g') IFS='|' read -ra vms <<< "$vms" for item in "${vms[@]}" do [[ ${item^^} == ${cur^^}* ]] && COMPREPLY+=("$item") done } COMP_WORDBREAKS=${COMP_WORDBREAKS//|/} # remove pipe from comp word breaks COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" if [[ COMP_CWORD -ge 2 ]]; then cmd="${COMP_WORDS[1]}" if [[ $cmd == "-q" ]]; then cmd="${COMP_WORDS[2]}" fi fi # all possible commands for the VBoxManage opts=$(VBoxManage -q help | \ egrep -o "^\s\s[a-z]+ " | \ grep -v VBoxManage | \ awk '{print $1}'| \ sort | \ uniq) if [[ ${cur} == "-q" || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi case "${prev}" in # adoptstate) showhdinfo|clonehd) _hdcomp ${cur} ;; --format) COMPREPLY=( $(compgen -W "VDI VMDK VHD RAW" -- ${cur}) ) ;; adoptstate|storageattach|startvm|modifyvm|controlvm|showvminfo|\ unregistervm|vmstatistics|snapshot) _vmscomp ${cur} ;; --type) #startvm --type if [[ ${cmd} == "startvm" ]]; then COMPREPLY=( $(compgen -W "headless vrdp sdl gui" -- ${cur}) ) fi if [[ ${cmd} == "createhd" ]]; then COMPREPLY=( $(compgen -W "normal writethrough" -- ${cur}) ) fi ;; --ostype) OS=`VBoxManage list ostypes | grep ID | awk '{ print $2 }'` COMPREPLY=( $(compgen -W "$OS" \ -- ${cur}) ) ;; --variant) COMPREPLY=( $(compgen -W "Standard Fixed Split2G Stream ESX" \ -- ${cur}) ) ;; --vrdpauthtype) COMPREPLY=( $(compgen -W "null external guest" -- ${cur}) ) ;; --nictype[1-6]) COMPREPLY=( $(compgen -W "Am79C970A Am79C973 82540EM 82543GC 82545EM" -- ${cur}) ) ;; --nic[1-6]) COMPREPLY=( $(compgen -W "bridged none null nat hostonly intnet" \ -- ${cur}) ) ;; --boot[1-4]) COMPREPLY=( $(compgen -W "none floppy dvd disk net" -- ${cur}) ) ;; *vrdp) COMPREPLY=( $(compgen -W "on off" -- ${cur}) ) ;; list) COMPREPLY=( $(compgen -W "vms runningvms ostypes hostdvds hostfloppies intnets bridgedifs hostonlyifs natnets dhcpservers hostinfo hostcpuids hddbackends hdds dvds floppies usbhost usbfilters systemproperties extpacks groups webcams" -- ${cur}) ) ;; # --storageattach --storagectl) CONTROLLER="SATA IDE" COMPREPLY=( $(compgen -W "$CONTROLLER" -- ${cur}) ) ;; --device) COMPREPLY=( $(compgen -W "0" -- ${cur}) ) ;; --port) COMPREPLY=( $(compgen -W "1 2 3 4" -- ${cur}) ) ;; --type) COMPREPLY=( $(compgen -W "dvddrive hdd fdd" -- ${cur}) ) ;; --medium) for item in "none" "emptydrive" "additions" do [[ ${item^^} == ${cur^^}* ]] && COMPREPLY+=("$item") done _hdcomp ${cur} ;; --*) #any options .. COMPREPLY=() ;; *) case "${cmd}" in adoptstate) COMPREPLY=("dupa") ;; createhd) COMPREPLY=( $(compgen -W "--filename --size --type --format --comment --remember --variant" -- ${cur}) ) ;; createvm) COMPREPLY=( $(compgen -W "--name --ostype --register --basefolder --settingsfile --uid" -- ${cur}) ) ;; controlvm) COMPREPLY=( $(compgen -W "pause resume poweroff reset savestate acpipowerbutton acpisleepbutton vrdp" -- ${cur}) ) ;; startvm) COMPREPLY=( $(compgen -W "--type" -- ${cur}) ) ;; snapshot) COMPREPLY=( $(compgen -W "take delete restore restorecurrent edit list showvminfo" -- ${cur}) ) ;; modifyvm) COMPREPLY=( $(compgen -W "--name --memory --ostype --usb --vram --acpi --ioapic --hwvirtex --accelerate3d --cpus --sataportcount --sataport1 --sataport2 --sataport3 --sataport4 --nic1 --nictype1 --nic2 --nictype2 --nic3 --nictype3 --nic4 --nictype4 --nic5 --nictype5 --nic6 --nictype6 --bridgeadapter1 --bridgeadapter2 --bridgeadapter3 --bridgeadapter4 --bridgeadapter5 --bridgeadapter6 --vrdp --vrdpport --vrdpauthtype" \ -- ${cur}) ) ;; closemedium) COMPREPLY=( $(compgen -W "disk dvd floppy" -- ${cur}) ) ;; storageattach) COMPREPLY=( $(compgen -W "--storagectl --device --port --medium --type" -- ${cur}) ) ;; *) COMPREPLY=() ;; esac ;; esac } complete -o filenames -F _VBoxManage VBoxManage #complete -o default -F _VBoxManage VBoxManage # vim: set ft=sh tw=80 sw=4 et :