194 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| #compdef knife
 | |
| # ------------------------------------------------------------------------------
 | |
| # Description
 | |
| # -----------
 | |
| #
 | |
| #  Completion script for Chef's knife (http://www.opscode.com/chef).
 | |
| #
 | |
| #  Source: https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/knife
 | |
| #
 | |
| # ------------------------------------------------------------------------------
 | |
| # Authors
 | |
| # -------
 | |
| #
 | |
| #  * Frank Louwers (https://github.com/franklouwers)
 | |
| #
 | |
| # ------------------------------------------------------------------------------
 | |
| # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
 | |
| # vim: ft=zsh sw=2 ts=2 et
 | |
| # ------------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| # These flags should be available everywhere according to man knife
 | |
| knife_general_flags=( --help --server-url --key --config --editor --format --log_level --logfile --no-editor --user --print-after --version --yes )
 | |
| 
 | |
| # knife has a very special syntax, some example calls are:
 | |
| # knife status
 | |
| # knife cookbook list
 | |
| # knife role show ROLENAME
 | |
| # knife data bag show DATABAGNAME
 | |
| # knife role show ROLENAME --attribute ATTRIBUTENAME
 | |
| # knife cookbook show COOKBOOKNAME COOKBOOKVERSION recipes
 | |
| 
 | |
| # The -Q switch in compadd allow for completions of things like "data bag" without having to go through two rounds of completion and avoids zsh inserting a \ for escaping spaces
 | |
| _knife() {
 | |
|   local curcontext="$curcontext" state line
 | |
|   typeset -A opt_args
 | |
|   cloudproviders=(bluebox ec2 rackspace slicehost terremark)
 | |
|   _arguments \
 | |
|     '1: :->knifecmd'\
 | |
|     '2: :->knifesubcmd'\
 | |
|     '3: :->knifesubcmd2' \
 | |
|     '4: :->knifesubcmd3' \
 | |
|     '5: :->knifesubcmd4' \
 | |
|     '6: :->knifesubcmd5'
 | |
|   
 | |
|   case $state in
 | |
|   knifecmd)
 | |
|     compadd -Q "$@" bootstrap client configure cookbook "cookbook site" "data bag" exec index node recipe role search ssh status windows $cloudproviders
 | |
|   ;;
 | |
|   knifesubcmd)
 | |
|     case $words[2] in
 | |
|     (bluebox|ec2|rackspace|slicehost|terremark)
 | |
|       compadd "$@" server images
 | |
|     ;;
 | |
|     client)
 | |
|       compadd -Q "$@" "bulk delete" list create show delete edit reregister
 | |
|     ;;
 | |
|     configure)
 | |
|       compadd "$@" client
 | |
|     ;;
 | |
|     cookbook)
 | |
|       compadd -Q "$@" test list create download delete "metadata from" show "bulk delete" metadata upload
 | |
|     ;;
 | |
|     node)
 | |
|      compadd -Q "$@" "from file" create show edit delete list run_list "bulk delete"
 | |
|     ;;
 | |
|     recipe)
 | |
|      compadd "$@" list
 | |
|     ;;
 | |
|     role)
 | |
|       compadd -Q "$@" "bulk delete" create delete edit "from file" list show
 | |
|     ;; 
 | |
|     windows)
 | |
|       compadd "$@" bootstrap
 | |
|     ;;
 | |
|     *)
 | |
|     _arguments '2:Subsubcommands:($(_knife_options1))'
 | |
|     esac
 | |
|    ;;
 | |
|    knifesubcmd2)
 | |
|     case $words[3] in
 | |
|      server)
 | |
|       compadd "$@" list create delete
 | |
|     ;;
 | |
|      images)
 | |
|       compadd "$@" list
 | |
|     ;;
 | |
|      site)
 | |
|       compadd "$@" vendor show share search download list unshare
 | |
|     ;;
 | |
|      (show|delete|edit)
 | |
|      _arguments '3:Subsubcommands:($(_chef_$words[2]s_remote))'
 | |
|     ;;
 | |
|     (upload|test)
 | |
|      _arguments '3:Subsubcommands:($(_chef_$words[2]s_local) --all)'
 | |
