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() |