Esempio n. 1
0
def main():
    # Check Python version.
    version = '%d.%d' % (sys.version_info.major, sys.version_info.minor)
    if version != '2.7':
        print(
            'brkt-cli requires Python 2.7.  Version',
            version,
            'is not supported.',
            file=sys.stderr
        )
        return 1

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-v',
        '--verbose',
        dest='verbose',
        action='store_true',
        help='Print status information to the console'
    )
    parser.add_argument(
        '--version',
        action='version',
        version='brkt-cli version %s' % VERSION
    )

    subparsers = parser.add_subparsers()

    encrypt_ami_parser = subparsers.add_parser('encrypt-ami')
    encrypt_ami_args.setup_encrypt_ami_args(encrypt_ami_parser)

    update_encrypted_ami_parser = \
        subparsers.add_parser('update-encrypted-ami')
    update_encrypted_ami_args.setup_update_encrypted_ami(
        update_encrypted_ami_parser)

    argv = sys.argv[1:]
    values = parser.parse_args(argv)
    # Initialize logging.  Log messages are written to stderr and are
    # prefixed with a compact timestamp, so that the user knows how long
    # each operation took.
    if values.verbose:
        log_level = logging.DEBUG
    else:
        # Boto logs auth errors and 401s at ERROR level by default.
        boto.log.setLevel(logging.FATAL)
        log_level = logging.INFO
    # Set the log level of our modules explicitly.  We can't set the
    # default log level to INFO because we would see INFO messages from
    # boto and other 3rd party libraries in the command output.
    logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%H:%M:%S')
    global log
    log = logging.getLogger(__name__)
    log.setLevel(log_level)
    aws_service.log.setLevel(log_level)
    encryptor_service.log.setLevel(log_level)
    if argv[0] == 'encrypt-ami':
        return command_encrypt_ami(values, log)

    if argv[0] == 'update-encrypted-ami':
        return command_update_encrypted_ami(values, log)
Esempio n. 2
0
def main():
    # Check Python version.
    version = '%d.%d' % (sys.version_info.major, sys.version_info.minor)
    if version != '2.7':
        print(
            'brkt-cli requires Python 2.7.  Version',
            version,
            'is not supported.',
            file=sys.stderr
        )
        return 1

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-v',
        '--verbose',
        dest='verbose',
        action='store_true',
        help='Print status information to the console'
    )
    parser.add_argument(
        '--version',
        action='version',
        version='brkt-cli version %s' % VERSION
    )

    subparsers = parser.add_subparsers(dest='subparser_name')

    encrypt_ami_parser = subparsers.add_parser('encrypt-ami')
    encrypt_ami_args.setup_encrypt_ami_args(encrypt_ami_parser)

    update_encrypted_ami_parser = \
        subparsers.add_parser('update-encrypted-ami')
    update_encrypted_ami_args.setup_update_encrypted_ami(
        update_encrypted_ami_parser)

    argv = sys.argv[1:]
    values = parser.parse_args(argv)
    # Initialize logging.  Log messages are written to stderr and are
    # prefixed with a compact timestamp, so that the user knows how long
    # each operation took.
    if values.verbose:
        log_level = logging.DEBUG
    else:
        # Boto logs auth errors and 401s at ERROR level by default.
        boto.log.setLevel(logging.FATAL)
        log_level = logging.INFO
    # Set the log level of our modules explicitly.  We can't set the
    # default log level to INFO because we would see INFO messages from
    # boto and other 3rd party libraries in the command output.
    logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%H:%M:%S')
    global log
    log = logging.getLogger(__name__)
    log.setLevel(log_level)
    aws_service.log.setLevel(log_level)
    encryptor_service.log.setLevel(log_level)

    if values.validate_ami:
        print(
            'The --validate-ami option has been replaced with --no-validate. '
            'It will be removed in a future release.', file=sys.stderr
        )
        values.validate = True

    if values.no_validate_ami:
        print(
            'The --validate-ami option has been replaced with --no-validate. '
            'It will be removed in a future release.', file=sys.stderr
        )
        values.validate = False

    try:
        if values.subparser_name == 'encrypt-ami':
            return command_encrypt_ami(values, log)
        if values.subparser_name == 'update-encrypted-ami':
            return command_update_encrypted_ami(values, log)
    except ValidationError as e:
        print(e, file=sys.stderr)
    except NoAuthHandlerFound:
        msg = (
            'Unable to connect to AWS.  Are your AWS_ACCESS_KEY_ID and '
            'AWS_SECRET_ACCESS_KEY environment variables set?'
        )
        if values.verbose:
            log.exception(msg)
        else:
            log.error(msg)
    except EC2ResponseError as e:
        if e.error_code == 'AuthFailure':
            msg = 'Check your AWS login credentials and permissions'
            if values.verbose:
                log.exception(msg)
            else:
                log.error(msg + ': ' + e.error_message)
        elif e.error_code in (
                'InvalidKeyPair.NotFound',
                'InvalidSubnetID.NotFound',
                'InvalidGroup.NotFound'):
            if values.verbose:
                log.exception(e.error_message)
            else:
                log.error(e.error_message)
        elif e.error_code == 'UnauthorizedOperation':
            if values.verbose:
                log.exception(e.error_message)
            else:
                log.error(e.error_message)
            log.error(
                'Unauthorized operation.  Check the IAM policy for your '
                'AWS account.'
            )
        else:
            raise
    except util.BracketError as e:
        if values.verbose:
            log.exception(e.message)
        else:
            log.error(e.message)
    except KeyboardInterrupt:
        if values.verbose:
            log.exception('Interrupted by user')
        else:
            log.error('Interrupted by user')
    return 1