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