From 6b4282db0c48f1dfc7b326e336deddbb0de34166 Mon Sep 17 00:00:00 2001 From: Roman Dobosz Date: Wed, 25 Mar 2015 22:34:30 +0100 Subject: [PATCH] Fixed a way the vm list is built; several other imporvements --- VBoxManage | 317 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 196 insertions(+), 121 deletions(-) diff --git a/VBoxManage b/VBoxManage index a6c022a..6ed9f7e 100644 --- a/VBoxManage +++ b/VBoxManage @@ -1,166 +1,241 @@ # 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 cmd hdds + 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=() - vms=`VBoxManage -q list vms | awk -F\" '{ print $2 }'` - hdds=`VBoxManage -q list hdds | grep Location | awk -F\/ '{ print $NF }'` + 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 + cmd="${COMP_WORDS[1]}" + if [[ $cmd == "-q" ]]; then + cmd="${COMP_WORDS[2]}" + fi fi - opts=`VBoxManage -q help | grep VBoxManage\ [a-z] | awk '{ print $2 }' | uniq` - opts="$opts -q --quiet -v --version" + + # 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) - COMPREPLY=( $(compgen -W "$hdds" \ - -- ${cur}) ) + _hdcomp ${cur} ;; - --format) - COMPREPLY=( $(compgen -W "VDI VMDK VHD" \ - -- ${cur}) ) + --format) + COMPREPLY=( $(compgen -W "VDI VMDK VHD RAW" -- ${cur}) ) ;; - storageattach|startvm|modifyvm|controlvm|showvminfo|unregistervm|vmstatistics) - COMPREPLY=( $(compgen -W "$vms" \ - -- ${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 + --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 }'` + --ostype) + OS=`VBoxManage list ostypes | grep ID | awk '{ print $2 }'` COMPREPLY=( $(compgen -W "$OS" \ -- ${cur}) ) ;; - --variant) + --variant) COMPREPLY=( $(compgen -W "Standard Fixed Split2G Stream ESX" \ -- ${cur}) ) ;; - --vrdpauthtype) - COMPREPLY=( $(compgen -W "null external guest" \ - -- ${cur}) ) + --vrdpauthtype) + COMPREPLY=( $(compgen -W "null external guest" -- ${cur}) ) ;; - --nictype[1-6]) - COMPREPLY=( $(compgen -W "Am79C970A Am79C973 82540EM 82543GC 82545EM" \ - -- ${cur}) ) + --nictype[1-6]) + COMPREPLY=( $(compgen -W "Am79C970A Am79C973 82540EM 82543GC + 82545EM" -- ${cur}) ) ;; - --nic[1-6]) + --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}) ) + --boot[1-4]) + COMPREPLY=( $(compgen -W "none floppy dvd disk net" -- ${cur}) ) ;; - --sataport[1-6]) - COMPREPLY=( $(compgen -W "$hdds" \ - -- ${cur}) ) + *vrdp) + COMPREPLY=( $(compgen -W "on off" -- ${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}) ) ;; - disk) - COMPREPLY=( $(compgen -W "$hdds" \ - -- ${cur}) ) + # --storageattach + --storagectl) + CONTROLLER="SATA IDE" + COMPREPLY=( $(compgen -W "$CONTROLLER" -- ${cur}) ) ;; - list) - COMPREPLY=( $(compgen -W "vms runningvms ostypes hostdvds hostfloppies - bridgedifs hostonlyifs dhcpservers hostinfo - hddbackends hdds dvds floppies - usbhost usbfilters systemproperties" \ - -- ${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=() ;; - # --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) - COMPREPLY=( $(compgen -W "none $hdds" \ - -- ${cur}) ) - ;; - --*) #any options .. - COMPREPLY=() - ;; *) - case "${cmd}" in - 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}) ) - ;; - 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 + 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 :