Ejemplo n.º 1
0
 def get_loan_link(self, resource_id):
     loan_link = acs4.mint(self.host,
                           self.shared_secret,
                           resource_id,
                           'enterloan',
                           self.name,
                           port=self.port)
     return loan_link
Ejemplo n.º 2
0
 def get_loan_link(self, resource_id):
     loan_link = acs4.mint(self.host, self.shared_secret, resource_id, 'enterloan', self.name, port = self.port)
     return loan_link
Ejemplo n.º 3
0
def main(argv):
    class MyParser(optparse.OptionParser):
        """ allows non-word-wrapped help epilog """
        def format_epilog(self, formatter):
            return self.epilog

    parser = MyParser(
        usage='usage: %prog [options] SERVER ACTION',
        version='%prog 0.1',
        description=
        'Interact with ACS.  Action is one of "mint", "queryresourceitems", "upload" or "request".  See examples below.',
        epilog="""
Examples:

python acs4cmd.py server mint --distributor='uuid' --resource='uuid'
python acs4cmd.py server queryresourceitems
python acs4cmd.py server upload [filename] (or --datapath=/server/path/book.epub)
python acs4cmd.py server request api request_type

        api is: (id is:)
                DistributionRights      (distributor + resource)
                Distributor             (distributor)
                Fulfillment             (fulfillment)
                FulfillmentItem         (fulfillment)
                License                 (user + resource)
                ResourceItem            (resource + item)
                ResourceKey             (resource)
                UserPublic              (user)

        request_type is: 'get count create delete update'

        USE WITH CARE, this can break your acs4 install!

""")

    parser.add_option('-p', '--password', action='store', help='ACS4 password')
    parser.add_option('--permissions',
                      action='store',
                      help='xml file of ACS4 perms - for upload and request')
    parser.add_option('-d',
                      '--debug',
                      action='store_true',
                      help='Print debugging output')
    parser.add_option('--dry_run',
                      action='store_true',
                      help='Don\'t post to server')
    parser.add_option('--port',
                      action='store',
                      default=acs4.defaultport,
                      help='Server port to use (default 8080)')

    group = optparse.OptionGroup(parser, "Request arguments",
                                 "Arguments specific to 'request' actions")
    group.add_option('--start',
                     action='store',
                     type='int',
                     default='0',
                     help='Start of items to fetch with request get')
    group.add_option('--count',
                     action='store',
                     type='int',
                     default='0',
                     help='Count of items to fetch with request get')
    parser.add_option_group(group)

    group = optparse.OptionGroup(parser, "Upload arguments",
                                 "Arguments specific to 'upload' action")
    group.add_option('--datapath',
                     action='store',
                     help='server data path to use with upload')
    group.add_option('--metadata',
                     action='store',
                     help='xml file of resource metadata - for upload.')
    parser.add_option_group(group)

    # also repeat these below, near 'dynamic'
    request_arg_names = [
        'distributor',
        'resource',
        'distributionType',
        'available',
        'returnable',
        'resourceItem',
        'notifyURL',
        'user',
    ]
    for name in request_arg_names:
        # 'available' - int
        # user - needed?

        if name in ('distributor', 'resource'):
            parser.add_option('--' + name,
                              action='store',
                              metavar='UUID',
                              help=name + ' argument for request')
        elif name == 'notifyURL':
            parser.add_option('--' + name,
                              action='store',
                              metavar='URL',
                              help=name + ' argument for request')
        else:
            parser.add_option('--' + name,
                              action='store',
                              help=name + ' argument for request')

    opts, args = parser.parse_args(argv)

    if opts.permissions:
        opts.permissions = open(opts.permissions).read()
    if opts.debug:
        acs4.debug = True
    if opts.dry_run:
        acs4.dry_run = True

    if not opts.password:
        parser.error('We think a password arg might be required')
    if len(args) < 2:
        parser.error('Please supply at least server and action args')

    server = args[0]
    action = args[1].lower()

    actions = ['queryresourceitems', 'upload', 'request', 'mint']
    if not action in actions:
        parser.error('action arg should be one of ' + ', '.join(actions))

    if action == 'queryresourceitems':
        result = acs4.queryresourceitems(server,
                                         opts.password,
                                         start=opts.start,
                                         count=opts.count,
                                         distributor=opts.distributor,
                                         port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'upload':
        fh = None
        if len(args) == 3:
            if opts.datapath is not None:
                parser.error('--datapath (path to remote file)'
                             ' and filename both supplied.')
            fh = open(args[2])
        elif len(args) == 2:
            if opts.datapath is None:
                parser.error('please supply filename or --datapath argument')
        else:
            parser.error('Wrong number of args supplied to upload action')
        result = acs4.upload(server,
                             fh,
                             opts.password,
                             datapath=opts.datapath,
                             permissions=opts.permissions,
                             metadata=opts.metadata,
                             port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'request':
        request_types = ['get', 'count', 'create', 'delete', 'update']
        joined = ', '.join(request_types)
        if len(args) != 4:
            parser.error('For "request" action, please supply server,'
                         ' "request", web_api, request_type - where web_api'
                         ' is e.g. DistributionRights, and request_type'
                         ' is one of ' + joined)
        api = args[2]
        request_type = args[3].lower()
        if not request_type in request_types:
            parser.error('Request type should be one of ' + joined)
        request_args = {}

        # TODO make this dynamic.  But opts is an optparse.Values, and
        # doesn't have __getitem__!  request_args = dict([(name,
        # opts[name]) for name in request_arg_names])
        request_args = {
            'distributor': opts.distributor,
            'resource': opts.resource,
            'distributionType': opts.distributionType,
            'available': opts.available,
            'returnable': opts.returnable,
            'resourceItem': opts.resourceItem,
            'notifyURL': opts.notifyURL,
            'user': opts.user,
        }
        result = acs4.request(server,
                              api,
                              request_type,
                              request_args,
                              opts.password,
                              start=opts.start,
                              count=opts.count,
                              permissions=opts.permissions,
                              port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'mint':

        # XXX also opt for supplying name, sharedsecret?  would skip
        # rt to server.

        if not opts.resource or not opts.distributor:
            parser.error('Please supply --resource= and --distributor='
                         ' arguments for mint')
        distinfo = acs4.get_distributor_info(server,
                                             opts.password,
                                             opts.distributor,
                                             port=opts.port)
        secret = distinfo['sharedSecret']
        name = distinfo['name']
        print(
            acs4.mint(server,
                      secret,
                      opts.resource,
                      'enterloan',
                      name,
                      port=opts.port))
    parser.destroy()
Ejemplo n.º 4
0
def main(argv):
    class MyParser(optparse.OptionParser):
        """ allows non-word-wrapped help epilog """
        def format_epilog(self, formatter):
            return self.epilog

    parser = MyParser(usage='usage: %prog [options] SERVER ACTION',
                      version='%prog 0.1',
                      description='Interact with ACS.  Action is one of "mint", "queryresourceitems", "upload" or "request".  See examples below.',
                      epilog="""
Examples:

python acs4cmd.py server mint --distributor='uuid' --resource='uuid'
python acs4cmd.py server queryresourceitems
python acs4cmd.py server upload [filename] (or --datapath=/server/path/book.epub)
python acs4cmd.py server request api request_type

        api is: (id is:)
                DistributionRights      (distributor + resource)
                Distributor             (distributor)
                Fulfillment             (fulfillment)
                FulfillmentItem         (fulfillment)
                License                 (user + resource)
                ResourceItem            (resource + item)
                ResourceKey             (resource)
                UserPublic              (user)

        request_type is: 'get count create delete update'

        USE WITH CARE, this can break your acs4 install!

""")

    parser.add_option('-p', '--password',
                      action='store',
                      help='ACS4 password')
    parser.add_option('--permissions',
                      action='store',
                      help='xml file of ACS4 perms - for upload and request')
    parser.add_option('-d', '--debug',
                      action='store_true',
                      help='Print debugging output')
    parser.add_option('--dry_run',
                      action='store_true',
                      help='Don\'t post to server')
    parser.add_option('--port',
                      action='store',
                      default=acs4.defaultport,
                      help='Server port to use (default 8080)')


    group = optparse.OptionGroup(parser, "Request arguments",
                                    "Arguments specific to 'request' actions")
    group.add_option('--start',
                     action='store',
                     type='int',
                     default='0',
                     help='Start of items to fetch with request get')
    group.add_option('--count',
                     action='store',
                     type='int',
                     default='0',
                     help='Count of items to fetch with request get')
    parser.add_option_group(group)


    group = optparse.OptionGroup(parser, "Upload arguments",
                                 "Arguments specific to 'upload' action")
    group.add_option('--datapath',
                      action='store',
                      help='server data path to use with upload')
    group.add_option('--metadata',
                     action='store',
                     help='xml file of resource metadata - for upload.')
    parser.add_option_group(group)


    # also repeat these below, near 'dynamic'
    request_arg_names = ['distributor',
                         'resource',
                         'distributionType',
                         'available',
                         'returnable',
                         'resourceItem',
                         'notifyURL',
                         'user',
                         ]
    for name in request_arg_names:
        # 'available' - int
        # user - needed?


        if name in ('distributor', 'resource'):
            parser.add_option('--' + name,
                              action='store',
                              metavar='UUID',
                              help=name + ' argument for request')
        elif name == 'notifyURL':
            parser.add_option('--' + name,
                              action='store',
                              metavar='URL',
                              help=name + ' argument for request')
        else:
            parser.add_option('--' + name,
                              action='store',
                              help=name + ' argument for request')

    opts, args = parser.parse_args(argv)

    if opts.permissions:
        opts.permissions = open(opts.permissions).read()
    if opts.debug:
        acs4.debug = True
    if opts.dry_run:
        acs4.dry_run = True

    if not opts.password:
        parser.error('We think a password arg might be required')
    if len(args) < 2:
        parser.error('Please supply at least server and action args')

    server = args[0]
    action = args[1].lower()

    actions = ['queryresourceitems', 'upload', 'request', 'mint']
    if not action in actions:
        parser.error('action arg should be one of ' + ', '.join(actions))

    if action == 'queryresourceitems':
        result = acs4.queryresourceitems(server, opts.password,
                                         start=opts.start,
                                         count=opts.count,
                                         distributor=opts.distributor,
                                         port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'upload':
        fh = None
        if len(args) == 3:
            if opts.datapath is not None:
                parser.error('--datapath (path to remote file)'
                             ' and filename both supplied.')
            fh = open(args[2])
        elif len(args) == 2:
            if opts.datapath is None:
                parser.error('please supply filename or --datapath argument')
        else:
            parser.error('Wrong number of args supplied to upload action')
        result = acs4.upload(server, fh, opts.password,
                             datapath=opts.datapath,
                             permissions=opts.permissions,
                             metadata=opts.metadata,
                             port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'request':
        request_types = ['get', 'count', 'create', 'delete', 'update']
        joined = ', '.join(request_types)
        if len(args) != 4:
            parser.error('For "request" action, please supply server,'
                         ' "request", web_api, request_type - where web_api'
                         ' is e.g. DistributionRights, and request_type'
                         ' is one of ' + joined)
        api = args[2]
        request_type = args[3].lower()
        if not request_type in request_types:
            parser.error('Request type should be one of ' + joined)
        request_args = {}

        # TODO make this dynamic.  But opts is an optparse.Values, and
        # doesn't have __getitem__!  request_args = dict([(name,
        # opts[name]) for name in request_arg_names])
        request_args = {
            'distributor': opts.distributor,
            'resource': opts.resource,
            'distributionType': opts.distributionType,
            'available': opts.available,
            'returnable': opts.returnable,
            'resourceItem': opts.resourceItem,
            'notifyURL': opts.notifyURL,
            'user': opts.user,
            }
        result = acs4.request(server, api, request_type, request_args,
                              opts.password,
                              start=opts.start,
                              count=opts.count,
                              permissions=opts.permissions,
                              port=opts.port)
        json.dump(result, sys.stdout, indent=4, sort_keys=True)
        print()

    elif action == 'mint':

        # XXX also opt for supplying name, sharedsecret?  would skip
        # rt to server.


        if not opts.resource or not opts.distributor:
            parser.error('Please supply --resource= and --distributor='
                         ' arguments for mint')
        distinfo = acs4.get_distributor_info(server, opts.password,
                                             opts.distributor,
                                             port=opts.port)
        secret = distinfo['sharedSecret']
        name = distinfo['name']
        print(acs4.mint(server, secret, opts.resource, 'enterloan', name,
                        port=opts.port))
    parser.destroy()