149 lines
3.5 KiB
Bash
149 lines
3.5 KiB
Bash
#!/usr/bin/env bash
|
|
# bash completion for virsh - main CLI of libvirt
|
|
|
|
# This script provides bash completion for virsh,
|
|
# borrowed from https://github.com/LuyaoHuang/virsh-bash-completion
|
|
|
|
|
|
|
|
_contain_cmd()
|
|
{
|
|
local e f
|
|
local array1=($1) array2=($2)
|
|
|
|
for e in "${array1[@]}"
|
|
do
|
|
for f in "${array2[@]}"
|
|
do
|
|
if [[ "$e" == "$f" ]] ; then
|
|
echo $e
|
|
return
|
|
fi
|
|
done
|
|
done
|
|
|
|
echo "notfound"
|
|
return
|
|
}
|
|
|
|
_virsh_list_networks()
|
|
{
|
|
local flag_all=$1 flags
|
|
|
|
if [ "$flag_all" -eq 1 ]; then
|
|
flags="--all"
|
|
else
|
|
flags="--inactive"
|
|
fi
|
|
virsh -q net-list $flags | cut -d\ -f2 | awk '{print $1}'
|
|
}
|
|
|
|
_virsh_list_domains()
|
|
{
|
|
local flag_all=$1 flags
|
|
|
|
if [ "$flag_all" -eq 1 ]; then
|
|
flags="--all"
|
|
else
|
|
flags="--inactive"
|
|
fi
|
|
virsh -q list $flags | cut -d\ -f7 | awk '{print $1}'
|
|
}
|
|
|
|
_virsh_list_pools()
|
|
{
|
|
local flag_all=$1 flags
|
|
|
|
if [ "$flag_all" -eq 1 ]; then
|
|
flags="--all"
|
|
else
|
|
flags="--inactive"
|
|
fi
|
|
virsh -q pool-list $flags | cut -d\ -f2 | awk '{print $1}'
|
|
}
|
|
|
|
_virsh_list_ifaces()
|
|
{
|
|
local flag_all=$1 flags
|
|
|
|
if [ "$flag_all" -eq 1 ]; then
|
|
flags="--all"
|
|
else
|
|
flags="--inactive"
|
|
fi
|
|
virsh -q iface-list $flags | cut -d\ -f2 | awk '{print $1}'
|
|
}
|
|
|
|
_virsh_list_nwfilters()
|
|
{
|
|
|
|
virsh -q nwfilter-list | cut -d\ -f4 | awk '{print $1}'
|
|
}
|
|
|
|
_virsh()
|
|
{
|
|
local cur prev cmds doms options nets pools cmds_help
|
|
local flag_all=1 array ret a b ifaces nwfilters files
|
|
|
|
# not must use bash-completion now :)
|
|
# _init_completion -s || return
|
|
COMPREPLY=()
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
|
|
cmds=$( echo "$(virsh -h| grep '^ ' | cut -d\ -f5)" \
|
|
"$(virsh -h| grep '\--' | cut -d\ -f7 | cut -d= -f1)")
|
|
cmds_help=$(virsh help| grep '^ ' | cut -d\ -f5)
|
|
case "$prev" in
|
|
--domain)
|
|
doms=$(_virsh_list_domains "$flag_all")
|
|
COMPREPLY=( $(compgen -W "$doms" -- "$cur") )
|
|
return 0
|
|
;;
|
|
--network)
|
|
nets=$(_virsh_list_networks "$flag_all")
|
|
COMPREPLY=( $(compgen -W "$nets" -- "$cur") )
|
|
return 0
|
|
;;
|
|
--pool)
|
|
pools=$(_virsh_list_pools "$flag_all")
|
|
COMPREPLY=( $(compgen -W "$pools" -- "$cur") )
|
|
return 0
|
|
;;
|
|
--interface)
|
|
ifaces=$(_virsh_list_ifaces "$flag_all")
|
|
COMPREPLY=( $(compgen -W "$ifaces" -- "$cur") )
|
|
return 0
|
|
;;
|
|
--nwfilter)
|
|
nwfilters=$(_virsh_list_nwfilters)
|
|
COMPREPLY=( $(compgen -W "$nwfilters" -- "$cur") )
|
|
return 0
|
|
;;
|
|
--file|--xml)
|
|
files=$(ls)
|
|
COMPREPLY=( $(compgen -W "$files" -- "$cur") )
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
array=$(IFS=$'\n'; echo "${COMP_WORDS[*]}")
|
|
ret=$(_contain_cmd "$array" "$cmds_help")
|
|
|
|
if [[ "$ret" != "notfound" && "$ret" != "$cur" ]]; then
|
|
a=$(virsh help "$ret" |grep '^ --'|cut -d\ -f5)
|
|
b=$(virsh help "$ret" |grep '^ \[--'|cut -d\ -f5|cut -d[ -f2|cut -d] -f1)
|
|
options=$( echo $a $b )
|
|
COMPREPLY=( $(compgen -W "$options" -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
case "$cur" in
|
|
*)
|
|
COMPREPLY=( $(compgen -W "$cmds" -- "$cur") )
|
|
return 0
|
|
;;
|
|
esac
|
|
} &&
|
|
complete -o default -F _virsh virsh
|