home/.zsh/plugins/zsh-completions/src/_mssh

109 lines
3.8 KiB
Plaintext

#compdef mssh
# ------------------------------------------------------------------------------
# Copyright (c) 2020 Hyeon Kim
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
# ------------------------------------------------------------------------------
# Description
# -----------
# mssh is a Python client for accessing EC2 instances via AWS EC2 Instance
# Connect.
#
# References:
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html#ec2-instance-connect-connecting-ec2-cli
# https://github.com/aws/aws-ec2-instance-connect-cli
# https://pypi.org/project/ec2instanceconnectcli/
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Hyeon Kim (https://hyeon.me/)
#
# ------------------------------------------------------------------------------
# Do nothing if there's no AWS CLI
if (( ! $+commands[aws] )); then
return
fi
# Define function only when it doesn't exist
(( $+functions[_mssh_cache_policy] )) || _mssh_cache_policy() {
# Cache invalidates after 30 seconds
#
# Reference:
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#index-globbing_002c-qualifiers
local -a oldp
oldp=( "$1"(ms+30) )
(( $#oldp ))
}
# Unless user explicitly turned off caching, enable caching just for this context
local existing_setting
zstyle -s ":completion:${curcontext}:" use-cache existing_setting
if [[ -z "${existing_setting}" ]]; then
zstyle ":completion:${curcontext}:" use-cache on
fi
# Update cache policy only when there was no existing policy
local existing_policy
zstyle -s ":completion:${curcontext}:" cache-policy existing_policy
if [[ -z "${existing_policy}" ]]; then
zstyle ":completion:${curcontext}:" cache-policy _mssh_cache_policy
fi
local -a instances
if _cache_invalid mssh_instances || ! _retrieve_cache mssh_instances; then
# Cache is invalid or caching retrieval failed (usually due to disabled cache)
# Store the output of the AWS CLI separately
#
# Reference:
# https://unix.stackexchange.com/a/430182
local stderr
local -i exit_code
() {
aws ec2 describe-instances \
--query 'Reservations[].Instances[] | [?State.Name == `running`].join(`:`, [InstanceId, Tags[?Key == `Name`].Value | [0]])' \
--output text \
>${1} 2>${2}
exit_code=${?}
IFS=$'\n\t' instances=($(<${1}))
stderr=$(<${2})
} =(:) =(:)
if (( $exit_code == 0 )); then
# AWS CLI successfully executed
_store_cache mssh_instances instances
else
# AWS CLI failed, abort autocompletion
_message -r "\
Failed autocomplete due to following reason:
${stderr}"
return
fi
fi
_describe 'command' instances
# Reference:
# http://zsh.sourceforge.net/Doc/Release/Completion-System.html
# https://github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org