blob: e4de2e725108d5938bd8680ee5f98075cea3c60a [file] [log] [blame] [raw]
# OpenVZ vzctl bash completion by Kir Kolyshkin <kir@openvz.org>
# Put this file to /etc/bash_completion.d/
# modified Thorsten Schifferdecker <tsd@debian.systs.org>
_get_ves()
{
local cmd=$1
local rm_empty='sed s/^-[[:space:]]*//'
# Only allow this completion when user has root privileges
[ "$EUID" -ne 0 ] && return 1
case $cmd in
create)
# create a new CTID, by increasing the last one
local veids=`@SBINDIR@/vzlist -H -a -octid \
2>/dev/null | tail -1`
[ -n "$veids" ] || veids=100
echo $((veids+1))
;;
start|mount|umount|destroy|delete)
# stopped CTs
@SBINDIR@/vzlist -H -S -octid 2>/dev/null
@SBINDIR@/vzlist -H -S -oname 2>/dev/null | $rm_empty
;;
stop|restart|enter|exec*|suspend|chkpnt)
# running CTs
@SBINDIR@/vzlist -H -octid 2>/dev/null
@SBINDIR@/vzlist -H -oname 2>/dev/null | $rm_empty
;;
resume|restore)
# suspended CTs
(@SBINDIR@/vzlist -HS -o status,ctid;
@SBINDIR@/vzlist -HS -o status,name) 2>/dev/null | \
grep '^suspended ' | \
sed 's/^suspended *//' | $rm_empty
;;
convert)
# stopped CTs on simfs
(@SBINDIR@/vzlist -HS -o layout,ctid;
@SBINDIR@/vzlist -HS -o layout,name) 2>/dev/null | \
grep '^simfs ' | \
sed 's/^simfs *//' | $rm_empty
;;
compact|snapshot*)
# CTs on ploop
(@SBINDIR@/vzlist -H -a -o layout,ctid;
@SBINDIR@/vzlist -H -a -o layout,name) 2>/dev/null | \
grep '^ploop ' | \
sed 's/^ploop *//' | $rm_empty
;;
*)
# All CTs
@SBINDIR@/vzlist -H -a -octid 2>/dev/null
@SBINDIR@/vzlist -H -a -oname 2>/dev/null | $rm_empty
;;
esac
}
_vzctl()
{
#echo "ARGS: $*"
#echo "COMP_WORDS: $COMP_WORDS"
#echo "COMP_CWORD: $COMP_CWORD"
#echo "COMP_WORDS[1]: ${COMP_WORDS[1]}"
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
local vzctl_common_opts="--quiet --verbose --help --version"
local vzctl_cmds="create destroy delete mount umount chkpnt restore \
suspend resume \
set start stop restart status quotaon quotaoff quotainit \
enter exec exec2 runscript console"
local vzctl_create_opts="--ostemplate --config --private --root \
--layout --diskspace --diskinodes --ipadd --hostname \
--name --description"
local vzctl_convert_opts="--layout"
local vzctl_set_opts="--save --onboot --root --private \
--userpasswd --disabled --ipadd --ipdel \
--hostname --nameserver --searchdomain \
--numproc --numtcpsock --numothersock --vmguarpages \
--kmemsize --tcpsndbuf --tcprcvbuf --othersockbuf \
--dgramrcvbuf --oomguarpages --lockedpages --privvmpages \
--shmpages --numfile --numflock --numpty --numsiginfo \
--dcachesize --numiptent --physpages --swappages \
--vm_overcommit --cpuunits --cpulimit --cpus --cpumask --nodemask \
--netfilter --netdev_add --netdev_del --netif_add --netif_del \
--diskquota --mount_opts \
--diskspace --diskinodes --quotatime --quotaugidlimit \
--capability --devnodes --devices --applyconfig \
--name --ioprio --iolimit --iopslimit \
--setmode --meminfo --bootorder --features \
--reset_ub --stop-timeout --offline-resize"
local vzctl_start_opts="--wait --force --skip-fsck --skip-remount"
local vzctl_stop_opts="--fast --skip-umount"
local vzctl_restart_opts="$vzctl_start_opts $vzctl_stop_opts"
local vzctl_snapshot_create_opts="--id --name --description \
--skip-suspend --skip-config"
local vzctl_snapshot_switch_opts="--id --skip-resume --must-resume \
--skip-config"
local vzctl_snapshot_mount_opts="--id --target"
local vzctl_snapshot_list_opts="-H --no-header -o --output --id \
-L --list --help"
local netfilter_names="disabled stateless stateful full"
local cap_names="chown dac_override dac_read_search fowner fsetid kill
setgid setuid setpcap linux_immutable net_bind_service
net_broadcast net_admin net_raw ipc_lock ipc_owner
sys_module sys_rawio sys_chroot sys_ptrace sys_pacct
sys_admin sys_boot sys_nice sys_resource sys_time
sys_tty_config mknod lease setveid ve_admin"
local feature_names="sysfs nfs sit ipip ppp ipgre bridge nfsd"
if test -f /proc/vz/ploop_minor; then
vzctl_cmds+=" convert compact snapshot \
snapshot-mount snapshot-umount \
snapshot-switch snapshot-delete snapshot-list"
fi
case $COMP_CWORD in
1)
# command or global option
COMPREPLY=( $( compgen -W "$vzctl_cmds $vzctl_common_opts" -- $cur ) )
;;
2)
case "$prev" in
--help|--version)
COMPREPLY=()
;;
--*)
# command
COMPREPLY=( $( compgen -W "$vzctl_cmds" -- $cur ) )
;;
*)
# CTID
COMPREPLY=( $( compgen -W "$(_get_ves $prev)" -- $cur ) )
;;
esac
;;
*) # COMP_CWORD >= 3
if [ $COMP_CWORD -eq 3 -a ${COMP_WORDS[1]::2} = "--" ]; then
# Global option was used, need CTID here
COMPREPLY=( $( compgen -W "$(_get_ves $prev)" -- $cur ) )
else
# flag or option
case $prev in
--ostemplate)
COMPREPLY=( $( compgen -W "$(@SBINDIR@/vztmpl-dl --list-all)" -- $cur ) )
;;
--onboot|--disabled|--diskquota)
COMPREPLY=( $( compgen -W "yes no" -- $cur ) )
;;
--setmode)
COMPREPLY=( $( compgen -W "restart ignore" -- $cur ) )
;;
--config|--applyconfig)
local configs=$(command ls -1 @VPSCONFDIR@/*.conf-sample |
cut -d "-" -f 2- | sed -e 's#.conf-sample$##')
COMPREPLY=( $( compgen -W "$configs" -- $cur ) )
;;
--layout)
COMPREPLY=( $( compgen -W "ploop ploop:expanded ploop:plain ploop:raw simfs" -- $cur ) )
;;
--netfilter)
COMPREPLY=( $( compgen -W "$netfilter_names" -- $cur ) )
;;
--netdev*)
local devs=`ip addr show | awk '/^[0-9]/ && /UP/ && !/venet/ && !/lo/ \
{ print $2 }' | sed s/://`
COMPREPLY=( $( compgen -W "$devs" -- $cur ) )
;;
--meminfo)
local meminfo="none privvmpages:1"
COMPREPLY=( $( compgen -W "$meminfo" -- $cur ) )
;;
--ioprio)
# ioprio range: 0 - 7 (default : 4)
local ioprio='0 1 2 3 4 5 6 7'
COMPREPLY=( $( compgen -W "$ioprio" -- $cur ) )
;;
--capability)
# capname:on|off
COMPREPLY=( $( compgen -W "$cap_names" -- $cur ) )
# FIXME: add :on or :off -- doesn't work :(
# if [[ ${#COMPREPLY[@]} -le 1 ]]; then
# if [[ $cur =~ ":" ]]; then
# cap=${cur%%:*}
# else
# cap=${COMPREPLY[0]%%:*}
# fi
# Single match: add :on|:off
# COMPREPLY=( $(compgen -W \
# "${cap}:on ${cap}:off" -- $cur) )
# fi
;;
--features)
# featurename:on|off
COMPREPLY=( $( compgen -W "$feature_names" -- $cur ) )
# FIXME: add :on or :off -- can't make it work
;;
--devnodes)
# FIXME: device:r|w|rw|none
local devs=''
COMPREPLY=( $( compgen -W "$devs" -- $cur ) )
;;
--devices)
# FIXME: b|c:major:minor|all:r|w|rw
local devices=''
COMPREPLY=( $( compgen -W "$devices" -- $cur ) )
;;
--ipdel)
# Only allow this completion
# when user has root privileges
[ "$EUID" -ne 0 ] && return 1
# Get CTID
local cmd=${COMP_WORDS[1]}
local ve=${COMP_WORDS[2]}
if [ ${cmd::2} = "--" ] ; then
# --verbose or --quiet used
ve=${COMP_WORDS[3]}
fi
local ips="`@SBINDIR@/vzlist -H -o ip $ve 2>/dev/null | grep -vi -`"
COMPREPLY=( $( compgen -W "$ips all" -- $cur ) )
;;
--netif_del)
local netif
if [ -f /proc/vz/veth ]; then
# Get CTID
local cmd=${COMP_WORDS[1]}
local ve=${COMP_WORDS[2]}
if [ ${cmd::2} = "--" ] ; then
# --verbose or --quiet used
ve=${COMP_WORDS[3]}
fi
# get veth(ernet) device of CT, proc and config
local netif_proc="`awk "/${ve}/ { print \\$4 }" /proc/vz/veth`"
local netif_conf="`grep ^NETIF /etc/vz/conf/${ve}.conf |
sed -e 's/"/\n/g' -e 's/;/\n/g' -e 's/,/\n/g' -e 's/=/ /g' | awk '/^ifname/ {print \$2}'`"
netif="$netif_proc $netif_conf"
fi
COMPREPLY=( $( compgen -W "$netif" -- $cur ) )
;;
--private|--root)
# FIXME
# Dir autocompletion works bad since there is
# a space added. Alternatively, we could use
# -o dirname option to 'complete' -- but it
# makes no sense for other parameters (UBCs
# etc). So no action for now.
;;
--id|--uuid)
# Only allow this completion
# when user has root privileges
[ "$EUID" -ne 0 ] && return 1
# Get command and CTID
local cmd=${COMP_WORDS[1]}
local ve=${COMP_WORDS[2]}
if [ ${cmd::2} = "--" ] ; then
# --verbose or --quiet used
cmd=${COMP_WORDS[2]}
ve=${COMP_WORDS[3]}
fi
local ids
case ${cmd} in
snapshot-umount)
# For umount, only give mounted IDs
ids="`@SBINDIR@/vzctl --quiet snapshot-list $ve -H -ouuid,device 2>/dev/null | awk 'NF==2 {print $1}' | tr -d '{}'`"
;;
snapshot-*)
# For other commands, give all IDs
ids="`@SBINDIR@/vzctl --quiet snapshot-list $ve -H -ouuid 2>/dev/null | tr -d '{}'`"
;;
*)
# Do not give anything for other cmds
# including 'snapshot' itself
# since it requires a new unused ID
return 0
;;
esac
COMPREPLY=( $( compgen -W "$ids" -- $cur ) )
;;
*)
if [[ "${prev::2}" != "--" || "$prev" = "--save" ]]; then
# List options
local cmd=${COMP_WORDS[1]}
if [ ${cmd::2} = "--" ] ; then
# --verbose or --quiet used
cmd=${COMP_WORDS[2]}
fi
case "$cmd" in
create)
COMPREPLY=( $( compgen -W "$vzctl_create_opts" -- $cur ) )
;;
set)
COMPREPLY=( $( compgen -W "$vzctl_set_opts" -- $cur ) )
;;
convert)
COMPREPLY=( $( compgen -W "$vzctl_convert_opts" -- $cur ) )
;;
suspend|resume|chkpnt|restore)
COMPREPLY=( $( compgen -W "--dumpfile" -- $cur ) )
;;
start)
COMPREPLY=( $( compgen -W "$vzctl_start_opts" -- $cur ) )
;;
stop)
COMPREPLY=( $( compgen -W "$vzctl_stop_opts" -- $cur ) )
;;
restart)
COMPREPLY=( $( compgen -W "$vzctl_restart_opts" -- $cur ) )
;;
snapshot)
COMPREPLY=( $( compgen -W "$vzctl_snapshot_create_opts" -- $cur ) )
;;
snapshot-switch)
COMPREPLY=( $( compgen -W "$vzctl_snapshot_switch_opts" -- $cur ) )
;;
snapshot-delete|snapshot-umount)
COMPREPLY=( $( compgen -W "--id" -- $cur ) )
;;
snapshot-mount)
COMPREPLY=( $( compgen -W "$vzctl_snapshot_mount_opts" -- $cur ) )
;;
snapshot-list)
COMPREPLY=( $( compgen -W "$vzctl_snapshot_list_opts" -- $cur ) )
;;
*)
;;
esac
else
# Option that requires an argument
# which we can't autocomplete
COMPREPLY=( $( compgen -W "" -- $cur ) )
fi
;;
esac
fi
esac
return 0
}
complete -F _vzctl vzctl
# EOF