|     ;;
 | |
|     list)
 | |
|      compadd -a "$@" knife_general_flags
 | |
|     ;;
 | |
|     bag)
 | |
|       compadd -Q "$@" show edit list "from file" create delete
 | |
|     ;;
 | |
|     *)
 | |
|       _arguments '3:Subsubcommands:($(_knife_options2))'
 | |
|     esac
 | |
|    ;;
 | |
|    knifesubcmd3)
 | |
|      case $words[3] in
 | |
|       show)
 | |
|        case $words[2] in
 | |
|        cookbook)
 | |
|           versioncomp=1
 | |
|           _arguments '4:Cookbookversions:($(_cookbook_versions) latest)'
 | |
|        ;;
 | |
|        (node|client|role)
 | |
|          compadd "$@" --attribute
 | |
|        esac
 | |
|      esac
 | |
|      case $words[4] in
 | |
|      (show|edit)
 | |
|      _arguments '4:Subsubsubcommands:($(_chef_$words[2]_$words[3]s_remote))'
 | |
|     ;;
 | |
|      file)
 | |
|      _arguments '*:file or directory:_files -g "*.(rb|json)"'
 | |
|     ;;
 | |
|       list)
 | |
|      compadd -a "$@" knife_general_flags
 | |
|     ;;
 | |
|         *)
 | |
|        _arguments '*:Subsubcommands:($(_knife_options3))'
 | |
|     esac
 | |
|     ;;
 | |
|     knifesubcmd4)
 | |
|       if (( versioncomp > 0 )); then
 | |
|         compadd "$@" attributes definitions files libraries providers recipes resources templates
 | |
|       else
 | |
|        _arguments '*:Subsubcommands:($(_knife_options2))'
 | |
|       fi
 | |
|     ;; 
 | |
|     knifesubcmd5) 
 | |
|       _arguments '*:Subsubcommands:($(_knife_options3))'
 | |
|    esac
 | |
| }
 | |
| 
 | |
| # Helper functions to provide the argument completion for several depths of commands
 | |
| _knife_options1() {
 | |
|  ( for line in $( knife $words[2] --help | grep -v "^knife" ); do echo $line | grep "\-\-"; done )
 | |
| }
 | |
| 
 | |
| _knife_options2() {
 | |
|  ( for line in $( knife $words[2] $words[3] --help | grep -v "^knife" ); do echo $line | grep "\-\-"; done )
 | |
| }
 | |
| 
 | |
| _knife_options3() {
 | |
|  ( for line in $( knife $words[2] $words[3] $words[4] --help | grep -v "^knife" ); do echo $line | grep "\-\-"; done )
 | |
| }
 | |
| 
 | |
| # The chef_x_remote functions use knife to get a list of objects of type x on the server
 | |
| _chef_roles_remote() {
 | |
|  (knife role list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| _chef_clients_remote() {
 | |
|  (knife client list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| _chef_nodes_remote() {
 | |
|  (knife node list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| _chef_cookbooks_remote() {
 | |
|  (knife cookbook list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| _chef_sitecookbooks_remote() {
 | |
|  (knife cookbook site list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| _chef_data_bags_remote() {
 | |
|  (knife data bag list | grep \" | awk '{print $1}' | awk -F"," '{print $1}' | awk -F"\"" '{print $2}')
 | |
| }
 | |
| 
 | |
| # The chef_x_local functions use the knife config to find the paths of relevant objects x to be uploaded to the server
 | |
| _chef_cookbooks_local() {
 | |
|  (for i in $( grep cookbook_path $HOME/.chef/knife.rb | awk 'BEGIN {FS = "[" }; {print $2}' | sed 's/\,//g' | sed "s/'//g" | sed 's/\(.*\)]/\1/' ); do ls $i; done)
 | |
| }
 | |
| 
 | |
| # This function extracts the available cookbook versions on the chef server
 | |
| _cookbook_versions() {
 | |
|   (knife cookbook show $words[4] | grep -v $words[4] | grep -v -E '\]|\[|\{|\}' | sed 's/ //g' | sed 's/"//g')
 | |
| }
 | |
| 
 | |
| _knife "$@"
 |