Revision a4c10cbc tools/store

b/tools/store
1 1
#!/usr/bin/env python
2 2

  
3
# Copyright 2011 GRNET S.A. All rights reserved.
4
# 
5
# Redistribution and use in source and binary forms, with or
6
# without modification, are permitted provided that the following
7
# conditions are met:
8
# 
9
#   1. Redistributions of source code must retain the above
10
#      copyright notice, this list of conditions and the following
11
#      disclaimer.
12
# 
13
#   2. Redistributions in binary form must reproduce the above
14
#      copyright notice, this list of conditions and the following
15
#      disclaimer in the documentation and/or other materials
16
#      provided with the distribution.
17
# 
18
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
# POSSIBILITY OF SUCH DAMAGE.
30
# 
31
# The views and conclusions contained in the software and
32
# documentation are those of the authors and should not be
33
# interpreted as representing official policies, either expressed
34
# or implied, of GRNET S.A.
35

  
3 36
from getpass import getuser
4 37
from optparse import OptionParser
5 38
from os.path import basename
......
132 165
            t = _time.strptime(self.until, self.format)
133 166
            params['until'] = int(_time.mktime(t))
134 167
        
135
        l = self.client.list_objects(container, self.detail, params, headers)
136
        print_list(l)
168
        detail = 'json'
169
        l = self.client.list_objects(container, detail, params, headers)
170
        print_list(l, detail=self.detail)
137 171

  
138 172
@cli_command('meta')
139 173
class Meta(Command):
......
294 328
        headers = {}
295 329
        if self.manifest:
296 330
            headers['X_OBJECT_MANIFEST'] = self.manifest
297
            
298
        attrs = ['etag', 'content-encoding', 'content-disposition']
299 331
        
300 332
        attrs = ['etag', 'content-encoding', 'content-disposition',
301 333
                 'content-type']
......
425 457
    syntax = '<src container>/<src object> [<dst container>/]<dst object>'
426 458
    description = 'moves an object to a different location'
427 459
    
428
    def add_options(self, parser):
429
        parser.add_option('--version', action='store',
430
                          dest='version', default=False,
431
                          help='move specific version')
432

  
433 460
    def execute(self, src, dst):
434 461
        src_container, sep, src_object = src.partition('/')
435 462
        dst_container, sep, dst_object = dst.partition('/')
......
437 464
            dst_container = src_container
438 465
            dst_object = dst
439 466
        
440
        version = getattr(self, 'version')
441
        if version:
442
            headers = {}
443
            headers['X_SOURCE_VERSION'] = version 
444 467
        self.client.move_object(src_container, src_object, dst_container,
445 468
                                dst_object, headers)
446 469

  
......
500 523
        commands.append('  %s %s' % (name.ljust(12), description))
501 524
    print '\nCommands:\n' + '\n'.join(sorted(commands))
502 525

  
503
def print_dict(d, header='name', f=stdout):
526
def print_dict(d, header='name', f=stdout, detail=True):
504 527
    header = header in d and header or 'subdir'
505 528
    if header and header in d:
506 529
        f.write('%s\n' %d.pop(header))
507
    patterns = ['^x_(account|container|object)_meta_(\w+)$']
508
    patterns.append(patterns[0].replace('_', '-'))
509
    for key, val in sorted(d.items()):
510
        for p in patterns:
511
            p = re.compile(p)
512
            m = p.match(key)
513
            if m:
514
                key = m.group(2)
515
        f.write('%s: %s\n' % (key.rjust(30), val))
530
    if detail:
531
        patterns = ['^x_(account|container|object)_meta_(\w+)$']
532
        patterns.append(patterns[0].replace('_', '-'))
533
        for key, val in sorted(d.items()):
534
            for p in patterns:
535
                p = re.compile(p)
536
                m = p.match(key)
537
                if m:
538
                    key = m.group(2)
539
            f.write('%s: %s\n' % (key.rjust(30), val))
516 540

  
517
def print_list(l, verbose=False, f=stdout):
541
def print_list(l, verbose=False, f=stdout, detail=True):
518 542
    for elem in l:
519 543
        #if it's empty string continue
520 544
        if not elem:
521 545
            continue
522 546
        if type(elem) == types.DictionaryType:
523
            print_dict(elem, f=f)
547
            print_dict(elem, f=f, detail=detail)
524 548
        elif type(elem) == types.StringType:
525 549
            if not verbose:
526 550
                elem = elem.split('Traceback')[0]

Also available in: Unified diff