Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / pithcat @ fa7285cf

History | View | Annotate | Download (3.4 kB)

1 fa7285cf Giorgos Verigakis
#!/usr/bin/env python
2 fa7285cf Giorgos Verigakis
3 fa7285cf Giorgos Verigakis
# Copyright 2011 GRNET S.A. All rights reserved.
4 fa7285cf Giorgos Verigakis
#
5 fa7285cf Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
6 fa7285cf Giorgos Verigakis
# without modification, are permitted provided that the following
7 fa7285cf Giorgos Verigakis
# conditions are met:
8 fa7285cf Giorgos Verigakis
#
9 fa7285cf Giorgos Verigakis
#   1. Redistributions of source code must retain the above
10 fa7285cf Giorgos Verigakis
#      copyright notice, this list of conditions and the following
11 fa7285cf Giorgos Verigakis
#      disclaimer.
12 fa7285cf Giorgos Verigakis
#
13 fa7285cf Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
14 fa7285cf Giorgos Verigakis
#      copyright notice, this list of conditions and the following
15 fa7285cf Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
16 fa7285cf Giorgos Verigakis
#      provided with the distribution.
17 fa7285cf Giorgos Verigakis
#
18 fa7285cf Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 fa7285cf Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 fa7285cf Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 fa7285cf Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 fa7285cf Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 fa7285cf Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 fa7285cf Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 fa7285cf Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 fa7285cf Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 fa7285cf Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 fa7285cf Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 fa7285cf Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
30 fa7285cf Giorgos Verigakis
#
31 fa7285cf Giorgos Verigakis
# The views and conclusions contained in the software and
32 fa7285cf Giorgos Verigakis
# documentation are those of the authors and should not be
33 fa7285cf Giorgos Verigakis
# interpreted as representing official policies, either expressed
34 fa7285cf Giorgos Verigakis
# or implied, of GRNET S.A.
35 fa7285cf Giorgos Verigakis
36 fa7285cf Giorgos Verigakis
"""
37 fa7285cf Giorgos Verigakis
A tool that connects to the Pithos backend and returns the size and contents
38 fa7285cf Giorgos Verigakis
of a pithos object.
39 fa7285cf Giorgos Verigakis
40 fa7285cf Giorgos Verigakis
Since the backend does not have a "root" account we use the account given in
41 fa7285cf Giorgos Verigakis
the URL as the user when connecting to the backend.
42 fa7285cf Giorgos Verigakis
"""
43 fa7285cf Giorgos Verigakis
44 fa7285cf Giorgos Verigakis
from optparse import OptionParser
45 fa7285cf Giorgos Verigakis
from sys import exit, stdout
46 fa7285cf Giorgos Verigakis
47 fa7285cf Giorgos Verigakis
from pithos.backends.modular import ModularBackend
48 fa7285cf Giorgos Verigakis
49 fa7285cf Giorgos Verigakis
50 fa7285cf Giorgos Verigakis
parser = OptionParser(usage='%prog [options] <URL>')
51 fa7285cf Giorgos Verigakis
parser.add_option('--db', dest='db', metavar='URI',
52 fa7285cf Giorgos Verigakis
        help='SQLAlchemy URI of the database [REQUIRED]')
53 fa7285cf Giorgos Verigakis
parser.add_option('--data', dest='data', metavar='DIR',
54 fa7285cf Giorgos Verigakis
        help='path to the directory where data are stored [REQUIRED]')
55 fa7285cf Giorgos Verigakis
parser.add_option('-s', action='store_true', dest='size', default=False,
56 fa7285cf Giorgos Verigakis
        help='print file size and exit')
57 fa7285cf Giorgos Verigakis
58 fa7285cf Giorgos Verigakis
59 fa7285cf Giorgos Verigakis
def urlsplit(url):
60 fa7285cf Giorgos Verigakis
    """Returns (accout, container, object) from a location string"""
61 fa7285cf Giorgos Verigakis
    
62 fa7285cf Giorgos Verigakis
    assert url.startswith('pithos://'), "Invalid URL"
63 fa7285cf Giorgos Verigakis
    t = url.split('/', 4)
64 fa7285cf Giorgos Verigakis
    assert len(t) == 5, "Invalid URL"
65 fa7285cf Giorgos Verigakis
    return t[2:5]
66 fa7285cf Giorgos Verigakis
67 fa7285cf Giorgos Verigakis
68 fa7285cf Giorgos Verigakis
def print_size(backend, url):
69 fa7285cf Giorgos Verigakis
    """Writes object's size to stdout."""
70 fa7285cf Giorgos Verigakis
    
71 fa7285cf Giorgos Verigakis
    account, container, object = urlsplit(url)
72 fa7285cf Giorgos Verigakis
    meta = backend.get_object_meta(account, account, container, object)
73 fa7285cf Giorgos Verigakis
    print meta['bytes']
74 fa7285cf Giorgos Verigakis
75 fa7285cf Giorgos Verigakis
76 fa7285cf Giorgos Verigakis
def print_data(backend, url):
77 fa7285cf Giorgos Verigakis
    """Writes object's size to stdout."""
78 fa7285cf Giorgos Verigakis
    
79 fa7285cf Giorgos Verigakis
    account, container, object = urlsplit(url)
80 fa7285cf Giorgos Verigakis
    size, hashmap = backend.get_object_hashmap(account, account, container,
81 fa7285cf Giorgos Verigakis
            object)
82 fa7285cf Giorgos Verigakis
    for hash in hashmap:
83 fa7285cf Giorgos Verigakis
        block = backend.get_block(hash)
84 fa7285cf Giorgos Verigakis
        stdout.write(block)
85 fa7285cf Giorgos Verigakis
86 fa7285cf Giorgos Verigakis
87 fa7285cf Giorgos Verigakis
def main():
88 fa7285cf Giorgos Verigakis
    options, args = parser.parse_args()
89 fa7285cf Giorgos Verigakis
    if len(args) != 1 or not options.db or not options.data:
90 fa7285cf Giorgos Verigakis
        parser.print_help()
91 fa7285cf Giorgos Verigakis
        exit(1)
92 fa7285cf Giorgos Verigakis
93 fa7285cf Giorgos Verigakis
    url = args[0]
94 fa7285cf Giorgos Verigakis
    backend = ModularBackend(None, options.db, None, options.data)
95 fa7285cf Giorgos Verigakis
    
96 fa7285cf Giorgos Verigakis
    if options.size:
97 fa7285cf Giorgos Verigakis
        print_size(backend, url)
98 fa7285cf Giorgos Verigakis
    else:
99 fa7285cf Giorgos Verigakis
        print_data(backend, url)
100 fa7285cf Giorgos Verigakis
101 fa7285cf Giorgos Verigakis
if __name__ == '__main__':
102 fa7285cf Giorgos Verigakis
    main()