awscli_keyring/commands.py (82 lines of code) (raw):
import sys
import os
from botocore.compat import OrderedDict
from awscli.customizations.commands import BasicCommand
try:
from awscli.customizations.configure.writer import ConfigFileWriter
except ImportError:
from awscli.customizations.configure import ConfigFileWriter
from . import persistence
def build_command_table(command_table, session, **kwargs):
command_table["keyring"] = KeyringCommand(session)
"""Add credentials for a profile to keyring"""
class AddCommand(BasicCommand):
NAME = "add"
DESCRIPTION = "Add credentials for the current profile to keyring"
SYNOPSIS = "add <key> [secret]"
ARG_TABLE = [
{"name": "key", "positional_arg": True, "nargs": "?", "action": "store", "help_text": "AWS_ACCESS_KEY_ID; if omitted you will be asked to enter the secret using a password prompt."},
{"name": "secret", "positional_arg": True, "nargs": "?", "action": "store", "help_text": "AWS_SECRET_ACCESS_KEY; if omitted you will be asked to enter the secret using a password prompt."},
]
def _run_main(self, parsed_args, parsed_globals):
current_key = None
current_secret = None
masked_current_secret = None
if self._session._credentials:
current_key = self._session._credentials.access_key
current_secret = self._session._credentials.secret_key
if current_secret is not None:
masked_current_secret = "*" * (len(current_secret) - 4) + current_secret[-4:]
key = parsed_args.key
if key is None:
import getpass
key = getpass.getpass("AWS Access Key ID [%s]: " % current_key)
if key is None or key == "":
key = current_key
secret = parsed_args.secret
if secret is None:
import getpass
secret = getpass.getpass("AWS Secret Access Key [%s]: " % masked_current_secret)
if secret is None or secret == "":
secret = current_secret
profile = self._session.profile
if profile is None:
profile = "default"
config_section = "default"
else:
config_section = "profile {0}".format(profile)
persistence.set_credentials(profile, key, secret)
config_update = {"__section__": config_section, "keyring": "true"}
config_filename = os.path.expanduser(self._session.get_config_variable("config_file"))
config_writer = ConfigFileWriter()
config_writer.update_config(config_update, config_filename)
return 0
class ShowCommand(BasicCommand):
NAME = "show"
DESCRIPTION = "Show credentials for current profile like environment variables\n\nUseful for sourcing in a shell or using as a wrapper for command line programs which expect credentials in environment variables."
ARG_TABLE = [
{"name": "export", "action": "store_true", "help_text": "Prefix variables with \"export \""},
]
EXAMPLES = "Command::\n\n aws keyring show\n\nOutput::\n\n AWS_ACCESS_KEY_ID=\"ABC...\"\n AWS_SECRET_ACCESS_KEY=\"123...\""
def _run_main(self, parsed_args, global_args):
export = ""
if parsed_args.export:
export = "export "
if self._session._credentials:
print('{export}AWS_ACCESS_KEY_ID="{value}"'.format(export=export, value=self._session._credentials.access_key))
print('{export}AWS_SECRET_ACCESS_KEY="{value}"'.format(export=export, value=self._session._credentials.secret_key))
if getattr(self._session._credentials, "token", None) is not None:
print('{export}AWS_SESSION_TOKEN="{value}"'.format(export=export, value=self._session._credentials.token))
return 0
else:
sys.stderr.write('There are no credentials to show.\n')
return 1
"""Keyring commands"""
class KeyringCommand(BasicCommand):
NAME = "keyring"
DESCRIPTION = "keyring management"
SUBCOMMANDS = [
{"name": "add", "command_class": AddCommand},
{"name": "show", "command_class": ShowCommand},
]
def _run_main(self, parsed_args, parsed_globals):
self._display_help(parsed_args, parsed_globals)
return 1