Skip to content

Instantly share code, notes, and snippets.

@nmilford
Created September 7, 2016 03:04
Show Gist options
  • Save nmilford/5de60ee0beb09d9703ad675f2eaa04dd to your computer and use it in GitHub Desktop.
Save nmilford/5de60ee0beb09d9703ad675f2eaa04dd to your computer and use it in GitHub Desktop.
knife bash completion with knife ec2 plugin completion (extended from https://github.com/stevendanna/knife-hacks)
#!/bin/bash
#
# Bash completion for Knife 0.10+
#
if [ $(uname) = "Darwin" ]; then
SED="gsed"
else
SED="sed"
fi
_escape() {
echo "$1" | $SED -r s'/([^a-zA-Z0-9])/\\\1/g'
}
_flatten_command() {
local cur
_get_comp_words_by_ref cur
echo ${COMP_WORDS[*]} | $SED -r -e 's/[[:space:]]-[[:alnum:]-]+//g' \
-e "s/[[:space:]]*$(_escape $cur)\$//" -e 's/[[:space:]]+/_/g'
}
# Helper functions to get lists of
# Unfortunately knife pollutes STDOUT
# on errors, making this more complicated then it needs to be.
_output_on_success() {
local out
out=$($* 2>/dev/null)
[ $? -eq 0 ] && echo $out
}
_chef_nodes() {
_output_on_success knife node list
}
_chef_local_cookbooks() {
test -d cookbooks && find cookbooks -maxdepth 1 -type d -print0 | xargs -0 -n1 basename
}
_chef_remote_cookbooks() {
_output_on_success knife cookbook list | awk '{print $1}'
}
_chef_clients() {
_output_on_success knife client list
}
_chef_roles() {
_output_on_success knife role list
}
_chef_environments() {
_output_on_success knife environment list
}
_chef_data_bags() {
_output_on_success knife data bag list
}
_chef_data_bag_items() {
local bag
bag=$1
_output_on_success knife data bag show $bag
}
_chef_tags() {
local node
node=$1
_output_on_success knife tag list $node
}
_knife() {
local cur prev opts candidates
_get_comp_words_by_ref cur prev
opts="--server-url --key --color --config --defaults --editor \
--environment --format --no-color --no-editor --user --print-after \
--verbose --version --yes --help"
if [[ $cur == -* ]]; then
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
case $(_flatten_command) in
knife)
candidates="bootstrap client configure cookbook data_bag ec2 environment exec help index_rebuild node recipe role search ssh status tag"
;;
knife_client)
candidates="create edit list reregister show delete bulk_delete"
;;
knife_configure)
candidates="client"
;;
knife_cookbook)
candidates="upload download metadata delete show create metadata bulk_delete test site"
;;
knife_cookbook_site)
candidates="show install search share list unshare download"
;;
knife_ec2)
candidates="amis flavor server"
;;
knife_ec2_amis)
candidates="ubuntu"
;;
knife_ec2_flavor)
candidates="list"
;;
knife_ec2_server)
candidates="create delete list"
;;
knife_environment)
candidates="from_file delete show edit list create"
;;
knife_data_bag)
candidates="delete create edit show list from_file"
;;
knife_role)
candidates="edit show delete create from_file list bulk_delete"
;;
knife_tag)
candidates="list delete create"
;;
knife_node)
candidates="create run_list list from_file edit show delete bulk_delete"
;;
knife_node_show|knife_node_edit|knife_node_delete)
candidates=$(_chef_nodes)
;;
knife_node_run_list)
candidates="add remove"
;;
knife_node_run_list_add|knife_node_run_list_remove)
candidates=$(_chef_nodes)
;;
knife_client_show|knife_client_edit|knife_client_delete)
candidates=$(_chef_clients)
;;
knife_cookbook_upload|knife_cookbook_test|knife_cookbook_metdata)
candidates=$(_chef_local_cookbooks)
;;
knife_cookbook_download|knife_cookbook_delete|knife_cookbook_show)
candidates=$(_chef_remote_cookbooks)
;;
knife_environment_delete|knife_environment_show|knife_environment_edit)
candidates=$(_chef_environments)
;;
knife_data_bag_show|knife_data_bag_create|knife_data_bag_delete)
candidates=$(_chef_data_bags)
;;
knife_data_bag_show_*|knife_data_bag_create_*|knife_data_bag_delete_*)
candidates=$(_chef_data_bag_items $prev)
;;
knife_role_show|knife_role_edit|knife_role_delete)
candidates=$(_chef_roles)
;;
knife_tag_create|knife_tag_list|knife_tag_delete)
candidates=$(_chef_nodes)
;;
knife_tag_delete_*)
candidates=$(_chef_tags $prev)
;;
*)
_filedir
return 0;
;;
esac
COMPREPLY=($(compgen -W "${candidates}" -- ${cur}))
return 0
}
complete -F _knife knife
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment