import argparse from dateutil.parser import parse as parse_date from app import app from data import model from data.database import ServiceKeyApprovalType from data.model.log import log_action def generate_key(service, name, expiration_date=None, notes=None): metadata = { 'created_by': 'CLI tool', } # Generate a key with a private key that we *never save*. (private_key, key) = model.service_keys.generate_service_key(service, expiration_date, metadata=metadata, name=name) # Auto-approve the service key. model.service_keys.approve_service_key(key.kid, ServiceKeyApprovalType.AUTOMATIC, notes=notes or '') # Log the creation and auto-approval of the service key. key_log_metadata = { 'kid': key.kid, 'preshared': True, 'service': service, 'name': name, 'expiration_date': expiration_date, 'auto_approved': True, } log_action('service_key_create', None, metadata=key_log_metadata) log_action('service_key_approve', None, metadata=key_log_metadata) return private_key, key.kid def valid_date(s): try: return parse_date(s) except ValueError: msg = "Not a valid date: '{0}'.".format(s) raise argparse.ArgumentTypeError(msg) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Generates a preshared key') parser.add_argument('service', help='The service name for which the key is being generated') parser.add_argument('name', help='The friendly name for the key') parser.add_argument('--expiration', default=None, type=valid_date, help='The optional expiration date for the key') parser.add_argument('--notes', help='Optional notes about the key', default=None) args = parser.parse_args() generated, _ = generate_key(args.service, args.name, args.expiration, args.notes) print generated.exportKey('PEM')