Difference between revisions of "util-vserver:Bash Completion"

From Linux-VServer

Jump to: navigation, search
 
m (Vserver Completion moved to util-vserver:Bash Completion: wrong namespace!)

Revision as of 08:44, 1 December 2006

To test this, put the source in your .bashrc or put it in the file /etc/bash_completion.d/vserver (Debian).

This release (0.4) supports the commands vserver vapt-get vrpm vyum vserver-copy.

This script is included in the util-vserver Debian package, and is automatically installed into /etc/bash_completion.d/vserver when you install this package.

For zsh completion, the Debian zsh package has the vserver completion included, see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=365238 for the source, or https://intrigeri.boum.org/svn/pub/home/modules/base/.zsh/functions/_vserver for the upstream SVN repository.


# Completion for the vserver command. Source this file (or on some systems
# add it to ~/.bash_completion and start a new shell) and bash's completion
# mechanism will know all about vserver's options!
#
# Copyright (C) Thomas Champagne <lafeuil@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# The latest version of this software can be obtained here:
#
# http://linux-vserver.org/Vserver_Completion
#
# version 0.4.1

have vserver-info && {

: ${UTIL_VSERVER_VARS:=$(vserver-info - SYSINFO |grep prefix: | awk '{ print $2}')/lib/util-vserver/util-vserver-vars}
test -e "$UTIL_VSERVER_VARS" && {
       
if [ -z "$_VS_NEWLINE" -o -z "$VS_ALLVSERVERS_ARGS" ]
then
        . "$UTIL_VSERVER_VARS"
        . "$_LIB_FUNCTIONS"
fi

_vserver() {
   local cur cmds cmdOpts cmdMethodOpts helpCmds names names_pipe func i j method
   
   COMPREPLY=()
   cur=${COMP_WORDS[COMP_CWORD]}
   
   # find available v-servers: 
   # call function getAllVservers in vserver library
   getAllVservers names
   names_pipe=`echo ${names[@]} | sed 's/ /|/g'`
   
   # available commands
   cmds='start stop restart condrestart suexec exec enter chkconfig \
       running status unify pkg apt-get apt-config apt-cache \
       rpm pkgmgmt delete'
   
   # options (long and short name)
   cmdOpts='--help --version --debug --defaulttty -s --sync -v \
       --verbose --silent --'
   
   cmdMethodOpts='-m -n --context --confdir --lockfile \
       --hostname --netdev --netbcast --netmask \
       --netprefix --interface --cpuset \
       --cpusetcpus --cpusetmems --cpusetvirt \
       --initstyle --flags --help --'
   
   # if the previous option is a single option 
   helpCmds='--help|--version'
   if [[ ${COMP_WORDS[1]} == @($helpCmds) ]] 
   then
       return 0
   fi
   
   # search a verser's name
   for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ ))
   do
       if [[ ${COMP_WORDS[i]} == @($names_pipe) ]]
       then
         # it's found
           break
       fi
   done
   
       #a vserver has been found 
   if (( $i < ${#COMP_WORDS[@]}-1 )) 
   then 
       #Show the vserver command without build
       case "${COMP_WORDS[i+1]}" in
           start)
               COMPREPLY=( $( compgen -W "--rescue --rescue-cmd" -- $cur ) )
               ;;
           # No completion for apt-config
           stop|restart|condrestart|enter|running|status|apt-config|delete)
               ;;
           suexec)
               # I don't know how to do
               COMPREPLY=( $( compgen -W  -- $cur ) )
               ;;
           exec)
               #I don't know how to do
               COMPREPLY=( $( compgen -W "" -- $cur ) )
               ;;
           unify)
               COMPREPLY=( $( compgen -W "-R" -- $cur ) )
               ;;
           apt-get|apt-cache)
               func=${COMP_WORDS[i+1]}
               COMP_WORDS=( ${COMP_WORDS[@]:$((i+1))} )
               COMP_CWORD=$((COMP_CWORD-i-1))
               declare -f _${func//-/_} > /dev/null && _${func//-/_}
               ;;
           *)
               COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )   
               ;;
       esac
       return 0
   else
       #no vserver name found
       prev=${COMP_WORDS[COMP_CWORD-1]}
       
       #search the new name of vserver 
       for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
           if [[ ${COMP_WORDS[i]} == !(vserver|-*) ]];  then
               # it's found
               break
           fi
       done
               
       if (( $i < ${#COMP_WORDS[@]}-1 )) ; then 
           j=$i
           i=${#COMP_WORDS[@]}
           for (( ; j < ${#COMP_WORDS[@]}-1; j++ )); do
               if [[ ${COMP_WORDS[j]} == "--" ]];  then
                   # method's parameter
                   case "$method" in
                       legacy|copy)
                           ;;
                       apt-rpm)
                           COMPREPLY=( $( compgen -W "-d" -- $cur ) )
                           ;;
                       yum)
                           COMPREPLY=( $( compgen -W "-d" -- $cur ) )
                           ;;
                       rpm) 
                           COMPREPLY=( $( compgen -W "-d --empty --force --nodeps" -- $cur ) )
                           ;;
                       skeleton)
                           ;;
                       debootstrap)
                           COMPREPLY=( $( compgen -W "-d -m -s --" -- $cur ) )
                           ;;
                       *)
                           #do nothing 
                           #the method is not defined
                           ;;
                   esac
                   return 0
                   break
               fi
               if [[ ${COMP_WORDS[j]} == @(build|-m) ]];  then
                   i=$j
                   if (( $j+1 < ${#COMP_WORDS[@]}-1 )) ; then
                       method=${COMP_WORDS[j+1]}
                   fi
               fi
           done 
           
           if (( $i < ${#COMP_WORDS[@]}-1 )) ; then
               case $prev in
                   --help)
                       #do nothing
                       ;;
                   -n|--context|--confdir|--lockfile|--hostname|--netdev|--netbcast|--netmask|--netprefix|--interface|--cpuset|--cpusetcpus|--cpusetmems|--cpusetvirt|--initstyle|--flags)
                       COMPREPLY=( $( compgen -W "" -- $cur ) )
                       ;;
                   -m)
                       COMPREPLY=( $( compgen -W "legacy copy apt-rpm yum rpm skeleton debootstrap" -- $cur ) )
                       ;;
                   *)
                       COMPREPLY=( $( compgen -W "$cmdMethodOpts" -- $cur ) )
                       ;;
               esac
               
           else
               COMPREPLY=( $( compgen -W "build" -- $cur ) )
           fi
       else
           COMPREPLY=( $( compgen -W "${names[@]} $cmdOpts" -- $cur ) )
       fi
       return 0
   fi
   
   return 0
}
complete -F _vserver vserver
 
_vapt_rpm_yum()
{
   local cur cmds cmdOpts helpCmds names func i

   COMPREPLY=()
   cur=${COMP_WORDS[COMP_CWORD]}
   
   # options (long and short name)
   cmdOpts='--help --version --quiet -q --all'
   
   # if the previous option is a single option 
   helpCmds='--help|--version'
   if [[ "${COMP_WORDS[1]}" == "@($helpCmds)" ]] ; then
       return 0
   fi
   
   # search --
   for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
       if [[ ${COMP_WORDS[i]} = "--" ]];  then
           # it's found
           break
       fi
   done
   
   # find available v-servers: 
   # call function getAllVservers in vserver library
   getAllVservers names
   names_pipe=`echo ${names[@]}" --all" | sed 's/ /|/g'`
   
   if (( $i < ${#COMP_WORDS[@]}-1 )) && (( $i < $COMP_CWORD )) ; then 
       func=${COMP_WORDS[0]:1}
       COMP_WORDS=( $func ${COMP_WORDS[@]:$((i+1))} )
       COMP_CWORD=$((COMP_CWORD-i))
       declare -f _${func//-/_} > /dev/null && _${func//-/_}
   else        
       # search a verser's name
       for (( i=0; i <  ${#COMP_WORDS[@]}-1; i++ )); do
           if [[ ${COMP_WORDS[i]} == @($names_pipe) ]];  then
               # it's found
               break
           fi
       done

       if (( $i < ${#COMP_WORDS[@]}-1 )) ; then 
           if [[ "${COMP_WORDS[i]}" = "--all"  ]]; then
               cmdOpts='--'
               COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )
           else
               cmdOpts='--'
               COMPREPLY=( $( compgen -W "${names[@]} $cmdOpts" -- $cur ) )
           fi
       else
           COMPREPLY=( $( compgen -W "${names[@]} $cmdOpts" -- $cur ) )
       fi
   fi
   return 0
}
complete -F _vapt_rpm_yum vapt-get
complete -F _vapt_rpm_yum vrpm
complete -F _vapt_rpm_yum vyum

_vserver_copy()
{
   local cur prev cmdOpts helpCmds confCmds names names_pipe i
   
   COMPREPLY=()
   cur=${COMP_WORDS[COMP_CWORD]}
   
   # find available v-servers: 
   # call function getAllVservers in vserver library
   getAllVservers names
   names_pipe=`echo ${names[@]} | sed 's/ /|/g'`
   
   # options (long and short name)
   cmdOpts='--help -h --version -V --verbose -v --quiet -q \
                  --vsroot -r --rsh -R --stopstart -s \
                  --domain -d --ip -i'
   
   # if the previous option is a single option 
   helpCmds='--help|-h|--version|-V'
   if [[ ${COMP_WORDS[1]} == @($helpCmds) ]] ; then
       return 0
   fi
   
   confCmds='--ip|-i|--domain|-d'
   prev=${COMP_WORDS[COMP_CWORD-1]}
   if  $prev == @($confCmds) ; then
       return 0
   fi
   
   # search a verser's name
   for (( i=0; i <  ${#COMP_WORDS[@]}-1; i++ )); do
       if [[ ${COMP_WORDS[i]} == @($names_pipe) ]];  then
           # it's found
           break
       fi
   done
   
   if (( $i < ${#COMP_WORDS[@]}-1 )) ; then 
       return 0
   else
       COMPREPLY=( $( compgen -W "${names[@]} $cmdOpts" -- $cur ) )
   fi
   return 0
}
complete -F _vserver_copy vserver-copy

}
}


Changelog 
0.4.1 : handle multiple sourcing scenarios
0.4.0 : Update command vserver build
0.3.2 : Add Licence
0.3.1 : Add the command vapt-get vrpm vyum vserver-copy
0.2.0 : First release with just the command vserver
Personal tools