diff options
Diffstat (limited to 'plugins/knife')
| -rw-r--r-- | plugins/knife/_knife | 174 | 
1 files changed, 174 insertions, 0 deletions
| diff --git a/plugins/knife/_knife b/plugins/knife/_knife new file mode 100644 index 000000000..7f8c95ee5 --- /dev/null +++ b/plugins/knife/_knife @@ -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 "$@" | 
