mirror of
https://github.com/gryf/vboxmanage-bash-completion.git
synced 2025-12-19 12:28:19 +01:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ee3136033 | |||
| cf367c093d | |||
| 7174fe03db | |||
| f2d71065cb | |||
| 82e2fade6b | |||
| 8360d95123 | |||
| 12b0f38741 | |||
| 808c4ac277 | |||
|
|
31a7eec15a | ||
|
|
0ffc79dbe2 | ||
|
|
1ed71c9253 |
@@ -6,7 +6,7 @@ script. However, in some point of time I've decided to rewrite it almost from
|
||||
scratch.
|
||||
|
||||
Current version of script was written and tested against VBoxManage in version
|
||||
6.1.0, and should contain all commands and their options.
|
||||
6.1.32, and should contain all commands and their options.
|
||||
|
||||
Unlike other attempts, I've tried to make the script context aware. See the
|
||||
simple session with the VBoxManage command below, to have an idea how it works:
|
||||
|
||||
186
VBoxManage
186
VBoxManage
@@ -4,11 +4,15 @@
|
||||
# URL: https://bitbucket.org/gryf/vboxmanage-bash-completion
|
||||
# URL: https://github.com/gryf/vboxmanage-bash-completion
|
||||
# License: 3-clause BSD-style license (see LICENSE file)
|
||||
# Version: 6.1.0
|
||||
# Version: 6.1.32
|
||||
|
||||
|
||||
_VBoxManage() {
|
||||
local cur prev opts cmd subcommand tmp items name index result
|
||||
|
||||
# env var GNUSED is either empty or points to a gnu sed executable
|
||||
VBMC_SED=${GNUSED:-sed}
|
||||
|
||||
# Check the COMP_WORDS looking for name of the vm. If name contain space or
|
||||
# is enclosed in quotes, glue name together in variable name. Variable index
|
||||
# will hold the last index of COMP_WORDS array which contain the end of the
|
||||
@@ -65,10 +69,10 @@ _VBoxManage() {
|
||||
hdds=$(VBoxManage list hdds | \
|
||||
grep -A 1 'normal (base)' | \
|
||||
grep "Location:" | \
|
||||
sed 's/Location:\s\+//' | \
|
||||
sed 's/\s/\\ /g' | \
|
||||
$VBMC_SED 's/Location:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra hdds <<< "$hdds"
|
||||
|
||||
for item in "${hdds[@]}"
|
||||
@@ -83,10 +87,10 @@ _VBoxManage() {
|
||||
|
||||
floppies=$(VBoxManage list floppies | \
|
||||
grep "Location:" | \
|
||||
sed 's/Location:\s\+//' | \
|
||||
sed 's/\s/\\ /g' | \
|
||||
$VBMC_SED 's/Location:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra floppies <<< "$floppies"
|
||||
|
||||
for item in "${floppies[@]}"
|
||||
@@ -101,10 +105,10 @@ _VBoxManage() {
|
||||
|
||||
dvds=$(VBoxManage list dvds | \
|
||||
grep "Location:" | \
|
||||
sed 's/Location:\s\+//' | \
|
||||
sed 's/\s/\\ /g' | \
|
||||
$VBMC_SED 's/Location:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra dvds <<< "$dvds"
|
||||
|
||||
for item in "${dvds[@]}"
|
||||
@@ -130,16 +134,16 @@ _VBoxManage() {
|
||||
running_vms=$(VBoxManage list runningvms | \
|
||||
awk -F ' {' '{ print $1 }' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/"//g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/"//g')
|
||||
IFS='|' read -ra running_vms <<< "$running_vms"
|
||||
fi
|
||||
|
||||
vms=$(VBoxManage list $command | \
|
||||
awk -F ' {' '{ print $1 }' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/"//g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/"//g')
|
||||
IFS='|' read -ra vms <<< "$vms"
|
||||
for item in "${vms[@]}"
|
||||
do
|
||||
@@ -162,10 +166,10 @@ _VBoxManage() {
|
||||
vms=$(VBoxManage list vms -l | \
|
||||
egrep '^Name|State' | \
|
||||
egrep -B1 'State:\s+saved' | \
|
||||
grep Name |sed 's/Name:\s\+//' | \
|
||||
grep Name |$VBMC_SED 's/Name:\s\+//' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/"//g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/"//g')
|
||||
IFS='|' read -ra vms <<< "$vms"
|
||||
for item in "${vms[@]}"
|
||||
do
|
||||
@@ -179,9 +183,9 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list groups | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
sed 's/"//g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/"//g')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -196,9 +200,9 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list ostypes | \
|
||||
egrep ^ID: | \
|
||||
sed 's/ID:\s\+//' | \
|
||||
$VBMC_SED 's/ID:\s\+//' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -213,10 +217,10 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list dhcpservers | \
|
||||
grep NetworkName: | \
|
||||
sed 's/NetworkName:\s\+//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/NetworkName:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -231,10 +235,10 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list hostonlyifs | \
|
||||
egrep ^Name: | \
|
||||
sed 's/Name:\s\+//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/Name:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -253,8 +257,8 @@ _VBoxManage() {
|
||||
awk -F ',' '{print $1}' | \
|
||||
awk -F '=' '{print $2}' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/\s/\\ /g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/\s/\\ /g')
|
||||
IFS='|' read -ra rules <<< "$rules"
|
||||
|
||||
for item in "${rules[@]}"
|
||||
@@ -295,7 +299,7 @@ _VBoxManage() {
|
||||
devs=$(VBoxManage controlvm "${name//\\/}" \
|
||||
webcam list | \
|
||||
tr '\n' ' ' | \
|
||||
sed 's/|s$//')
|
||||
$VBMC_SED 's/|s$//')
|
||||
read -ra devs <<< "$devs"
|
||||
|
||||
for item in "${devs[@]}"
|
||||
@@ -312,7 +316,7 @@ _VBoxManage() {
|
||||
devs=$(VBoxManage list webcams | \
|
||||
grep dev | \
|
||||
tr '\n' ' ' | \
|
||||
sed 's/|s$//')
|
||||
$VBMC_SED 's/|s$//')
|
||||
read -ra devs <<< "$devs"
|
||||
|
||||
for item in "${devs[@]}"
|
||||
@@ -323,7 +327,7 @@ _VBoxManage() {
|
||||
|
||||
_list_comp() {
|
||||
local list
|
||||
list=$(VBoxManage list | sed -e '1,2d' \
|
||||
list=$(VBoxManage list | $VBMC_SED -e '1,2d' \
|
||||
-e 's/VBoxManage list //' \
|
||||
-e 's/[\[\]\|]/ /g' \
|
||||
-e 's/|/ /g'|xargs echo)
|
||||
@@ -338,10 +342,10 @@ _VBoxManage() {
|
||||
folders=$(VBoxManage showvminfo ${vm} --machinereadable | \
|
||||
grep SharedFolderName | \
|
||||
awk -F= '{print $2}' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//' | \
|
||||
sed 's/"//g')
|
||||
$VBMC_SED 's/|$//' | \
|
||||
$VBMC_SED 's/"//g')
|
||||
IFS='|' read -ra folders <<< "$folders"
|
||||
|
||||
for item in "${folders[@]}"
|
||||
@@ -356,10 +360,10 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list natnets | \
|
||||
grep NetworkName: | \
|
||||
sed 's/NetworkName:\s\+//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/NetworkName:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -374,10 +378,10 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list bridgedifs | \
|
||||
egrep ^Name: | \
|
||||
sed 's/Name:\s\+//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/Name:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -392,10 +396,10 @@ _VBoxManage() {
|
||||
|
||||
list=$(VBoxManage list intnets| \
|
||||
egrep ^Name: | \
|
||||
sed 's/Name:\s\+//' | \
|
||||
sed 's/\s/\\ /g'| \
|
||||
$VBMC_SED 's/Name:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g'| \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra list <<< "$list"
|
||||
|
||||
for item in "${list[@]}"
|
||||
@@ -438,10 +442,10 @@ _VBoxManage() {
|
||||
|
||||
providers=$(VBoxManage list cloudproviders | \
|
||||
grep "Short Name:" | \
|
||||
sed 's/Short Name:\s\+//' | \
|
||||
sed 's/\s/\\ /g' | \
|
||||
$VBMC_SED 's/Short Name:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra providers <<< "$providers"
|
||||
|
||||
for item in "${providers[@]}"
|
||||
@@ -449,17 +453,17 @@ _VBoxManage() {
|
||||
[[ ${item^^} == ${cur^^}* ]] && COMPREPLY+=("$item")
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
_cloudprofiles_comp() {
|
||||
local profiles
|
||||
local item
|
||||
|
||||
profiles=$(VBoxManage list cloudprofiles | \
|
||||
grep "Name:" | \
|
||||
sed 's/Name:\s\+//' | \
|
||||
sed 's/\s/\\ /g' | \
|
||||
$VBMC_SED 's/Name:\s\+//' | \
|
||||
$VBMC_SED 's/\s/\\ /g' | \
|
||||
tr '\n' '|' | \
|
||||
sed 's/|$//')
|
||||
$VBMC_SED 's/|$//')
|
||||
IFS='|' read -ra profiles <<< "$profiles"
|
||||
|
||||
for item in "${profiles[@]}"
|
||||
@@ -482,16 +486,18 @@ _VBoxManage() {
|
||||
|
||||
# all possible commands for the VBoxManage
|
||||
opts=$(VBoxManage -q help | \
|
||||
egrep -o "^\s\s[a-z]+ " | \
|
||||
grep -E -o "^\s\s[a-z]+ " | \
|
||||
grep -v VBoxManage | \
|
||||
awk '{print $1}'| \
|
||||
sort | \
|
||||
uniq)
|
||||
|
||||
# Add some commands manually, since they are listed differently in
|
||||
# vboxmanage help.
|
||||
opts="${opts} mediumio debugvm unattended extpack clonevm snapshot
|
||||
dhcpserver cloudprofile cloud"
|
||||
# Add commands which are defined as ` VBoxManage commandname ` in a help.
|
||||
opts="${opts} $(VBoxManage -q help | \
|
||||
grep -E -o '^\s\s[a-zA-Z]+\s[a-z]+' | \
|
||||
awk '{print $2}'| \
|
||||
sort | \
|
||||
uniq)"
|
||||
|
||||
if [[ ${cur} == "-q" || ${COMP_CWORD} -eq 1 ]] ; then
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||
@@ -687,14 +693,19 @@ _VBoxManage() {
|
||||
;;
|
||||
|
||||
cloud)
|
||||
if [[ " ${COMP_WORDS[@]} " != *" --provider"* ||
|
||||
if [ "${prev}" == "cloud" ]; then
|
||||
items=(--provider --profile network)
|
||||
elif [[ " ${COMP_WORDS[@]} " == *" network"* ]]; then
|
||||
items=(update delete info)
|
||||
elif [[ " ${COMP_WORDS[@]} " != *" --provider"* ||
|
||||
" ${COMP_WORDS[@]} " != *" --profile"* ]]; then
|
||||
items=(--provider --profile)
|
||||
else
|
||||
[[ " ${COMP_WORDS[@]} " != *" list"* &&
|
||||
" ${COMP_WORDS[@]} " != *" instance"* &&
|
||||
" ${COMP_WORDS[@]} " != *" network"* &&
|
||||
" ${COMP_WORDS[@]} " != *" image"* ]] &&
|
||||
items=(list instance image)
|
||||
items=(list instance image network)
|
||||
fi
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
@@ -711,14 +722,18 @@ _VBoxManage() {
|
||||
COMPREPLY=( $(compgen -W "instances images" -- ${cur}) )
|
||||
;;
|
||||
instance)
|
||||
COMPREPLY=( $(compgen -W "create info terminate start
|
||||
COMPREPLY=( $(compgen -W "create info terminate start
|
||||
pause" -- ${cur}) )
|
||||
;;
|
||||
image)
|
||||
COMPREPLY=( $(compgen -W "create info delete import
|
||||
export" -- ${cur}) )
|
||||
;;
|
||||
|
||||
network) # TODO: differentiate between setup/create and update/delete/info
|
||||
if [[ " ${COMP_WORDS[@]} " == *" --provider"* ]]; then
|
||||
COMPREPLY=( $(compgen -W "setup create" -- ${cur}) )
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if [[ " ${COMP_WORDS[@]} " == *" list images"* ]]; then
|
||||
|
||||
@@ -728,8 +743,9 @@ _VBoxManage() {
|
||||
fi
|
||||
|
||||
if [[ " ${COMP_WORDS[@]} " == *" instance create"* ]]; then
|
||||
items=(--domain-name --display-name --shape --subnet --publicip
|
||||
--boot-disk-size --privateip --public-ssh-key --launch-mode)
|
||||
items=( --domain-name --display-name --shape --subnet
|
||||
--publicip --boot-disk-size --privateip --public-ssh-key
|
||||
--launch-mode --cloud-init-script-path )
|
||||
[[ " ${COMP_WORDS[@]} " != *" --image-id"* &&
|
||||
" ${COMP_WORDS[@]} " != *" --boot-volume-id"* ]] &&
|
||||
items+=(--image-id --boot-volume-id)
|
||||
@@ -742,7 +758,7 @@ _VBoxManage() {
|
||||
COMPREPLY=( $(compgen -W "true false" -- ${cur}) )
|
||||
;;
|
||||
--launch-mode)
|
||||
COMPREPLY=( $(compgen -W "NATIVE EMULATED
|
||||
COMPREPLY=( $(compgen -W "NATIVE EMULATED
|
||||
PARAVIRTUALIZED" -- ${cur}) )
|
||||
;;
|
||||
esac
|
||||
@@ -753,7 +769,7 @@ _VBoxManage() {
|
||||
" ${COMP_WORDS[@]} " == *" instance pause"* ]]; then
|
||||
COMPREPLY=( $(compgen -W "--id" -- ${cur}) )
|
||||
fi
|
||||
|
||||
|
||||
if [[ " ${COMP_WORDS[@]} " == *" image create"* ]]; then
|
||||
items=(--display-name --bucket-name --object-name --instance-id)
|
||||
|
||||
@@ -765,13 +781,41 @@ _VBoxManage() {
|
||||
COMPREPLY=( $(compgen -W "--id" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" image import"* ]]; then
|
||||
COMPREPLY=( $(compgen -W "--id --bucket-name
|
||||
COMPREPLY=( $(compgen -W "--id --bucket-name
|
||||
--object-name" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" image export"* ]]; then
|
||||
COMPREPLY=( $(compgen -W "--id --display-name --bucket-name
|
||||
COMPREPLY=( $(compgen -W "--id --display-name --bucket-name
|
||||
--object-name" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" network setup"* ]]; then
|
||||
items=( --local-gateway-iso --gateway-os-name
|
||||
--gateway-os-version --gateway-shape --tunnel-network-name
|
||||
--tunnel-network-range --guest-additions-iso --proxy
|
||||
--compartment-id )
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" network create"* ]]; then
|
||||
items=( --name --network-id )
|
||||
[[ " ${COMP_WORDS[@]} " != *" --enable"* &&
|
||||
" ${COMP_WORDS[@]} " != *" --disable"* ]] &&
|
||||
items+=(--enable --disable)
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" network update"* ]]; then
|
||||
items=( --name --network-id )
|
||||
[[ " ${COMP_WORDS[@]} " != *" --enable"* &&
|
||||
" ${COMP_WORDS[@]} " != *" --disable"* ]] &&
|
||||
items+=(--enable --disable)
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
fi
|
||||
if [[ " ${COMP_WORDS[@]} " == *" network info"* ||
|
||||
" ${COMP_WORDS[@]} " == *" network delete"* ]]; then
|
||||
COMPREPLY=( $(compgen -W "--name" -- ${cur}) )
|
||||
fi
|
||||
;;
|
||||
|
||||
controlvm)
|
||||
@@ -1226,7 +1270,7 @@ _VBoxManage() {
|
||||
;;
|
||||
|
||||
"export")
|
||||
items=( --manifest --iso --options --vsys --cloud )
|
||||
items=( --manifest --options --vsys --cloud --cloudinitscriptpath )
|
||||
if [[ ${prev} == ${cmd} ]]; then
|
||||
_vms_comp vms
|
||||
elif [[ ${prev} == "--eulafile" ]]; then
|
||||
@@ -1252,7 +1296,7 @@ _VBoxManage() {
|
||||
items+=(--vmname --cloudprofile --cloudshape --clouddomain
|
||||
--clouddisksize --cloudbucket --cloudocivcn --cloudocisubnet
|
||||
--cloudkeepobject --cloudlaunchinstance --cloudpublicip
|
||||
--cloudprivateip --cloudlaunchmode)
|
||||
--cloudprivateip --cloudlaunchmode --cloudinitscriptpath )
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
|
||||
@@ -1277,7 +1321,7 @@ _VBoxManage() {
|
||||
if [[ " ${items[@]} " == *" $subcommand "* ]]; then
|
||||
case "${subcommand}" in
|
||||
install)
|
||||
_get_excluded_items "--replace"
|
||||
_get_excluded_items "--replace --accept-license"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
;;
|
||||
uninstall)
|
||||
@@ -2300,7 +2344,7 @@ _VBoxManage() {
|
||||
case "${subcommand}" in
|
||||
add)
|
||||
items=(--name --hostpath --transient --readonly
|
||||
--automount)
|
||||
--automount --auto-mount-point)
|
||||
_get_excluded_items "${items[@]}"
|
||||
COMPREPLY=( $(compgen -W "$result" -- ${cur}) )
|
||||
;;
|
||||
|
||||
Reference in New Issue
Block a user