Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / pithcat @ 0d090771

History | View | Annotate | Download (2.6 kB)

1 fa7285cf Giorgos Verigakis
#!/usr/bin/env python
2 fa7285cf Giorgos Verigakis
3 0d090771 Giorgos Verigakis
# Copyright (C) 2011 GRNET S.A.
4 fa7285cf Giorgos Verigakis
#
5 0d090771 Giorgos Verigakis
# This program is free software; you can redistribute it and/or modify
6 0d090771 Giorgos Verigakis
# it under the terms of the GNU General Public License as published by
7 0d090771 Giorgos Verigakis
# the Free Software Foundation; either version 2 of the License, or
8 0d090771 Giorgos Verigakis
# (at your option) any later version.
9 fa7285cf Giorgos Verigakis
#
10 0d090771 Giorgos Verigakis
# This program is distributed in the hope that it will be useful, but
11 0d090771 Giorgos Verigakis
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 0d090771 Giorgos Verigakis
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 0d090771 Giorgos Verigakis
# General Public License for more details.
14 fa7285cf Giorgos Verigakis
#
15 0d090771 Giorgos Verigakis
# You should have received a copy of the GNU General Public License
16 0d090771 Giorgos Verigakis
# along with this program; if not, write to the Free Software
17 0d090771 Giorgos Verigakis
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 0d090771 Giorgos Verigakis
# 02110-1301, USA.
19 fa7285cf Giorgos Verigakis
20 fa7285cf Giorgos Verigakis
"""
21 fa7285cf Giorgos Verigakis
A tool that connects to the Pithos backend and returns the size and contents
22 fa7285cf Giorgos Verigakis
of a pithos object.
23 fa7285cf Giorgos Verigakis
24 fa7285cf Giorgos Verigakis
Since the backend does not have a "root" account we use the account given in
25 fa7285cf Giorgos Verigakis
the URL as the user when connecting to the backend.
26 fa7285cf Giorgos Verigakis
"""
27 fa7285cf Giorgos Verigakis
28 fa7285cf Giorgos Verigakis
from optparse import OptionParser
29 fa7285cf Giorgos Verigakis
from sys import exit, stdout
30 fa7285cf Giorgos Verigakis
31 fa7285cf Giorgos Verigakis
from pithos.backends.modular import ModularBackend
32 fa7285cf Giorgos Verigakis
33 fa7285cf Giorgos Verigakis
34 fa7285cf Giorgos Verigakis
parser = OptionParser(usage='%prog [options] <URL>')
35 fa7285cf Giorgos Verigakis
parser.add_option('--db', dest='db', metavar='URI',
36 fa7285cf Giorgos Verigakis
        help='SQLAlchemy URI of the database [REQUIRED]')
37 fa7285cf Giorgos Verigakis
parser.add_option('--data', dest='data', metavar='DIR',
38 fa7285cf Giorgos Verigakis
        help='path to the directory where data are stored [REQUIRED]')
39 fa7285cf Giorgos Verigakis
parser.add_option('-s', action='store_true', dest='size', default=False,
40 fa7285cf Giorgos Verigakis
        help='print file size and exit')
41 fa7285cf Giorgos Verigakis
42 fa7285cf Giorgos Verigakis
43 fa7285cf Giorgos Verigakis
def urlsplit(url):
44 fa7285cf Giorgos Verigakis
    """Returns (accout, container, object) from a location string"""
45 fa7285cf Giorgos Verigakis
    
46 fa7285cf Giorgos Verigakis
    assert url.startswith('pithos://'), "Invalid URL"
47 fa7285cf Giorgos Verigakis
    t = url.split('/', 4)
48 fa7285cf Giorgos Verigakis
    assert len(t) == 5, "Invalid URL"
49 fa7285cf Giorgos Verigakis
    return t[2:5]
50 fa7285cf Giorgos Verigakis
51 fa7285cf Giorgos Verigakis
52 fa7285cf Giorgos Verigakis
def print_size(backend, url):
53 fa7285cf Giorgos Verigakis
    """Writes object's size to stdout."""
54 fa7285cf Giorgos Verigakis
    
55 fa7285cf Giorgos Verigakis
    account, container, object = urlsplit(url)
56 fa7285cf Giorgos Verigakis
    meta = backend.get_object_meta(account, account, container, object)
57 fa7285cf Giorgos Verigakis
    print meta['bytes']
58 fa7285cf Giorgos Verigakis
59 fa7285cf Giorgos Verigakis
60 fa7285cf Giorgos Verigakis
def print_data(backend, url):
61 fa7285cf Giorgos Verigakis
    """Writes object's size to stdout."""
62 fa7285cf Giorgos Verigakis
    
63 fa7285cf Giorgos Verigakis
    account, container, object = urlsplit(url)
64 fa7285cf Giorgos Verigakis
    size, hashmap = backend.get_object_hashmap(account, account, container,
65 fa7285cf Giorgos Verigakis
            object)
66 fa7285cf Giorgos Verigakis
    for hash in hashmap:
67 fa7285cf Giorgos Verigakis
        block = backend.get_block(hash)
68 fa7285cf Giorgos Verigakis
        stdout.write(block)
69 fa7285cf Giorgos Verigakis
70 fa7285cf Giorgos Verigakis
71 fa7285cf Giorgos Verigakis
def main():
72 fa7285cf Giorgos Verigakis
    options, args = parser.parse_args()
73 fa7285cf Giorgos Verigakis
    if len(args) != 1 or not options.db or not options.data:
74 fa7285cf Giorgos Verigakis
        parser.print_help()
75 fa7285cf Giorgos Verigakis
        exit(1)
76 fa7285cf Giorgos Verigakis
77 fa7285cf Giorgos Verigakis
    url = args[0]
78 fa7285cf Giorgos Verigakis
    backend = ModularBackend(None, options.db, None, options.data)
79 fa7285cf Giorgos Verigakis
    
80 fa7285cf Giorgos Verigakis
    if options.size:
81 fa7285cf Giorgos Verigakis
        print_size(backend, url)
82 fa7285cf Giorgos Verigakis
    else:
83 fa7285cf Giorgos Verigakis
        print_data(backend, url)
84 fa7285cf Giorgos Verigakis
85 fa7285cf Giorgos Verigakis
if __name__ == '__main__':
86 fa7285cf Giorgos Verigakis
    main()