#!/usr/bin/env python import argparse from barbicanclient import client class Keep: def __init__(self): self.parser = self.get_main_parser() self.subparsers = self.parser.add_subparsers(title='subcommands', description= 'Action to perform') self.add_create_args() self.add_delete_args() self.add_get_args() self.add_list_args() def get_main_parser(self): parser = argparse.ArgumentParser(description='Access the Barbican' ' key management sevice.') parser.add_argument('type', choices=["order", "secret"], help="type to operate on") parser.add_argument('--auth_endpoint', '-A', help='the URL to authenticate against') parser.add_argument('--user', '-U', help='the user to authenticate as') parser.add_argument('--password', '-P', help='the API key or password to ' 'authenticate with') parser.add_argument('--tenant', '-T', help='the tenant ID') parser.add_argument('--endpoint', '-E', help='the URL of the barbican server') parser.add_argument('--token', '-K', help='the authentication token') return parser def add_create_args(self): create_parser = self.subparsers.add_parser('create', help='Create a ' 'secret or an order') create_parser.add_argument('--mime_type', '-m', default='text/plain', help='the MIME type of the raw secret (defa' 'ult: %(default)s)') create_parser.add_argument('--name', '-n', help='a human-friendly name' ' used only for reference') create_parser.add_argument('--algorithm', '-a', help='the algorithm us' 'ed only for reference') create_parser.add_argument('--bit_length', '-b', default=256, help='the bit length of the secret used ' 'only for reference (default: %(default)s)', type=int) create_parser.add_argument('--cypher_type', '-c', help='the cypher typ' 'e used only for reference') create_parser.add_argument('--plain_text', '-p', help='the unencrypted' ' secret (only used for secrets)') create_parser.add_argument('--expiration', '-e', help='expiration time' ' for the secret in ISO 8601 format ' '(only used for secrets)') create_parser.set_defaults(func=self.create) def add_delete_args(self): delete_parser = self.subparsers.add_parser('delete', help='Delete a se' 'cret or an order either by' ' id or by href') delete_parser.add_argument('--href', '-r', help='the reference to the ' 'secret or order') delete_parser.add_argument('--id', '-i', help='the id of the secret or' 'order') delete_parser.set_defaults(func=self.delete) def add_get_args(self): get_parser = self.subparsers.add_parser('get', help='Retrieve a secret' ' or an order either by id or' ' by href. The raw secret of ' 'the type specified with --mi' 'me_type can be retrieved ins' 'tead for secrets using the -' '-raw flag.') get_parser.add_argument('--href', '-r', help='the reference to the ' 'secret or order') get_parser.add_argument('--id', '-i', help='the id of the secret or' ' order') get_parser.add_argument('--raw', '-w', help='if specified, gets the ra' 'w secret of type specified with --mime_type (' 'only used for secrets)', action='store_true') get_parser.add_argument('--mime_type', '-m', default='text/plain', help='the MIME type of the raw secret (defa' 'ult: %(default)s; only used for secrets)') get_parser.set_defaults(func=self.get) def add_list_args(self): list_parser = self.subparsers.add_parser('list', help='List secrets or orders') list_parser.add_argument('--href', '-r', help='the reference to what i' 's to be listed; put in quotes to avoid unint' 'entional backgrounding by way of \'&\'') list_parser.add_argument('--limit', '-l', default=10, help='specify t' 'he number of items to list per page (defaul' 't: %(default)s; maximum: 100)', type=int) list_parser.add_argument('--offset', '-o', default=0, help='specify t' 'he page offset (default: %(default)s)', type=int) list_parser.set_defaults(func=self.lst) def create(self, args): if args.type == 'secret': secret = self.conn.create_secret(args.mime_type, args.plain_text, args.name, args.algorithm, args.bit_length, args.cypher_type, args.expiration) print secret.secret_ref else: order = self.conn.create_order(args.mime_type, args.name, args.algorithm, args.bit_length, args.cypher_type) print order.order_ref def delete(self, args): if args.type == 'secret': if args.href: self.conn.delete_secret(args.href) elif args.id: self.conn.delete_secret_by_id(args.id) else: if args.href: self.conn.delete_order(args.href) elif args.id: self.conn.delete_order_by_id(args.id) def get(self, args): if args.type == 'secret': if args.href and args.raw: print self.conn.get_raw_secret(args.href, args.mime_type) elif args.href: print self.conn.get_secret(args.href) elif args.id and args.raw: print self.conn.get_raw_secret_by_id(args.id, args.mime_type) elif args.id: print self.conn.get_secret_by_id(args.id) else: if args.href: print self.conn.get_order(args.href) elif args.id: print self.conn.get_order_by_id(args.id) def lst(self, args): if args.type == 'secret': if args.href: l = self.conn.list_secrets_by_href(args.href) else: l = self.conn.list_secrets(args.limit, args.offset) else: if args.href: l = self.conn.list_orders_by_href(args.href) else: l = self.conn.list_orders(args.limit, args.offset) for i in l[0]: print i print 'previous reference: ', l[1] print 'next reference: ', l[2] def execute(self): args = self.parser.parse_args() self.conn = client.Connection(args.auth_endpoint, args.user, args.password, args.tenant, args.token, endpoint=args.endpoint) args.func(args) def main(): k = Keep() k.execute() if __name__ == '__main__': main()