commit
202405e2b5
1 changed files with 174 additions and 0 deletions
@ -0,0 +1,174 @@ |
|||||||
|
#compdef knife |
||||||
|
|
||||||
|
# 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 "$@" |
||||||
Loading…
Reference in new issue