Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / pithos_cli.py @ 3fe56be4

History | View | Annotate | Download (45.3 kB)

1 7493ccb6 Stavros Sachtouris
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 7493ccb6 Stavros Sachtouris
#      disclaimer.
10 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 7493ccb6 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7493ccb6 Stavros Sachtouris
#      provided with the distribution.
15 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7493ccb6 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 7493ccb6 Stavros Sachtouris
# or implied, of GRNET S.A.command
33 7493ccb6 Stavros Sachtouris
34 234954d1 Stavros Sachtouris
from kamaki.cli import command
35 d486baec Stavros Sachtouris
from kamaki.cli.command_tree import CommandTree
36 447c9568 Stavros Sachtouris
from kamaki.cli.errors import raiseCLIError, CLISyntaxError
37 234954d1 Stavros Sachtouris
from kamaki.cli.utils import format_size, print_dict, pretty_keys
38 e3d4d442 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument, IntArgument
39 03d661d8 Stavros Sachtouris
from kamaki.cli.argument import KeyValueArgument
40 fd1f1d96 Stavros Sachtouris
from kamaki.cli.argument import ProgressBarArgument
41 0b9269d8 Stavros Sachtouris
from kamaki.cli.commands import _command_init
42 7493ccb6 Stavros Sachtouris
from kamaki.clients.pithos import PithosClient, ClientError
43 67cea04c Stavros Sachtouris
from kamaki.cli.utils import bold
44 234954d1 Stavros Sachtouris
from sys import stdout
45 234954d1 Stavros Sachtouris
from time import localtime, strftime
46 e3d4d442 Stavros Sachtouris
from datetime import datetime as dtm
47 451a7992 Stavros Sachtouris
from logging import getLogger
48 7493ccb6 Stavros Sachtouris
49 451a7992 Stavros Sachtouris
kloger = getLogger('kamaki')
50 234954d1 Stavros Sachtouris
51 d486baec Stavros Sachtouris
pithos_cmds = CommandTree('store', 'Pithos+ storage commands')
52 d486baec Stavros Sachtouris
_commands = [pithos_cmds]
53 234954d1 Stavros Sachtouris
54 7493ccb6 Stavros Sachtouris
55 234954d1 Stavros Sachtouris
# Argument functionality
56 234954d1 Stavros Sachtouris
57 234954d1 Stavros Sachtouris
58 efdee310 Stavros Sachtouris
class DelimiterArgument(ValueArgument):
59 befed235 Stavros Sachtouris
    """
60 befed235 Stavros Sachtouris
    :value type: string
61 befed235 Stavros Sachtouris
    :value returns: given string or /
62 03d661d8 Stavros Sachtouris
    """
63 03d661d8 Stavros Sachtouris
64 efdee310 Stavros Sachtouris
    def __init__(self, caller_obj, help='', parsed_name=None, default=None):
65 efdee310 Stavros Sachtouris
        super(DelimiterArgument, self).__init__(help, parsed_name, default)
66 efdee310 Stavros Sachtouris
        self.caller_obj = caller_obj
67 efdee310 Stavros Sachtouris
68 234954d1 Stavros Sachtouris
    @property
69 efdee310 Stavros Sachtouris
    def value(self):
70 2fe2672e Stavros Sachtouris
        if self.caller_obj['recursive']:
71 efdee310 Stavros Sachtouris
            return '/'
72 efdee310 Stavros Sachtouris
        return getattr(self, '_value', self.default)
73 234954d1 Stavros Sachtouris
74 234954d1 Stavros Sachtouris
    @value.setter
75 efdee310 Stavros Sachtouris
    def value(self, newvalue):
76 efdee310 Stavros Sachtouris
        self._value = newvalue
77 efdee310 Stavros Sachtouris
78 234954d1 Stavros Sachtouris
79 befed235 Stavros Sachtouris
class SharingArgument(ValueArgument):
80 befed235 Stavros Sachtouris
    """Set sharing (read and/or write) groups
81 0f653327 Stavros Sachtouris

82 befed235 Stavros Sachtouris
    :value type: "read=term1,term2,... write=term1,term2,..."
83 befed235 Stavros Sachtouris

84 befed235 Stavros Sachtouris
    :value returns: {'read':['term1', 'term2', ...],
85 befed235 Stavros Sachtouris
        'write':['term1', 'term2', ...]}
86 befed235 Stavros Sachtouris
    """
87 234954d1 Stavros Sachtouris
88 234954d1 Stavros Sachtouris
    @property
89 e3d4d442 Stavros Sachtouris
    def value(self):
90 e3d4d442 Stavros Sachtouris
        return getattr(self, '_value', self.default)
91 234954d1 Stavros Sachtouris
92 e3d4d442 Stavros Sachtouris
    @value.setter
93 e3d4d442 Stavros Sachtouris
    def value(self, newvalue):
94 e3d4d442 Stavros Sachtouris
        perms = {}
95 e3d4d442 Stavros Sachtouris
        try:
96 e3d4d442 Stavros Sachtouris
            permlist = newvalue.split(' ')
97 e3d4d442 Stavros Sachtouris
        except AttributeError:
98 e3d4d442 Stavros Sachtouris
            return
99 e3d4d442 Stavros Sachtouris
        for p in permlist:
100 e3d4d442 Stavros Sachtouris
            try:
101 234954d1 Stavros Sachtouris
                (key, val) = p.split('=')
102 83ba5545 Stavros Sachtouris
            except ValueError as err:
103 43ee6ae1 Stavros Sachtouris
                raiseCLIError(err, 'Error in --sharing',
104 234954d1 Stavros Sachtouris
                    details='Incorrect format',
105 234954d1 Stavros Sachtouris
                    importance=1)
106 e3d4d442 Stavros Sachtouris
            if key.lower() not in ('read', 'write'):
107 43ee6ae1 Stavros Sachtouris
                raiseCLIError(err, 'Error in --sharing',
108 83ba5545 Stavros Sachtouris
                    details='Invalid permission key %s' % key,
109 234954d1 Stavros Sachtouris
                    importance=1)
110 e3d4d442 Stavros Sachtouris
            val_list = val.split(',')
111 234954d1 Stavros Sachtouris
            if not key in perms:
112 234954d1 Stavros Sachtouris
                perms[key] = []
113 e3d4d442 Stavros Sachtouris
            for item in val_list:
114 e3d4d442 Stavros Sachtouris
                if item not in perms[key]:
115 e3d4d442 Stavros Sachtouris
                    perms[key].append(item)
116 e3d4d442 Stavros Sachtouris
        self._value = perms
117 e3d4d442 Stavros Sachtouris
118 234954d1 Stavros Sachtouris
119 e3d4d442 Stavros Sachtouris
class RangeArgument(ValueArgument):
120 befed235 Stavros Sachtouris
    """
121 befed235 Stavros Sachtouris
    :value type: string of the form <start>-<end>
122 befed235 Stavros Sachtouris
        where <start> and <end> are integers
123 befed235 Stavros Sachtouris

124 befed235 Stavros Sachtouris
    :value returns: the input string, after type checking <start> and <end>
125 befed235 Stavros Sachtouris
    """
126 befed235 Stavros Sachtouris
127 234954d1 Stavros Sachtouris
    @property
128 e3d4d442 Stavros Sachtouris
    def value(self):
129 e3d4d442 Stavros Sachtouris
        return getattr(self, '_value', self.default)
130 234954d1 Stavros Sachtouris
131 e3d4d442 Stavros Sachtouris
    @value.setter
132 e3d4d442 Stavros Sachtouris
    def value(self, newvalue):
133 e3d4d442 Stavros Sachtouris
        if newvalue is None:
134 e3d4d442 Stavros Sachtouris
            self._value = self.default
135 e3d4d442 Stavros Sachtouris
            return
136 9ceec15a Stavros Sachtouris
        (start, end) = newvalue.split('-')
137 e3d4d442 Stavros Sachtouris
        (start, end) = (int(start), int(end))
138 234954d1 Stavros Sachtouris
        self._value = '%s-%s' % (start, end)
139 234954d1 Stavros Sachtouris
140 e3d4d442 Stavros Sachtouris
141 e3d4d442 Stavros Sachtouris
class DateArgument(ValueArgument):
142 befed235 Stavros Sachtouris
    """
143 befed235 Stavros Sachtouris
    :value type: a string formated in an acceptable date format
144 befed235 Stavros Sachtouris

145 befed235 Stavros Sachtouris
    :value returns: same date in first of DATE_FORMATS
146 befed235 Stavros Sachtouris
    """
147 befed235 Stavros Sachtouris
148 e3d4d442 Stavros Sachtouris
    DATE_FORMATS = ["%a %b %d %H:%M:%S %Y",
149 e3d4d442 Stavros Sachtouris
        "%A, %d-%b-%y %H:%M:%S GMT",
150 e3d4d442 Stavros Sachtouris
        "%a, %d %b %Y %H:%M:%S GMT"]
151 e3d4d442 Stavros Sachtouris
152 e3d4d442 Stavros Sachtouris
    INPUT_FORMATS = DATE_FORMATS + ["%d-%m-%Y", "%H:%M:%S %d-%m-%Y"]
153 e3d4d442 Stavros Sachtouris
154 234954d1 Stavros Sachtouris
    @property
155 e3d4d442 Stavros Sachtouris
    def value(self):
156 e3d4d442 Stavros Sachtouris
        return getattr(self, '_value', self.default)
157 234954d1 Stavros Sachtouris
158 e3d4d442 Stavros Sachtouris
    @value.setter
159 e3d4d442 Stavros Sachtouris
    def value(self, newvalue):
160 e3d4d442 Stavros Sachtouris
        if newvalue is None:
161 e3d4d442 Stavros Sachtouris
            return
162 e3d4d442 Stavros Sachtouris
        self._value = self.format_date(newvalue)
163 e3d4d442 Stavros Sachtouris
164 e3d4d442 Stavros Sachtouris
    def format_date(self, datestr):
165 e3d4d442 Stavros Sachtouris
        for format in self.INPUT_FORMATS:
166 e3d4d442 Stavros Sachtouris
            try:
167 e3d4d442 Stavros Sachtouris
                t = dtm.strptime(datestr, format)
168 e3d4d442 Stavros Sachtouris
            except ValueError:
169 e3d4d442 Stavros Sachtouris
                continue
170 e3d4d442 Stavros Sachtouris
            self._value = t.strftime(self.DATE_FORMATS[0])
171 e3d4d442 Stavros Sachtouris
            return
172 83ba5545 Stavros Sachtouris
        raiseCLIError(None,
173 83ba5545 Stavros Sachtouris
            'Date Argument Error',
174 234954d1 Stavros Sachtouris
            details='%s not a valid date. correct formats:\n\t%s'\
175 234954d1 Stavros Sachtouris
            % (datestr, self.INPUT_FORMATS))
176 234954d1 Stavros Sachtouris
177 234954d1 Stavros Sachtouris
178 234954d1 Stavros Sachtouris
# Command specs
179 234954d1 Stavros Sachtouris
180 e3d4d442 Stavros Sachtouris
181 5eae854d Stavros Sachtouris
class _pithos_init(_command_init):
182 befed235 Stavros Sachtouris
    """Initialize a pithos+ kamaki client"""
183 befed235 Stavros Sachtouris
184 7493ccb6 Stavros Sachtouris
    def main(self):
185 234954d1 Stavros Sachtouris
        self.token = self.config.get('store', 'token')\
186 234954d1 Stavros Sachtouris
            or self.config.get('global', 'token')
187 234954d1 Stavros Sachtouris
        self.base_url = self.config.get('store', 'url')\
188 234954d1 Stavros Sachtouris
            or self.config.get('global', 'url')
189 234954d1 Stavros Sachtouris
        self.account = self.config.get('store', 'account')\
190 234954d1 Stavros Sachtouris
            or self.config.get('global', 'account')
191 234954d1 Stavros Sachtouris
        self.container = self.config.get('store', 'container')\
192 234954d1 Stavros Sachtouris
            or self.config.get('global', 'container')
193 234954d1 Stavros Sachtouris
        self.client = PithosClient(base_url=self.base_url,
194 234954d1 Stavros Sachtouris
            token=self.token,
195 234954d1 Stavros Sachtouris
            account=self.account,
196 7493ccb6 Stavros Sachtouris
            container=self.container)
197 7493ccb6 Stavros Sachtouris
198 234954d1 Stavros Sachtouris
199 7493ccb6 Stavros Sachtouris
class _store_account_command(_pithos_init):
200 7493ccb6 Stavros Sachtouris
    """Base class for account level storage commands"""
201 7493ccb6 Stavros Sachtouris
202 c41a86b2 Stavros Sachtouris
    def __init__(self, arguments={}):
203 c41a86b2 Stavros Sachtouris
        super(_store_account_command, self).__init__(arguments)
204 47ae7577 Stavros Sachtouris
        self['account']=ValueArgument(
205 47ae7577 Stavros Sachtouris
            'Set user account (not permanent)',
206 47ae7577 Stavros Sachtouris
            '--account')
207 7493ccb6 Stavros Sachtouris
208 7493ccb6 Stavros Sachtouris
    def main(self):
209 7493ccb6 Stavros Sachtouris
        super(_store_account_command, self).main()
210 47ae7577 Stavros Sachtouris
        if self['account']:
211 47ae7577 Stavros Sachtouris
            self.client.account = self['account']
212 7493ccb6 Stavros Sachtouris
213 234954d1 Stavros Sachtouris
214 7493ccb6 Stavros Sachtouris
class _store_container_command(_store_account_command):
215 7493ccb6 Stavros Sachtouris
    """Base class for container level storage commands"""
216 7493ccb6 Stavros Sachtouris
217 2d7ce81e Stavros Sachtouris
    generic_err_details = ['Choose one of the following options:',
218 2d7ce81e Stavros Sachtouris
    '  1. Set store.container variable (permanent)',
219 2d7ce81e Stavros Sachtouris
    '     /config set store.container <container>',
220 2d7ce81e Stavros Sachtouris
    '  2. --container=<container> (temporary, overrides 1)',
221 2d7ce81e Stavros Sachtouris
    '  3. Use <container>:<path> (temporary, overrides all)']
222 47ae7577 Stavros Sachtouris
    container = None
223 47ae7577 Stavros Sachtouris
    path = None
224 2d7ce81e Stavros Sachtouris
225 c41a86b2 Stavros Sachtouris
    def __init__(self, arguments={}):
226 c41a86b2 Stavros Sachtouris
        super(_store_container_command, self).__init__(arguments)
227 47ae7577 Stavros Sachtouris
        self['container']=ValueArgument(
228 47ae7577 Stavros Sachtouris
            'Set container to work with (temporary)',
229 47ae7577 Stavros Sachtouris
            '--container')
230 7493ccb6 Stavros Sachtouris
231 234954d1 Stavros Sachtouris
    def extract_container_and_path(self,
232 234954d1 Stavros Sachtouris
        container_with_path,
233 234954d1 Stavros Sachtouris
        path_is_optional=True):
234 83ba5545 Stavros Sachtouris
        try:
235 83ba5545 Stavros Sachtouris
            assert isinstance(container_with_path, str)
236 83ba5545 Stavros Sachtouris
        except AssertionError as err:
237 83ba5545 Stavros Sachtouris
            raiseCLIError(err)
238 447c9568 Stavros Sachtouris
239 447c9568 Stavros Sachtouris
        cont, sep, path = container_with_path.partition(':')
240 447c9568 Stavros Sachtouris
241 447c9568 Stavros Sachtouris
        if sep:
242 447c9568 Stavros Sachtouris
            if not cont:
243 c1558584 Stavros Sachtouris
                raiseCLIError(CLISyntaxError('Container is missing\n',
244 2d7ce81e Stavros Sachtouris
                    details=self.generic_err_details))
245 47ae7577 Stavros Sachtouris
            alt_cont = self['container']
246 447c9568 Stavros Sachtouris
            if alt_cont and cont != alt_cont:
247 c1558584 Stavros Sachtouris
                raiseCLIError(CLISyntaxError(
248 447c9568 Stavros Sachtouris
                    'Conflict: 2 containers (%s, %s)' % (cont, alt_cont),
249 47ae7577 Stavros Sachtouris
                    details=self.generic_err_details)
250 47ae7577 Stavros Sachtouris
                )
251 447c9568 Stavros Sachtouris
            self.container = cont
252 447c9568 Stavros Sachtouris
            if not path:
253 c1558584 Stavros Sachtouris
                raiseCLIError(CLISyntaxError(
254 447c9568 Stavros Sachtouris
                    'Path is missing for object in container %s' % cont,
255 47ae7577 Stavros Sachtouris
                    details=self.generic_err_details)
256 47ae7577 Stavros Sachtouris
                )
257 447c9568 Stavros Sachtouris
            self.path = path
258 447c9568 Stavros Sachtouris
        else:
259 47ae7577 Stavros Sachtouris
            alt_cont = self['container'] or self.client.container
260 447c9568 Stavros Sachtouris
            if alt_cont:
261 447c9568 Stavros Sachtouris
                self.container = alt_cont
262 447c9568 Stavros Sachtouris
                self.path = cont
263 447c9568 Stavros Sachtouris
            elif path_is_optional:
264 447c9568 Stavros Sachtouris
                self.container = cont
265 7493ccb6 Stavros Sachtouris
                self.path = None
266 7493ccb6 Stavros Sachtouris
            else:
267 447c9568 Stavros Sachtouris
                self.container = cont
268 447c9568 Stavros Sachtouris
                raiseCLIError(CLISyntaxError(
269 c1558584 Stavros Sachtouris
                    'Both container and path are required',
270 47ae7577 Stavros Sachtouris
                    details=self.generic_err_details)
271 47ae7577 Stavros Sachtouris
                )
272 7493ccb6 Stavros Sachtouris
273 7493ccb6 Stavros Sachtouris
    def main(self, container_with_path=None, path_is_optional=True):
274 7493ccb6 Stavros Sachtouris
        super(_store_container_command, self).main()
275 7493ccb6 Stavros Sachtouris
        if container_with_path is not None:
276 47ae7577 Stavros Sachtouris
            self.extract_container_and_path(
277 47ae7577 Stavros Sachtouris
                container_with_path,
278 234954d1 Stavros Sachtouris
                path_is_optional)
279 7493ccb6 Stavros Sachtouris
            self.client.container = self.container
280 47ae7577 Stavros Sachtouris
        elif self['container']:
281 47ae7577 Stavros Sachtouris
            self.client.container = self['container']
282 7493ccb6 Stavros Sachtouris
        self.container = self.client.container
283 7493ccb6 Stavros Sachtouris
284 7493ccb6 Stavros Sachtouris
285 d486baec Stavros Sachtouris
@command(pithos_cmds)
286 7493ccb6 Stavros Sachtouris
class store_list(_store_container_command):
287 7493ccb6 Stavros Sachtouris
    """List containers, object trees or objects in a directory
288 2703cceb Stavros Sachtouris
    Use with:
289 2703cceb Stavros Sachtouris
    1 no parameters : containers in set account
290 2703cceb Stavros Sachtouris
    2. one parameter (container) or --container : contents of container
291 2703cceb Stavros Sachtouris
    3. <container>:<prefix> or --container=<container> <prefix>: objects in
292 2703cceb Stavros Sachtouris
        container starting with prefix
293 7493ccb6 Stavros Sachtouris
    """
294 7493ccb6 Stavros Sachtouris
295 47ae7577 Stavros Sachtouris
    arguments = dict(
296 47ae7577 Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
297 47ae7577 Stavros Sachtouris
        show_size=ValueArgument('print output in chunks of size N', '-N'),
298 47ae7577 Stavros Sachtouris
        limit=IntArgument('show limited output', '-n'),
299 47ae7577 Stavros Sachtouris
        marker=ValueArgument('show output greater that marker', '--marker'),
300 47ae7577 Stavros Sachtouris
        prefix=ValueArgument('show output staritng with prefix', '--prefix'),
301 47ae7577 Stavros Sachtouris
        delimiter=ValueArgument('show output up to delimiter', '--delimiter'),
302 47ae7577 Stavros Sachtouris
        path=ValueArgument(
303 47ae7577 Stavros Sachtouris
            'show output starting with prefix up to /',
304 47ae7577 Stavros Sachtouris
            '--path'),
305 47ae7577 Stavros Sachtouris
        meta=ValueArgument(
306 47ae7577 Stavros Sachtouris
            'show output with specified meta keys',
307 47ae7577 Stavros Sachtouris
            '--meta',
308 47ae7577 Stavros Sachtouris
            default=[]),
309 47ae7577 Stavros Sachtouris
        if_modified_since=ValueArgument(
310 47ae7577 Stavros Sachtouris
            'show output modified since then',
311 47ae7577 Stavros Sachtouris
            '--if-modified-since'),
312 47ae7577 Stavros Sachtouris
        if_unmodified_since=ValueArgument(
313 47ae7577 Stavros Sachtouris
            'show output not modified since then',
314 47ae7577 Stavros Sachtouris
            '--if-unmodified-since'),
315 47ae7577 Stavros Sachtouris
        until=DateArgument('show metadata until then', '--until'),
316 47ae7577 Stavros Sachtouris
        format=ValueArgument(
317 47ae7577 Stavros Sachtouris
            'format to parse until data (default: d/m/Y H:M:S )',
318 47ae7577 Stavros Sachtouris
            '--format'),
319 47ae7577 Stavros Sachtouris
        shared=FlagArgument('show only shared', '--shared'),
320 47ae7577 Stavros Sachtouris
        public=FlagArgument('show only public', '--public'),
321 47ae7577 Stavros Sachtouris
    )
322 c41a86b2 Stavros Sachtouris
323 7493ccb6 Stavros Sachtouris
    def print_objects(self, object_list):
324 7493ccb6 Stavros Sachtouris
        import sys
325 7493ccb6 Stavros Sachtouris
        try:
326 47ae7577 Stavros Sachtouris
            limit = int(self['show_size'])
327 0f653327 Stavros Sachtouris
        except (AttributeError, TypeError):
328 0f653327 Stavros Sachtouris
            limit = len(object_list) + 1
329 234954d1 Stavros Sachtouris
        for index, obj in enumerate(object_list):
330 234954d1 Stavros Sachtouris
            if 'content_type' not in obj:
331 7493ccb6 Stavros Sachtouris
                continue
332 7493ccb6 Stavros Sachtouris
            pretty_obj = obj.copy()
333 7493ccb6 Stavros Sachtouris
            index += 1
334 234954d1 Stavros Sachtouris
            empty_space = ' ' * (len(str(len(object_list))) - len(str(index)))
335 7493ccb6 Stavros Sachtouris
            if obj['content_type'] == 'application/directory':
336 7493ccb6 Stavros Sachtouris
                isDir = True
337 7493ccb6 Stavros Sachtouris
                size = 'D'
338 7493ccb6 Stavros Sachtouris
            else:
339 7493ccb6 Stavros Sachtouris
                isDir = False
340 7493ccb6 Stavros Sachtouris
                size = format_size(obj['bytes'])
341 234954d1 Stavros Sachtouris
                pretty_obj['bytes'] = '%s (%s)' % (obj['bytes'], size)
342 7493ccb6 Stavros Sachtouris
            oname = bold(obj['name'])
343 47ae7577 Stavros Sachtouris
            if self['detail']:
344 234954d1 Stavros Sachtouris
                print('%s%s. %s' % (empty_space, index, oname))
345 7493ccb6 Stavros Sachtouris
                print_dict(pretty_keys(pretty_obj), exclude=('name'))
346 7493ccb6 Stavros Sachtouris
                print
347 7493ccb6 Stavros Sachtouris
            else:
348 234954d1 Stavros Sachtouris
                oname = '%s%s. %6s %s' % (empty_space, index, size, oname)
349 7493ccb6 Stavros Sachtouris
                oname += '/' if isDir else ''
350 7493ccb6 Stavros Sachtouris
                print(oname)
351 234954d1 Stavros Sachtouris
            if limit <= index < len(object_list) and index % limit == 0:
352 7493ccb6 Stavros Sachtouris
                print('(press "enter" to continue)')
353 7493ccb6 Stavros Sachtouris
                sys.stdin.read(1)
354 7493ccb6 Stavros Sachtouris
355 7493ccb6 Stavros Sachtouris
    def print_containers(self, container_list):
356 7493ccb6 Stavros Sachtouris
        import sys
357 7493ccb6 Stavros Sachtouris
        try:
358 47ae7577 Stavros Sachtouris
            limit = self['show_size']
359 7493ccb6 Stavros Sachtouris
            limit = int(limit)
360 0f653327 Stavros Sachtouris
        except (AttributeError, TypeError):
361 234954d1 Stavros Sachtouris
            limit = len(container_list) + 1
362 234954d1 Stavros Sachtouris
        for index, container in enumerate(container_list):
363 234954d1 Stavros Sachtouris
            if 'bytes' in container:
364 234954d1 Stavros Sachtouris
                size = format_size(container['bytes'])
365 234954d1 Stavros Sachtouris
            cname = '%s. %s' % (index + 1, bold(container['name']))
366 47ae7577 Stavros Sachtouris
            if self['detail']:
367 7493ccb6 Stavros Sachtouris
                print(cname)
368 7493ccb6 Stavros Sachtouris
                pretty_c = container.copy()
369 234954d1 Stavros Sachtouris
                if 'bytes' in container:
370 234954d1 Stavros Sachtouris
                    pretty_c['bytes'] = '%s (%s)' % (container['bytes'], size)
371 7493ccb6 Stavros Sachtouris
                print_dict(pretty_keys(pretty_c), exclude=('name'))
372 7493ccb6 Stavros Sachtouris
                print
373 7493ccb6 Stavros Sachtouris
            else:
374 234954d1 Stavros Sachtouris
                if 'count' in container and 'bytes' in container:
375 234954d1 Stavros Sachtouris
                    print('%s (%s, %s objects)'\
376 234954d1 Stavros Sachtouris
                    % (cname, size, container['count']))
377 7493ccb6 Stavros Sachtouris
                else:
378 7493ccb6 Stavros Sachtouris
                    print(cname)
379 234954d1 Stavros Sachtouris
            if limit <= index < len(container_list) and index % limit == 0:
380 7493ccb6 Stavros Sachtouris
                print('(press "enter" to continue)')
381 7493ccb6 Stavros Sachtouris
                sys.stdin.read(1)
382 7493ccb6 Stavros Sachtouris
383 7493ccb6 Stavros Sachtouris
    def main(self, container____path__=None):
384 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
385 7493ccb6 Stavros Sachtouris
        try:
386 7493ccb6 Stavros Sachtouris
            if self.container is None:
387 47ae7577 Stavros Sachtouris
                r = self.client.account_get(
388 47ae7577 Stavros Sachtouris
                    limit=self['limit'],
389 47ae7577 Stavros Sachtouris
                    marker=self['marker'],
390 47ae7577 Stavros Sachtouris
                    if_modified_since=self['if_modified_since'],
391 47ae7577 Stavros Sachtouris
                    if_unmodified_since=self['if_unmodified_since'],
392 47ae7577 Stavros Sachtouris
                    until=self['until'],
393 47ae7577 Stavros Sachtouris
                    show_only_shared=self['shared'])
394 7493ccb6 Stavros Sachtouris
                self.print_containers(r.json)
395 7493ccb6 Stavros Sachtouris
            else:
396 2d7ce81e Stavros Sachtouris
                prefix = self.path if self.path\
397 47ae7577 Stavros Sachtouris
                else self['prefix']
398 47ae7577 Stavros Sachtouris
                r = self.client.container_get(
399 47ae7577 Stavros Sachtouris
                    limit=self['limit'],
400 47ae7577 Stavros Sachtouris
                    marker=self['marker'],
401 2d7ce81e Stavros Sachtouris
                    prefix=prefix,
402 47ae7577 Stavros Sachtouris
                    delimiter=self['delimiter'],
403 47ae7577 Stavros Sachtouris
                    path=self['path'],
404 47ae7577 Stavros Sachtouris
                    if_modified_since=self['if_modified_since'],
405 47ae7577 Stavros Sachtouris
                    if_unmodified_since=self['if_unmodified_since'],
406 47ae7577 Stavros Sachtouris
                    until=self['until'],
407 47ae7577 Stavros Sachtouris
                    meta=self['meta'],
408 47ae7577 Stavros Sachtouris
                    show_only_shared=self['shared'])
409 7493ccb6 Stavros Sachtouris
                self.print_objects(r.json)
410 7493ccb6 Stavros Sachtouris
        except ClientError as err:
411 c8e17a67 Stavros Sachtouris
            if err.status == 404:
412 c8e17a67 Stavros Sachtouris
                if 'Container does not exist' in ('%s' % err):
413 47ae7577 Stavros Sachtouris
                    raiseCLIError(
414 47ae7577 Stavros Sachtouris
                        err,
415 47ae7577 Stavros Sachtouris
                        'No container %s in account %s'\
416 c8e17a67 Stavros Sachtouris
                        % (self.container, self.account),
417 c8e17a67 Stavros Sachtouris
                        details=self.generic_err_details)
418 c8e17a67 Stavros Sachtouris
                elif 'Object does not exist' in ('%s' % err):
419 47ae7577 Stavros Sachtouris
                    raiseCLIError(
420 47ae7577 Stavros Sachtouris
                        err,
421 47ae7577 Stavros Sachtouris
                        'No object %s in %s\'s container %s'\
422 c8e17a67 Stavros Sachtouris
                        % (self.path, self.account, self.container),
423 c8e17a67 Stavros Sachtouris
                        details=self.generic_err_details)
424 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
425 7493ccb6 Stavros Sachtouris
426 234954d1 Stavros Sachtouris
427 d486baec Stavros Sachtouris
@command(pithos_cmds)
428 7493ccb6 Stavros Sachtouris
class store_mkdir(_store_container_command):
429 7493ccb6 Stavros Sachtouris
    """Create a directory"""
430 7493ccb6 Stavros Sachtouris
431 7493ccb6 Stavros Sachtouris
    def main(self, container___directory):
432 234954d1 Stavros Sachtouris
        super(self.__class__,
433 234954d1 Stavros Sachtouris
            self).main(container___directory, path_is_optional=False)
434 7493ccb6 Stavros Sachtouris
        try:
435 7493ccb6 Stavros Sachtouris
            self.client.create_directory(self.path)
436 7493ccb6 Stavros Sachtouris
        except ClientError as err:
437 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
438 7493ccb6 Stavros Sachtouris
439 234954d1 Stavros Sachtouris
440 d486baec Stavros Sachtouris
@command(pithos_cmds)
441 7493ccb6 Stavros Sachtouris
class store_create(_store_container_command):
442 7493ccb6 Stavros Sachtouris
    """Create a container or a directory object"""
443 7493ccb6 Stavros Sachtouris
444 2fe2672e Stavros Sachtouris
    arguments = dict(
445 2fe2672e Stavros Sachtouris
        versioning=ValueArgument(
446 2fe2672e Stavros Sachtouris
            'set container versioning (auto/none)',
447 2fe2672e Stavros Sachtouris
            '--versioning'),
448 2fe2672e Stavros Sachtouris
        quota=IntArgument('set default container quota', '--quota'),
449 2fe2672e Stavros Sachtouris
        meta=KeyValueArgument(
450 2fe2672e Stavros Sachtouris
            'set container metadata (can be repeated)',
451 2fe2672e Stavros Sachtouris
            '--meta')
452 2fe2672e Stavros Sachtouris
    )
453 7493ccb6 Stavros Sachtouris
454 7493ccb6 Stavros Sachtouris
    def main(self, container____directory__):
455 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____directory__)
456 7493ccb6 Stavros Sachtouris
        try:
457 7493ccb6 Stavros Sachtouris
            if self.path is None:
458 2fe2672e Stavros Sachtouris
                self.client.container_put(quota=self['quota'],
459 2fe2672e Stavros Sachtouris
                    versioning=self['versioning'],
460 2fe2672e Stavros Sachtouris
                    metadata=self['meta'])
461 7493ccb6 Stavros Sachtouris
            else:
462 7493ccb6 Stavros Sachtouris
                self.client.create_directory(self.path)
463 7493ccb6 Stavros Sachtouris
        except ClientError as err:
464 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
465 7493ccb6 Stavros Sachtouris
466 234954d1 Stavros Sachtouris
467 d486baec Stavros Sachtouris
@command(pithos_cmds)
468 7493ccb6 Stavros Sachtouris
class store_copy(_store_container_command):
469 2fe2672e Stavros Sachtouris
    """Copy an object from container to (another) container
470 2fe2672e Stavros Sachtouris
    Use options:
471 2fe2672e Stavros Sachtouris
    1. <container1>:<path1> <container2>[:path2] : from container1 to 2, if
472 2fe2672e Stavros Sachtouris
        path2 is not given, target path will be container2:path1
473 2fe2672e Stavros Sachtouris
    2. <container>:<path1> <container>:<path2> : make a copy in the same
474 2fe2672e Stavros Sachtouris
        container
475 2fe2672e Stavros Sachtouris
    3. Use --container= instead of <container1>, but only for the first
476 2fe2672e Stavros Sachtouris
        parameter
477 2fe2672e Stavros Sachtouris
    """
478 2fe2672e Stavros Sachtouris
479 2fe2672e Stavros Sachtouris
    arguments = dict(
480 2fe2672e Stavros Sachtouris
        source_version=ValueArgument(
481 2fe2672e Stavros Sachtouris
            'copy specific version',
482 2fe2672e Stavros Sachtouris
            '--source-version'),
483 2fe2672e Stavros Sachtouris
        public=ValueArgument('make object publicly accessible', '--public'),
484 2fe2672e Stavros Sachtouris
        content_type=ValueArgument(
485 2fe2672e Stavros Sachtouris
            'change object\'s content type',
486 2fe2672e Stavros Sachtouris
            '--content-type'),
487 2fe2672e Stavros Sachtouris
        recursive=FlagArgument(
488 2fe2672e Stavros Sachtouris
            'mass copy with delimiter /',
489 2fe2672e Stavros Sachtouris
            ('-r', '--recursive'))
490 2fe2672e Stavros Sachtouris
    )
491 7493ccb6 Stavros Sachtouris
492 efdee310 Stavros Sachtouris
    def __init__(self, arguments={}):
493 efdee310 Stavros Sachtouris
        super(self.__class__, self).__init__(arguments)
494 2fe2672e Stavros Sachtouris
        self['delimiter']=DelimiterArgument(
495 2fe2672e Stavros Sachtouris
            self,
496 234954d1 Stavros Sachtouris
            parsed_name='--delimiter',
497 234954d1 Stavros Sachtouris
            help=u'copy objects prefixed as src_object + delimiter')
498 efdee310 Stavros Sachtouris
499 7493ccb6 Stavros Sachtouris
    def main(self, source_container___path, destination_container____path__):
500 234954d1 Stavros Sachtouris
        super(self.__class__,
501 234954d1 Stavros Sachtouris
            self).main(source_container___path, path_is_optional=False)
502 7493ccb6 Stavros Sachtouris
        try:
503 7493ccb6 Stavros Sachtouris
            dst = destination_container____path__.split(':')
504 7493ccb6 Stavros Sachtouris
            dst_cont = dst[0]
505 7493ccb6 Stavros Sachtouris
            dst_path = dst[1] if len(dst) > 1 else False
506 234954d1 Stavros Sachtouris
            self.client.copy_object(src_container=self.container,
507 234954d1 Stavros Sachtouris
                src_object=self.path,
508 234954d1 Stavros Sachtouris
                dst_container=dst_cont,
509 234954d1 Stavros Sachtouris
                dst_object=dst_path,
510 2fe2672e Stavros Sachtouris
                source_version=self['source_version'],
511 2fe2672e Stavros Sachtouris
                public=self['public'],
512 2fe2672e Stavros Sachtouris
                content_type=self['content_type'],
513 2fe2672e Stavros Sachtouris
                delimiter=self['delimiter'])
514 7493ccb6 Stavros Sachtouris
        except ClientError as err:
515 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
516 7493ccb6 Stavros Sachtouris
517 234954d1 Stavros Sachtouris
518 d486baec Stavros Sachtouris
@command(pithos_cmds)
519 7493ccb6 Stavros Sachtouris
class store_move(_store_container_command):
520 2fe2672e Stavros Sachtouris
    """Copy an object
521 2fe2672e Stavros Sachtouris
    Use options:
522 2fe2672e Stavros Sachtouris
    1. <container1>:<path1> <container2>[:path2] : from container1 to 2, if
523 2fe2672e Stavros Sachtouris
        path2 is not given, target path will be container2:path1
524 2fe2672e Stavros Sachtouris
    2. <container>:<path1> <container>:<path2> : rename
525 2fe2672e Stavros Sachtouris
    3. Use --container= instead of <container1>, but only for the first
526 2fe2672e Stavros Sachtouris
        parameter
527 2fe2672e Stavros Sachtouris
    """
528 2fe2672e Stavros Sachtouris
529 2fe2672e Stavros Sachtouris
    arguments = dict(
530 2fe2672e Stavros Sachtouris
        source_version=ValueArgument('specify version', '--source-version'),
531 2fe2672e Stavros Sachtouris
        public=FlagArgument('make object publicly accessible', '--public'),
532 2fe2672e Stavros Sachtouris
        content_type=ValueArgument('modify content type', '--content-type'),
533 2fe2672e Stavros Sachtouris
        recursive= FlagArgument('up to delimiter /', ('-r', '--recursive'))
534 2fe2672e Stavros Sachtouris
    )
535 7493ccb6 Stavros Sachtouris
536 486f7af1 Stavros Sachtouris
    def __init__(self, arguments={}):
537 e3d4d442 Stavros Sachtouris
        super(self.__class__, self).__init__(arguments)
538 2fe2672e Stavros Sachtouris
        self['delimiter']=DelimiterArgument(
539 2fe2672e Stavros Sachtouris
            self,
540 234954d1 Stavros Sachtouris
            parsed_name='--delimiter',
541 2fe2672e Stavros Sachtouris
            help=u'move objects prefixed as src_object + delimiter')
542 7493ccb6 Stavros Sachtouris
543 7493ccb6 Stavros Sachtouris
    def main(self, source_container___path, destination_container____path__):
544 234954d1 Stavros Sachtouris
        super(self.__class__,
545 234954d1 Stavros Sachtouris
            self).main(source_container___path, path_is_optional=False)
546 7493ccb6 Stavros Sachtouris
        try:
547 7493ccb6 Stavros Sachtouris
            dst = destination_container____path__.split(':')
548 7493ccb6 Stavros Sachtouris
            dst_cont = dst[0]
549 7493ccb6 Stavros Sachtouris
            dst_path = dst[1] if len(dst) > 1 else False
550 234954d1 Stavros Sachtouris
            self.client.move_object(src_container=self.container,
551 234954d1 Stavros Sachtouris
                src_object=self.path,
552 234954d1 Stavros Sachtouris
                dst_container=dst_cont,
553 234954d1 Stavros Sachtouris
                dst_object=dst_path,
554 2fe2672e Stavros Sachtouris
                source_version=self['source_version'],
555 2fe2672e Stavros Sachtouris
                public=self['public'],
556 2fe2672e Stavros Sachtouris
                content_type=self['content_type'],
557 2fe2672e Stavros Sachtouris
                delimiter=self['delimiter'])
558 7493ccb6 Stavros Sachtouris
        except ClientError as err:
559 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
560 7493ccb6 Stavros Sachtouris
561 234954d1 Stavros Sachtouris
562 d486baec Stavros Sachtouris
@command(pithos_cmds)
563 7493ccb6 Stavros Sachtouris
class store_append(_store_container_command):
564 7493ccb6 Stavros Sachtouris
    """Append local file to (existing) remote object"""
565 7493ccb6 Stavros Sachtouris
566 2fe2672e Stavros Sachtouris
    arguments = dict(
567 2fe2672e Stavros Sachtouris
        progress_bar=ProgressBarArgument(
568 2fe2672e Stavros Sachtouris
            'do not show progress bar',
569 2fe2672e Stavros Sachtouris
            '--no-progress-bar',
570 2fe2672e Stavros Sachtouris
            default=False)
571 2fe2672e Stavros Sachtouris
    )
572 486f7af1 Stavros Sachtouris
573 7493ccb6 Stavros Sachtouris
    def main(self, local_path, container___path):
574 234954d1 Stavros Sachtouris
        super(self.__class__,
575 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
576 7493ccb6 Stavros Sachtouris
        try:
577 e876ac62 Stavros Sachtouris
            f = open(local_path, 'rb')
578 852a22e7 Stavros Sachtouris
            progress_bar = self.arguments['progress_bar']
579 5bfe1cda Stavros Sachtouris
            try:
580 234954d1 Stavros Sachtouris
                upload_cb = progress_bar.get_generator('Appending blocks')
581 5bfe1cda Stavros Sachtouris
            except Exception:
582 234954d1 Stavros Sachtouris
                upload_cb = None
583 234954d1 Stavros Sachtouris
            self.client.append_object(object=self.path,
584 234954d1 Stavros Sachtouris
                source_file=f,
585 234954d1 Stavros Sachtouris
                upload_cb=upload_cb)
586 7493ccb6 Stavros Sachtouris
        except ClientError as err:
587 852a22e7 Stavros Sachtouris
            progress_bar.finish()
588 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
589 852a22e7 Stavros Sachtouris
        finally:
590 852a22e7 Stavros Sachtouris
            progress_bar.finish()
591 7493ccb6 Stavros Sachtouris
592 234954d1 Stavros Sachtouris
593 d486baec Stavros Sachtouris
@command(pithos_cmds)
594 7493ccb6 Stavros Sachtouris
class store_truncate(_store_container_command):
595 7493ccb6 Stavros Sachtouris
    """Truncate remote file up to a size"""
596 7493ccb6 Stavros Sachtouris
597 7493ccb6 Stavros Sachtouris
    def main(self, container___path, size=0):
598 234954d1 Stavros Sachtouris
        super(self.__class__,
599 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
600 7493ccb6 Stavros Sachtouris
        try:
601 7493ccb6 Stavros Sachtouris
            self.client.truncate_object(self.path, size)
602 7493ccb6 Stavros Sachtouris
        except ClientError as err:
603 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
604 7493ccb6 Stavros Sachtouris
605 234954d1 Stavros Sachtouris
606 d486baec Stavros Sachtouris
@command(pithos_cmds)
607 7493ccb6 Stavros Sachtouris
class store_overwrite(_store_container_command):
608 7493ccb6 Stavros Sachtouris
    """Overwrite part (from start to end) of a remote file"""
609 7493ccb6 Stavros Sachtouris
610 2fe2672e Stavros Sachtouris
    arguments = dict(
611 2fe2672e Stavros Sachtouris
        progress_bar=ProgressBarArgument(
612 2fe2672e Stavros Sachtouris
            'do not show progress bar',
613 2fe2672e Stavros Sachtouris
            '--no-progress-bar', 
614 2fe2672e Stavros Sachtouris
            default=False)
615 2fe2672e Stavros Sachtouris
    )
616 486f7af1 Stavros Sachtouris
617 7493ccb6 Stavros Sachtouris
    def main(self, local_path, container___path, start, end):
618 234954d1 Stavros Sachtouris
        super(self.__class__,
619 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
620 7493ccb6 Stavros Sachtouris
        try:
621 e876ac62 Stavros Sachtouris
            f = open(local_path, 'rb')
622 852a22e7 Stavros Sachtouris
            progress_bar = self.arguments['progress_bar']
623 5bfe1cda Stavros Sachtouris
            try:
624 234954d1 Stavros Sachtouris
                upload_cb = progress_bar.get_generator('Overwritting blocks')
625 5bfe1cda Stavros Sachtouris
            except Exception:
626 5bfe1cda Stavros Sachtouris
                upload_cb = None
627 234954d1 Stavros Sachtouris
            self.client.overwrite_object(object=self.path,
628 234954d1 Stavros Sachtouris
                start=start,
629 234954d1 Stavros Sachtouris
                end=end,
630 234954d1 Stavros Sachtouris
                source_file=f,
631 234954d1 Stavros Sachtouris
                upload_cb=upload_cb)
632 7493ccb6 Stavros Sachtouris
        except ClientError as err:
633 852a22e7 Stavros Sachtouris
            progress_bar.finish()
634 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
635 852a22e7 Stavros Sachtouris
        finally:
636 852a22e7 Stavros Sachtouris
            progress_bar.finish()
637 7493ccb6 Stavros Sachtouris
638 234954d1 Stavros Sachtouris
639 d486baec Stavros Sachtouris
@command(pithos_cmds)
640 486f7af1 Stavros Sachtouris
class store_manifest(_store_container_command):
641 486f7af1 Stavros Sachtouris
    """Create a remote file with uploaded parts by manifestation"""
642 486f7af1 Stavros Sachtouris
643 2fe2672e Stavros Sachtouris
    arguments = dict(
644 2fe2672e Stavros Sachtouris
        etag=ValueArgument('check written data', '--etag'),
645 2fe2672e Stavros Sachtouris
        content_encoding=ValueArgument(
646 2fe2672e Stavros Sachtouris
            'set MIME content type',
647 2fe2672e Stavros Sachtouris
            '--content-encoding'),
648 2fe2672e Stavros Sachtouris
        content_disposition=ValueArgument(
649 2fe2672e Stavros Sachtouris
            'the presentation style of the object',
650 2fe2672e Stavros Sachtouris
            '--content-disposition'),
651 2fe2672e Stavros Sachtouris
        content_type=ValueArgument('specify content type', '--content-type'),
652 2fe2672e Stavros Sachtouris
        sharing=SharingArgument(
653 2fe2672e Stavros Sachtouris
            'define object sharing policy \n' +\
654 2fe2672e Stavros Sachtouris
            '    ( "read=user1,grp1,user2,... write=user1,grp2,..." )',
655 2fe2672e Stavros Sachtouris
            '--sharing'),
656 2fe2672e Stavros Sachtouris
        public=FlagArgument('make object publicly accessible', '--public')
657 2fe2672e Stavros Sachtouris
    )
658 234954d1 Stavros Sachtouris
659 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
660 234954d1 Stavros Sachtouris
        super(self.__class__,
661 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
662 7493ccb6 Stavros Sachtouris
        try:
663 2fe2672e Stavros Sachtouris
            self.client.create_object_by_manifestation(
664 2fe2672e Stavros Sachtouris
                self.path,
665 2fe2672e Stavros Sachtouris
                content_encoding=self['content_encoding'],
666 2fe2672e Stavros Sachtouris
                content_disposition=self['content_disposition'],
667 2fe2672e Stavros Sachtouris
                content_type=self['content_type'],
668 2fe2672e Stavros Sachtouris
                sharing=self['sharing'],
669 2fe2672e Stavros Sachtouris
                public=self['public'])
670 7493ccb6 Stavros Sachtouris
        except ClientError as err:
671 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
672 7493ccb6 Stavros Sachtouris
673 234954d1 Stavros Sachtouris
674 d486baec Stavros Sachtouris
@command(pithos_cmds)
675 7493ccb6 Stavros Sachtouris
class store_upload(_store_container_command):
676 7493ccb6 Stavros Sachtouris
    """Upload a file"""
677 7493ccb6 Stavros Sachtouris
678 2fe2672e Stavros Sachtouris
    arguments = dict(
679 2fe2672e Stavros Sachtouris
        use_hashes=FlagArgument(
680 2fe2672e Stavros Sachtouris
            'provide hashmap file instead of data',
681 2fe2672e Stavros Sachtouris
            '--use-hashes'),
682 2fe2672e Stavros Sachtouris
        etag=ValueArgument('check written data', '--etag'),
683 2fe2672e Stavros Sachtouris
        unchunked=FlagArgument('avoid chunked transfer mode', '--unchunked'),
684 2fe2672e Stavros Sachtouris
        content_encoding=ValueArgument(
685 2fe2672e Stavros Sachtouris
            'set MIME content type',
686 2fe2672e Stavros Sachtouris
            '--content-encoding'),
687 2fe2672e Stavros Sachtouris
        content_disposition=ValueArgument(
688 2fe2672e Stavros Sachtouris
            'specify objects presentation style',
689 2fe2672e Stavros Sachtouris
            '--content-disposition'),
690 2fe2672e Stavros Sachtouris
        content_type=ValueArgument('specify content type', '--content-type'),
691 2fe2672e Stavros Sachtouris
        sharing=SharingArgument(
692 2fe2672e Stavros Sachtouris
            help='define sharing object policy \n' +\
693 2fe2672e Stavros Sachtouris
            '( "read=user1,grp1,user2,... write=user1,grp2,... )',
694 2fe2672e Stavros Sachtouris
            parsed_name='--sharing'),
695 2fe2672e Stavros Sachtouris
        public=FlagArgument('make object publicly accessible', '--public'),
696 2fe2672e Stavros Sachtouris
        poolsize=IntArgument('set pool size', '--with-pool-size'),
697 2fe2672e Stavros Sachtouris
        progress_bar=ProgressBarArgument(
698 2fe2672e Stavros Sachtouris
            'do not show progress bar',
699 2fe2672e Stavros Sachtouris
            '--no-progress-bar',
700 2fe2672e Stavros Sachtouris
            default=False)
701 2fe2672e Stavros Sachtouris
    )
702 7493ccb6 Stavros Sachtouris
703 7493ccb6 Stavros Sachtouris
    def main(self, local_path, container____path__):
704 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
705 2fe2672e Stavros Sachtouris
        remote_path = self.path if self.path else local_path
706 2fe2672e Stavros Sachtouris
        poolsize = self['poolsize']
707 624ee36f Stavros Sachtouris
        if poolsize is not None:
708 cccff590 Stavros Sachtouris
            self.client.POOL_SIZE = int(poolsize)
709 2fe2672e Stavros Sachtouris
        params = dict(content_encoding=self['content_encoding'],
710 2fe2672e Stavros Sachtouris
            content_type=self['content_type'],
711 2fe2672e Stavros Sachtouris
            content_disposition=self['content_disposition'],
712 2fe2672e Stavros Sachtouris
            sharing=self['sharing'],
713 2fe2672e Stavros Sachtouris
            public=self['public'])
714 7493ccb6 Stavros Sachtouris
        try:
715 852a22e7 Stavros Sachtouris
            progress_bar = self.arguments['progress_bar']
716 852a22e7 Stavros Sachtouris
            hash_bar = progress_bar.clone()
717 e876ac62 Stavros Sachtouris
            with open(local_path, 'rb') as f:
718 2fe2672e Stavros Sachtouris
                if self['unchunked']:
719 2fe2672e Stavros Sachtouris
                    self.client.upload_object_unchunked(
720 2fe2672e Stavros Sachtouris
                        remote_path,
721 2fe2672e Stavros Sachtouris
                        f,
722 2fe2672e Stavros Sachtouris
                        etag=self['etag'],
723 2fe2672e Stavros Sachtouris
                        withHashFile=self['use_hashes'],
724 2fe2672e Stavros Sachtouris
                        **params)
725 7493ccb6 Stavros Sachtouris
                else:
726 2fe2672e Stavros Sachtouris
                    hash_cb = hash_bar.get_generator(
727 234954d1 Stavros Sachtouris
                        'Calculating block hashes')
728 234954d1 Stavros Sachtouris
                    upload_cb = progress_bar.get_generator('Uploading')
729 2fe2672e Stavros Sachtouris
                    self.client.upload_object(
730 2fe2672e Stavros Sachtouris
                        remote_path,
731 2fe2672e Stavros Sachtouris
                        f,
732 852a22e7 Stavros Sachtouris
                        hash_cb=hash_cb,
733 852a22e7 Stavros Sachtouris
                        upload_cb=upload_cb,
734 852a22e7 Stavros Sachtouris
                        **params)
735 852a22e7 Stavros Sachtouris
                    progress_bar.finish()
736 852a22e7 Stavros Sachtouris
                    hash_bar.finish()
737 7493ccb6 Stavros Sachtouris
        except ClientError as err:
738 852a22e7 Stavros Sachtouris
            progress_bar.finish()
739 852a22e7 Stavros Sachtouris
            hash_bar.finish()
740 83ba5545 Stavros Sachtouris
            raiseCLIError(err, '"%s" not accessible' % container____path__)
741 436f2ce1 Stavros Sachtouris
        except IOError as err:
742 852a22e7 Stavros Sachtouris
            progress_bar.finish()
743 852a22e7 Stavros Sachtouris
            hash_bar.finish()
744 43ee6ae1 Stavros Sachtouris
            raiseCLIError(err, 'Failed to read form file %s' % local_path, 2)
745 f364f960 Stavros Sachtouris
        print 'Upload completed'
746 7493ccb6 Stavros Sachtouris
747 234954d1 Stavros Sachtouris
748 d486baec Stavros Sachtouris
@command(pithos_cmds)
749 9ceec15a Stavros Sachtouris
class store_cat(_store_container_command):
750 9ceec15a Stavros Sachtouris
    """Print a file to console"""
751 9ceec15a Stavros Sachtouris
752 2fe2672e Stavros Sachtouris
    arguments = dict(
753 2fe2672e Stavros Sachtouris
        range=RangeArgument('show range of data', '--range'),
754 2fe2672e Stavros Sachtouris
        if_match=ValueArgument('show output if ETags match', '--if-match'),
755 2fe2672e Stavros Sachtouris
        if_none_match=ValueArgument(
756 2fe2672e Stavros Sachtouris
            'show output if ETags match',
757 2fe2672e Stavros Sachtouris
            '--if-none-match'),
758 2fe2672e Stavros Sachtouris
        if_modified_since=DateArgument(
759 2fe2672e Stavros Sachtouris
            'show output modified since then',
760 2fe2672e Stavros Sachtouris
            '--if-modified-since'),
761 2fe2672e Stavros Sachtouris
        if_unmodified_since=DateArgument(
762 2fe2672e Stavros Sachtouris
            'show output unmodified since then',
763 2fe2672e Stavros Sachtouris
            '--if-unmodified-since'),
764 2fe2672e Stavros Sachtouris
        object_version=ValueArgument(
765 2fe2672e Stavros Sachtouris
            'get the specific version',
766 2fe2672e Stavros Sachtouris
            '--object-version')
767 2fe2672e Stavros Sachtouris
    )
768 2fe2672e Stavros Sachtouris
769 9ceec15a Stavros Sachtouris
770 9ceec15a Stavros Sachtouris
    def main(self, container___path):
771 234954d1 Stavros Sachtouris
        super(self.__class__,
772 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
773 0238c167 Stavros Sachtouris
        try:
774 0238c167 Stavros Sachtouris
            self.client.download_object(self.path, stdout,
775 2fe2672e Stavros Sachtouris
            range=self['range'],
776 2fe2672e Stavros Sachtouris
            version=self['object_version'],
777 2fe2672e Stavros Sachtouris
            if_match=self['if_match'],
778 2fe2672e Stavros Sachtouris
            if_none_match=self['if_none_match'],
779 2fe2672e Stavros Sachtouris
            if_modified_since=self['if_modified_since'],
780 2fe2672e Stavros Sachtouris
            if_unmodified_since=self['if_unmodified_since'])
781 0238c167 Stavros Sachtouris
        except ClientError as err:
782 0238c167 Stavros Sachtouris
            raiseCLIError(err)
783 9ceec15a Stavros Sachtouris
784 234954d1 Stavros Sachtouris
785 d486baec Stavros Sachtouris
@command(pithos_cmds)
786 7493ccb6 Stavros Sachtouris
class store_download(_store_container_command):
787 7493ccb6 Stavros Sachtouris
    """Download a file"""
788 7493ccb6 Stavros Sachtouris
789 2fe2672e Stavros Sachtouris
    arguments = dict(
790 2fe2672e Stavros Sachtouris
        resume=FlagArgument('Resume instead of overwrite', '--resume'),
791 2fe2672e Stavros Sachtouris
        range=RangeArgument('show range of data', '--range'),
792 2fe2672e Stavros Sachtouris
        if_match=ValueArgument('show output if ETags match', '--if-match'),
793 2fe2672e Stavros Sachtouris
        if_none_match=ValueArgument(
794 2fe2672e Stavros Sachtouris
            'show output if ETags match',
795 2fe2672e Stavros Sachtouris
            '--if-none-match'),
796 2fe2672e Stavros Sachtouris
        if_modified_since=DateArgument(
797 2fe2672e Stavros Sachtouris
            'show output modified since then',
798 2fe2672e Stavros Sachtouris
            '--if-modified-since'),
799 2fe2672e Stavros Sachtouris
        if_unmodified_since=DateArgument(
800 2fe2672e Stavros Sachtouris
            'show output unmodified since then',
801 2fe2672e Stavros Sachtouris
            '--if-unmodified-since'),
802 2fe2672e Stavros Sachtouris
        object_version=ValueArgument(
803 2fe2672e Stavros Sachtouris
            'get the specific version',
804 2fe2672e Stavros Sachtouris
            '--object-version'),
805 2fe2672e Stavros Sachtouris
        poolsize=IntArgument('set pool size', '--with-pool-size'),
806 2fe2672e Stavros Sachtouris
        progress_bar=ProgressBarArgument(
807 2fe2672e Stavros Sachtouris
            'do not show progress bar',
808 2fe2672e Stavros Sachtouris
            '--no-progress-bar',
809 2fe2672e Stavros Sachtouris
            default=False)
810 2fe2672e Stavros Sachtouris
    )
811 7493ccb6 Stavros Sachtouris
812 9ceec15a Stavros Sachtouris
    def main(self, container___path, local_path):
813 234954d1 Stavros Sachtouris
        super(self.__class__,
814 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
815 7493ccb6 Stavros Sachtouris
816 234954d1 Stavros Sachtouris
        # setup output stream
817 7493ccb6 Stavros Sachtouris
        if local_path is None:
818 7493ccb6 Stavros Sachtouris
            out = stdout
819 7493ccb6 Stavros Sachtouris
        else:
820 7493ccb6 Stavros Sachtouris
            try:
821 2fe2672e Stavros Sachtouris
                if self['resume']:
822 234954d1 Stavros Sachtouris
                    out = open(local_path, 'rwb+')
823 fbfee225 Stavros Sachtouris
                else:
824 234954d1 Stavros Sachtouris
                    out = open(local_path, 'wb+')
825 7493ccb6 Stavros Sachtouris
            except IOError as err:
826 43ee6ae1 Stavros Sachtouris
                raiseCLIError(err, 'Cannot write to file %s' % local_path, 1)
827 2fe2672e Stavros Sachtouris
        poolsize = self['poolsize']
828 624ee36f Stavros Sachtouris
        if poolsize is not None:
829 cccff590 Stavros Sachtouris
            self.client.POOL_SIZE = int(poolsize)
830 b1713259 Stavros Sachtouris
831 7493ccb6 Stavros Sachtouris
        try:
832 852a22e7 Stavros Sachtouris
            progress_bar = self.arguments['progress_bar']
833 852a22e7 Stavros Sachtouris
            download_cb = progress_bar.get_generator('Downloading')
834 234954d1 Stavros Sachtouris
            self.client.download_object(self.path, out,
835 234954d1 Stavros Sachtouris
                download_cb=download_cb,
836 2fe2672e Stavros Sachtouris
                range=self['range'],
837 2fe2672e Stavros Sachtouris
                version=self['object_version'],
838 2fe2672e Stavros Sachtouris
                if_match=self['if_match'],
839 2fe2672e Stavros Sachtouris
                resume=self['resume'],
840 2fe2672e Stavros Sachtouris
                if_none_match=self['if_none_match'],
841 2fe2672e Stavros Sachtouris
                if_modified_since=self['if_modified_since'],
842 2fe2672e Stavros Sachtouris
                if_unmodified_since=self['if_unmodified_since'])
843 852a22e7 Stavros Sachtouris
            progress_bar.finish()
844 7493ccb6 Stavros Sachtouris
        except ClientError as err:
845 852a22e7 Stavros Sachtouris
            progress_bar.finish()
846 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
847 7493ccb6 Stavros Sachtouris
        except KeyboardInterrupt:
848 f27ed9a0 Stavros Sachtouris
            from threading import enumerate as activethreads
849 f27ed9a0 Stavros Sachtouris
            stdout.write('\nFinishing active threads ')
850 f27ed9a0 Stavros Sachtouris
            for thread in activethreads():
851 f27ed9a0 Stavros Sachtouris
                stdout.flush()
852 f27ed9a0 Stavros Sachtouris
                try:
853 f27ed9a0 Stavros Sachtouris
                    thread.join()
854 f27ed9a0 Stavros Sachtouris
                    stdout.write('.')
855 f27ed9a0 Stavros Sachtouris
                except RuntimeError:
856 f27ed9a0 Stavros Sachtouris
                    continue
857 852a22e7 Stavros Sachtouris
            progress_bar.finish()
858 7493ccb6 Stavros Sachtouris
            print('\ndownload canceled by user')
859 7493ccb6 Stavros Sachtouris
            if local_path is not None:
860 624ee36f Stavros Sachtouris
                print('to resume, re-run with --resume')
861 852a22e7 Stavros Sachtouris
        except Exception as e:
862 852a22e7 Stavros Sachtouris
            progress_bar.finish()
863 83ba5545 Stavros Sachtouris
            raiseCLIError(e)
864 7493ccb6 Stavros Sachtouris
        print
865 7493ccb6 Stavros Sachtouris
866 234954d1 Stavros Sachtouris
867 d486baec Stavros Sachtouris
@command(pithos_cmds)
868 7493ccb6 Stavros Sachtouris
class store_hashmap(_store_container_command):
869 7493ccb6 Stavros Sachtouris
    """Get the hashmap of an object"""
870 7493ccb6 Stavros Sachtouris
871 2fe2672e Stavros Sachtouris
    arguments = dict(
872 2fe2672e Stavros Sachtouris
        if_match=ValueArgument('show output if ETags match', '--if-match'),
873 2fe2672e Stavros Sachtouris
        if_none_match=ValueArgument(
874 2fe2672e Stavros Sachtouris
            'show output if ETags match',
875 2fe2672e Stavros Sachtouris
            '--if-none-match'),
876 2fe2672e Stavros Sachtouris
        if_modified_since=DateArgument(
877 2fe2672e Stavros Sachtouris
            'show output modified since then',
878 2fe2672e Stavros Sachtouris
            '--if-modified-since'),
879 2fe2672e Stavros Sachtouris
        if_unmodified_since=DateArgument(
880 2fe2672e Stavros Sachtouris
            'show output unmodified since then',
881 2fe2672e Stavros Sachtouris
            '--if-unmodified-since'),
882 2fe2672e Stavros Sachtouris
        object_version=ValueArgument(
883 2fe2672e Stavros Sachtouris
            'get the specific version',
884 2fe2672e Stavros Sachtouris
            '--object-version')
885 2fe2672e Stavros Sachtouris
    )
886 7493ccb6 Stavros Sachtouris
887 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
888 234954d1 Stavros Sachtouris
        super(self.__class__,
889 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
890 7493ccb6 Stavros Sachtouris
        try:
891 2fe2672e Stavros Sachtouris
            data = self.client.get_object_hashmap(
892 2fe2672e Stavros Sachtouris
                self.path,
893 2fe2672e Stavros Sachtouris
                version=self['object_version'],
894 2fe2672e Stavros Sachtouris
                if_match=self['if_match'],
895 2fe2672e Stavros Sachtouris
                if_none_match=self['if_none_match'],
896 2fe2672e Stavros Sachtouris
                if_modified_since=self['if_modified_since'],
897 2fe2672e Stavros Sachtouris
                if_unmodified_since=self['if_unmodified_since'])
898 7493ccb6 Stavros Sachtouris
        except ClientError as err:
899 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
900 7493ccb6 Stavros Sachtouris
        print_dict(data)
901 7493ccb6 Stavros Sachtouris
902 234954d1 Stavros Sachtouris
903 d486baec Stavros Sachtouris
@command(pithos_cmds)
904 7493ccb6 Stavros Sachtouris
class store_delete(_store_container_command):
905 7493ccb6 Stavros Sachtouris
    """Delete a container [or an object]"""
906 7493ccb6 Stavros Sachtouris
907 2fe2672e Stavros Sachtouris
    arguments = dict(
908 2fe2672e Stavros Sachtouris
        until=DateArgument( 'remove history until that date', '--until'),
909 2fe2672e Stavros Sachtouris
        recursive=FlagArgument(
910 234954d1 Stavros Sachtouris
            'empty dir or container and delete (if dir)',
911 234954d1 Stavros Sachtouris
            ('-r', '--recursive'))
912 2fe2672e Stavros Sachtouris
    )
913 2fe2672e Stavros Sachtouris
914 2fe2672e Stavros Sachtouris
    def __init__(self, arguments={}):
915 2fe2672e Stavros Sachtouris
        super(self.__class__, self).__init__(arguments)
916 2fe2672e Stavros Sachtouris
        self['delimiter']=DelimiterArgument(
917 2fe2672e Stavros Sachtouris
            self,
918 234954d1 Stavros Sachtouris
            parsed_name='--delimiter',
919 234954d1 Stavros Sachtouris
            help='delete objects prefixed with <object><delimiter>')
920 7493ccb6 Stavros Sachtouris
921 7493ccb6 Stavros Sachtouris
    def main(self, container____path__):
922 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
923 7493ccb6 Stavros Sachtouris
        try:
924 7493ccb6 Stavros Sachtouris
            if self.path is None:
925 2fe2672e Stavros Sachtouris
                self.client.del_container(
926 2fe2672e Stavros Sachtouris
                    until=self['until'],
927 2fe2672e Stavros Sachtouris
                    delimiter=self['delimiter'])
928 7493ccb6 Stavros Sachtouris
            else:
929 234954d1 Stavros Sachtouris
                # self.client.delete_object(self.path)
930 2fe2672e Stavros Sachtouris
                self.client.del_object(
931 2fe2672e Stavros Sachtouris
                    self.path,
932 2fe2672e Stavros Sachtouris
                    until=self['until'],
933 2fe2672e Stavros Sachtouris
                    delimiter=self['delimiter'])
934 7493ccb6 Stavros Sachtouris
        except ClientError as err:
935 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
936 7493ccb6 Stavros Sachtouris
937 234954d1 Stavros Sachtouris
938 d486baec Stavros Sachtouris
@command(pithos_cmds)
939 7493ccb6 Stavros Sachtouris
class store_purge(_store_container_command):
940 2fe2672e Stavros Sachtouris
    """Purge a container
941 2fe2672e Stavros Sachtouris
    To completely erase a container:
942 2fe2672e Stavros Sachtouris
    /store delete -r <container>
943 2fe2672e Stavros Sachtouris
    /store purge <container
944 2fe2672e Stavros Sachtouris
    """
945 234954d1 Stavros Sachtouris
946 7493ccb6 Stavros Sachtouris
    def main(self, container):
947 ebdecdc7 Stavros Sachtouris
        super(self.__class__, self).main(container)
948 7493ccb6 Stavros Sachtouris
        try:
949 7493ccb6 Stavros Sachtouris
            self.client.purge_container()
950 7493ccb6 Stavros Sachtouris
        except ClientError as err:
951 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
952 7493ccb6 Stavros Sachtouris
953 234954d1 Stavros Sachtouris
954 d486baec Stavros Sachtouris
@command(pithos_cmds)
955 7493ccb6 Stavros Sachtouris
class store_publish(_store_container_command):
956 2fe2672e Stavros Sachtouris
    """Publish the object and print the public url"""
957 7493ccb6 Stavros Sachtouris
958 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
959 234954d1 Stavros Sachtouris
        super(self.__class__,
960 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
961 7493ccb6 Stavros Sachtouris
        try:
962 5260a313 Stavros Sachtouris
            url = self.client.publish_object(self.path)
963 7493ccb6 Stavros Sachtouris
        except ClientError as err:
964 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
965 5260a313 Stavros Sachtouris
        print(url)
966 7493ccb6 Stavros Sachtouris
967 234954d1 Stavros Sachtouris
968 d486baec Stavros Sachtouris
@command(pithos_cmds)
969 7493ccb6 Stavros Sachtouris
class store_unpublish(_store_container_command):
970 7493ccb6 Stavros Sachtouris
    """Unpublish an object"""
971 7493ccb6 Stavros Sachtouris
972 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
973 234954d1 Stavros Sachtouris
        super(self.__class__,
974 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
975 7493ccb6 Stavros Sachtouris
        try:
976 7493ccb6 Stavros Sachtouris
            self.client.unpublish_object(self.path)
977 7493ccb6 Stavros Sachtouris
        except ClientError as err:
978 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
979 7493ccb6 Stavros Sachtouris
980 234954d1 Stavros Sachtouris
981 d486baec Stavros Sachtouris
@command(pithos_cmds)
982 3dabe5d2 Stavros Sachtouris
class store_permissions(_store_container_command):
983 befed235 Stavros Sachtouris
    """Get object read / write permissions """
984 7493ccb6 Stavros Sachtouris
985 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
986 234954d1 Stavros Sachtouris
        super(self.__class__,
987 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
988 7493ccb6 Stavros Sachtouris
        try:
989 7493ccb6 Stavros Sachtouris
            reply = self.client.get_object_sharing(self.path)
990 7493ccb6 Stavros Sachtouris
            print_dict(reply)
991 7493ccb6 Stavros Sachtouris
        except ClientError as err:
992 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
993 7493ccb6 Stavros Sachtouris
994 234954d1 Stavros Sachtouris
995 d486baec Stavros Sachtouris
@command(pithos_cmds)
996 3dabe5d2 Stavros Sachtouris
class store_setpermissions(_store_container_command):
997 3dabe5d2 Stavros Sachtouris
    """Set sharing permissions """
998 7493ccb6 Stavros Sachtouris
999 3dabe5d2 Stavros Sachtouris
    def format_permition_dict(self, permissions):
1000 7493ccb6 Stavros Sachtouris
        read = False
1001 7493ccb6 Stavros Sachtouris
        write = False
1002 3dabe5d2 Stavros Sachtouris
        for perms in permissions:
1003 7493ccb6 Stavros Sachtouris
            splstr = perms.split('=')
1004 7493ccb6 Stavros Sachtouris
            if 'read' == splstr[0]:
1005 7493ccb6 Stavros Sachtouris
                read = [user_or_group.strip() \
1006 7493ccb6 Stavros Sachtouris
                for user_or_group in splstr[1].split(',')]
1007 7493ccb6 Stavros Sachtouris
            elif 'write' == splstr[0]:
1008 7493ccb6 Stavros Sachtouris
                write = [user_or_group.strip() \
1009 7493ccb6 Stavros Sachtouris
                for user_or_group in splstr[1].split(',')]
1010 7493ccb6 Stavros Sachtouris
            else:
1011 7493ccb6 Stavros Sachtouris
                read = False
1012 7493ccb6 Stavros Sachtouris
                write = False
1013 7493ccb6 Stavros Sachtouris
        if not read and not write:
1014 43ee6ae1 Stavros Sachtouris
            raiseCLIError(None,
1015 43ee6ae1 Stavros Sachtouris
            'Usage:\tread=<groups,users> write=<groups,users>')
1016 234954d1 Stavros Sachtouris
        return (read, write)
1017 7493ccb6 Stavros Sachtouris
1018 3dabe5d2 Stavros Sachtouris
    def main(self, container___path, *permissions):
1019 234954d1 Stavros Sachtouris
        super(self.__class__,
1020 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
1021 3dabe5d2 Stavros Sachtouris
        (read, write) = self.format_permition_dict(permissions)
1022 7493ccb6 Stavros Sachtouris
        try:
1023 7493ccb6 Stavros Sachtouris
            self.client.set_object_sharing(self.path,
1024 7493ccb6 Stavros Sachtouris
                read_permition=read, write_permition=write)
1025 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1026 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1027 7493ccb6 Stavros Sachtouris
1028 234954d1 Stavros Sachtouris
1029 d486baec Stavros Sachtouris
@command(pithos_cmds)
1030 3dabe5d2 Stavros Sachtouris
class store_delpermissions(_store_container_command):
1031 3dabe5d2 Stavros Sachtouris
    """Delete all sharing permissions"""
1032 7493ccb6 Stavros Sachtouris
1033 7493ccb6 Stavros Sachtouris
    def main(self, container___path):
1034 234954d1 Stavros Sachtouris
        super(self.__class__,
1035 234954d1 Stavros Sachtouris
            self).main(container___path, path_is_optional=False)
1036 7493ccb6 Stavros Sachtouris
        try:
1037 7493ccb6 Stavros Sachtouris
            self.client.del_object_sharing(self.path)
1038 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1039 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1040 7493ccb6 Stavros Sachtouris
1041 234954d1 Stavros Sachtouris
1042 d486baec Stavros Sachtouris
@command(pithos_cmds)
1043 7493ccb6 Stavros Sachtouris
class store_info(_store_container_command):
1044 7493ccb6 Stavros Sachtouris
    """Get information for account [, container [or object]]"""
1045 7493ccb6 Stavros Sachtouris
1046 2fe2672e Stavros Sachtouris
    arguments = dict(
1047 2fe2672e Stavros Sachtouris
        object_version=ValueArgument(
1048 2fe2672e Stavros Sachtouris
            'show specific version \ (applies only for objects)',
1049 2fe2672e Stavros Sachtouris
            '--object-version')
1050 2fe2672e Stavros Sachtouris
    )
1051 6ac7f90f Stavros Sachtouris
1052 7493ccb6 Stavros Sachtouris
    def main(self, container____path__=None):
1053 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
1054 7493ccb6 Stavros Sachtouris
        try:
1055 7493ccb6 Stavros Sachtouris
            if self.container is None:
1056 7493ccb6 Stavros Sachtouris
                reply = self.client.get_account_info()
1057 7493ccb6 Stavros Sachtouris
            elif self.path is None:
1058 7493ccb6 Stavros Sachtouris
                reply = self.client.get_container_info(self.container)
1059 7493ccb6 Stavros Sachtouris
            else:
1060 2fe2672e Stavros Sachtouris
                reply = self.client.get_object_info(
1061 2fe2672e Stavros Sachtouris
                    self.path,
1062 2fe2672e Stavros Sachtouris
                    version=self['object_version'])
1063 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1064 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1065 7493ccb6 Stavros Sachtouris
        print_dict(reply)
1066 7493ccb6 Stavros Sachtouris
1067 234954d1 Stavros Sachtouris
1068 d486baec Stavros Sachtouris
@command(pithos_cmds)
1069 7493ccb6 Stavros Sachtouris
class store_meta(_store_container_command):
1070 7493ccb6 Stavros Sachtouris
    """Get custom meta-content for account [, container [or object]]"""
1071 7493ccb6 Stavros Sachtouris
1072 2fe2672e Stavros Sachtouris
    arguments = dict(
1073 2fe2672e Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
1074 2fe2672e Stavros Sachtouris
        until=DateArgument('show metadata until then', '--until'),
1075 2fe2672e Stavros Sachtouris
        object_version=ValueArgument(
1076 2fe2672e Stavros Sachtouris
            'show specific version \ (applies only for objects)',
1077 2fe2672e Stavros Sachtouris
            '--object-version')
1078 2fe2672e Stavros Sachtouris
    )
1079 7493ccb6 Stavros Sachtouris
1080 234954d1 Stavros Sachtouris
    def main(self, container____path__=None):
1081 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
1082 7493ccb6 Stavros Sachtouris
1083 2fe2672e Stavros Sachtouris
        detail = self['detail']
1084 7493ccb6 Stavros Sachtouris
        try:
1085 2fe2672e Stavros Sachtouris
            until = self['until']
1086 7493ccb6 Stavros Sachtouris
            if self.container is None:
1087 7493ccb6 Stavros Sachtouris
                print(bold(self.client.account))
1088 7493ccb6 Stavros Sachtouris
                if detail:
1089 234954d1 Stavros Sachtouris
                    reply = self.client.get_account_info(until=until)
1090 7493ccb6 Stavros Sachtouris
                else:
1091 234954d1 Stavros Sachtouris
                    reply = self.client.get_account_meta(until=until)
1092 7493ccb6 Stavros Sachtouris
                    reply = pretty_keys(reply, '-')
1093 7493ccb6 Stavros Sachtouris
            elif self.path is None:
1094 d486baec Stavros Sachtouris
                print(bold('%s: %s' % (self.client.account, self.container)))
1095 7493ccb6 Stavros Sachtouris
                if detail:
1096 234954d1 Stavros Sachtouris
                    reply = self.client.get_container_info(until=until)
1097 7493ccb6 Stavros Sachtouris
                else:
1098 234954d1 Stavros Sachtouris
                    cmeta = self.client.get_container_meta(until=until)
1099 234954d1 Stavros Sachtouris
                    ometa = self.client.get_container_object_meta(until=until)
1100 234954d1 Stavros Sachtouris
                    reply = {'container-meta': pretty_keys(cmeta, '-'),
1101 234954d1 Stavros Sachtouris
                        'object-meta': pretty_keys(ometa, '-')}
1102 7493ccb6 Stavros Sachtouris
            else:
1103 d486baec Stavros Sachtouris
                print(bold('%s: %s:%s'\
1104 d486baec Stavros Sachtouris
                    % (self.client.account, self.container, self.path)))
1105 2fe2672e Stavros Sachtouris
                version = self['object_version']
1106 7493ccb6 Stavros Sachtouris
                if detail:
1107 234954d1 Stavros Sachtouris
                    reply = self.client.get_object_info(self.path,
1108 234954d1 Stavros Sachtouris
                        version=version)
1109 7493ccb6 Stavros Sachtouris
                else:
1110 234954d1 Stavros Sachtouris
                    reply = self.client.get_object_meta(self.path,
1111 234954d1 Stavros Sachtouris
                        version=version)
1112 7493ccb6 Stavros Sachtouris
                    reply = pretty_keys(pretty_keys(reply, '-'))
1113 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1114 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1115 7493ccb6 Stavros Sachtouris
        print_dict(reply)
1116 7493ccb6 Stavros Sachtouris
1117 234954d1 Stavros Sachtouris
1118 d486baec Stavros Sachtouris
@command(pithos_cmds)
1119 7493ccb6 Stavros Sachtouris
class store_setmeta(_store_container_command):
1120 7493ccb6 Stavros Sachtouris
    """Set a new metadatum for account [, container [or object]]"""
1121 7493ccb6 Stavros Sachtouris
1122 7493ccb6 Stavros Sachtouris
    def main(self, metakey___metaval, container____path__=None):
1123 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
1124 7493ccb6 Stavros Sachtouris
        try:
1125 7493ccb6 Stavros Sachtouris
            metakey, metavalue = metakey___metaval.split(':')
1126 83ba5545 Stavros Sachtouris
        except ValueError as err:
1127 83ba5545 Stavros Sachtouris
            raiseCLIError(err, 'Usage:  metakey:metavalue', importance=1)
1128 7493ccb6 Stavros Sachtouris
        try:
1129 7493ccb6 Stavros Sachtouris
            if self.container is None:
1130 234954d1 Stavros Sachtouris
                self.client.set_account_meta({metakey: metavalue})
1131 7493ccb6 Stavros Sachtouris
            elif self.path is None:
1132 234954d1 Stavros Sachtouris
                self.client.set_container_meta({metakey: metavalue})
1133 7493ccb6 Stavros Sachtouris
            else:
1134 234954d1 Stavros Sachtouris
                self.client.set_object_meta(self.path, {metakey: metavalue})
1135 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1136 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1137 7493ccb6 Stavros Sachtouris
1138 234954d1 Stavros Sachtouris
1139 d486baec Stavros Sachtouris
@command(pithos_cmds)
1140 7493ccb6 Stavros Sachtouris
class store_delmeta(_store_container_command):
1141 7493ccb6 Stavros Sachtouris
    """Delete an existing metadatum of account [, container [or object]]"""
1142 7493ccb6 Stavros Sachtouris
1143 7493ccb6 Stavros Sachtouris
    def main(self, metakey, container____path__=None):
1144 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main(container____path__)
1145 7493ccb6 Stavros Sachtouris
        try:
1146 7493ccb6 Stavros Sachtouris
            if self.container is None:
1147 7493ccb6 Stavros Sachtouris
                self.client.del_account_meta(metakey)
1148 7493ccb6 Stavros Sachtouris
            elif self.path is None:
1149 7493ccb6 Stavros Sachtouris
                self.client.del_container_meta(metakey)
1150 7493ccb6 Stavros Sachtouris
            else:
1151 bc223d91 Stavros Sachtouris
                self.client.del_object_meta(self.path, metakey)
1152 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1153 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1154 7493ccb6 Stavros Sachtouris
1155 234954d1 Stavros Sachtouris
1156 d486baec Stavros Sachtouris
@command(pithos_cmds)
1157 7493ccb6 Stavros Sachtouris
class store_quota(_store_account_command):
1158 7493ccb6 Stavros Sachtouris
    """Get  quota for account [or container]"""
1159 7493ccb6 Stavros Sachtouris
1160 234954d1 Stavros Sachtouris
    def main(self, container=None):
1161 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1162 7493ccb6 Stavros Sachtouris
        try:
1163 7493ccb6 Stavros Sachtouris
            if container is None:
1164 7493ccb6 Stavros Sachtouris
                reply = self.client.get_account_quota()
1165 7493ccb6 Stavros Sachtouris
            else:
1166 7493ccb6 Stavros Sachtouris
                reply = self.client.get_container_quota(container)
1167 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1168 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1169 7493ccb6 Stavros Sachtouris
        print_dict(reply)
1170 7493ccb6 Stavros Sachtouris
1171 234954d1 Stavros Sachtouris
1172 d486baec Stavros Sachtouris
@command(pithos_cmds)
1173 7493ccb6 Stavros Sachtouris
class store_setquota(_store_account_command):
1174 7493ccb6 Stavros Sachtouris
    """Set new quota (in KB) for account [or container]"""
1175 7493ccb6 Stavros Sachtouris
1176 234954d1 Stavros Sachtouris
    def main(self, quota, container=None):
1177 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1178 7493ccb6 Stavros Sachtouris
        try:
1179 7493ccb6 Stavros Sachtouris
            if container is None:
1180 7493ccb6 Stavros Sachtouris
                self.client.set_account_quota(quota)
1181 7493ccb6 Stavros Sachtouris
            else:
1182 7493ccb6 Stavros Sachtouris
                self.client.container = container
1183 7493ccb6 Stavros Sachtouris
                self.client.set_container_quota(quota)
1184 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1185 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1186 7493ccb6 Stavros Sachtouris
1187 234954d1 Stavros Sachtouris
1188 d486baec Stavros Sachtouris
@command(pithos_cmds)
1189 7493ccb6 Stavros Sachtouris
class store_versioning(_store_account_command):
1190 7493ccb6 Stavros Sachtouris
    """Get  versioning for account [or container ]"""
1191 7493ccb6 Stavros Sachtouris
1192 234954d1 Stavros Sachtouris
    def main(self, container=None):
1193 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1194 7493ccb6 Stavros Sachtouris
        try:
1195 7493ccb6 Stavros Sachtouris
            if container is None:
1196 7493ccb6 Stavros Sachtouris
                reply = self.client.get_account_versioning()
1197 7493ccb6 Stavros Sachtouris
            else:
1198 7493ccb6 Stavros Sachtouris
                reply = self.client.get_container_versioning(container)
1199 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1200 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1201 7493ccb6 Stavros Sachtouris
        print_dict(reply)
1202 7493ccb6 Stavros Sachtouris
1203 234954d1 Stavros Sachtouris
1204 d486baec Stavros Sachtouris
@command(pithos_cmds)
1205 7493ccb6 Stavros Sachtouris
class store_setversioning(_store_account_command):
1206 7493ccb6 Stavros Sachtouris
    """Set new versioning (auto, none) for account [or container]"""
1207 7493ccb6 Stavros Sachtouris
1208 234954d1 Stavros Sachtouris
    def main(self, versioning, container=None):
1209 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1210 7493ccb6 Stavros Sachtouris
        try:
1211 7493ccb6 Stavros Sachtouris
            if container is None:
1212 7493ccb6 Stavros Sachtouris
                self.client.set_account_versioning(versioning)
1213 7493ccb6 Stavros Sachtouris
            else:
1214 7493ccb6 Stavros Sachtouris
                self.client.container = container
1215 7493ccb6 Stavros Sachtouris
                self.client.set_container_versioning(versioning)
1216 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1217 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1218 7493ccb6 Stavros Sachtouris
1219 234954d1 Stavros Sachtouris
1220 d486baec Stavros Sachtouris
@command(pithos_cmds)
1221 7493ccb6 Stavros Sachtouris
class store_group(_store_account_command):
1222 7493ccb6 Stavros Sachtouris
    """Get user groups details for account"""
1223 7493ccb6 Stavros Sachtouris
1224 7493ccb6 Stavros Sachtouris
    def main(self):
1225 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1226 7493ccb6 Stavros Sachtouris
        try:
1227 7493ccb6 Stavros Sachtouris
            reply = self.client.get_account_group()
1228 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1229 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1230 7493ccb6 Stavros Sachtouris
        print_dict(reply)
1231 7493ccb6 Stavros Sachtouris
1232 234954d1 Stavros Sachtouris
1233 d486baec Stavros Sachtouris
@command(pithos_cmds)
1234 7493ccb6 Stavros Sachtouris
class store_setgroup(_store_account_command):
1235 7493ccb6 Stavros Sachtouris
    """Create/update a new user group on account"""
1236 7493ccb6 Stavros Sachtouris
1237 7493ccb6 Stavros Sachtouris
    def main(self, groupname, *users):
1238 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1239 7493ccb6 Stavros Sachtouris
        try:
1240 7493ccb6 Stavros Sachtouris
            self.client.set_account_group(groupname, users)
1241 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1242 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1243 7493ccb6 Stavros Sachtouris
1244 234954d1 Stavros Sachtouris
1245 d486baec Stavros Sachtouris
@command(pithos_cmds)
1246 7493ccb6 Stavros Sachtouris
class store_delgroup(_store_account_command):
1247 7493ccb6 Stavros Sachtouris
    """Delete a user group on an account"""
1248 7493ccb6 Stavros Sachtouris
1249 7493ccb6 Stavros Sachtouris
    def main(self, groupname):
1250 7493ccb6 Stavros Sachtouris
        super(self.__class__, self).main()
1251 7493ccb6 Stavros Sachtouris
        try:
1252 7493ccb6 Stavros Sachtouris
            self.client.del_account_group(groupname)
1253 7493ccb6 Stavros Sachtouris
        except ClientError as err:
1254 7493ccb6 Stavros Sachtouris
            raiseCLIError(err)
1255 a23f6ffe Stavros Sachtouris
1256 234954d1 Stavros Sachtouris
1257 d486baec Stavros Sachtouris
@command(pithos_cmds)
1258 a23f6ffe Stavros Sachtouris
class store_sharers(_store_account_command):
1259 a23f6ffe Stavros Sachtouris
    """List the accounts that share objects with default account"""
1260 a23f6ffe Stavros Sachtouris
1261 2fe2672e Stavros Sachtouris
    arguments = dict(
1262 2fe2672e Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
1263 2fe2672e Stavros Sachtouris
        marker=ValueArgument('show output greater then marker', '--marker')
1264 2fe2672e Stavros Sachtouris
    )
1265 a23f6ffe Stavros Sachtouris
1266 a23f6ffe Stavros Sachtouris
    def main(self):
1267 a23f6ffe Stavros Sachtouris
        super(self.__class__, self).main()
1268 a23f6ffe Stavros Sachtouris
        try:
1269 2fe2672e Stavros Sachtouris
            marker = self['marker']
1270 234954d1 Stavros Sachtouris
            accounts = self.client.get_sharing_accounts(marker=marker)
1271 a23f6ffe Stavros Sachtouris
        except ClientError as err:
1272 a23f6ffe Stavros Sachtouris
            raiseCLIError(err)
1273 a23f6ffe Stavros Sachtouris
1274 a23f6ffe Stavros Sachtouris
        for acc in accounts:
1275 234954d1 Stavros Sachtouris
            stdout.write(bold(acc['name']) + ' ')
1276 2fe2672e Stavros Sachtouris
            if self['detail']:
1277 f551841a Stavros Sachtouris
                print_dict(acc, exclude='name', ident=4)
1278 2fe2672e Stavros Sachtouris
        if not self['detail']:
1279 a23f6ffe Stavros Sachtouris
            print
1280 38dc5d2f Stavros Sachtouris
1281 234954d1 Stavros Sachtouris
1282 d486baec Stavros Sachtouris
@command(pithos_cmds)
1283 38dc5d2f Stavros Sachtouris
class store_versions(_store_container_command):
1284 38dc5d2f Stavros Sachtouris
    """Get the version list of an object"""
1285 38dc5d2f Stavros Sachtouris
1286 38dc5d2f Stavros Sachtouris
    def main(self, container___path):
1287 38dc5d2f Stavros Sachtouris
        super(store_versions, self).main(container___path)
1288 38dc5d2f Stavros Sachtouris
        try:
1289 38dc5d2f Stavros Sachtouris
            versions = self.client.get_object_versionlist(self.path)
1290 38dc5d2f Stavros Sachtouris
        except ClientError as err:
1291 83ba5545 Stavros Sachtouris
            raiseCLIError(err)
1292 38dc5d2f Stavros Sachtouris
1293 234954d1 Stavros Sachtouris
        print('%s:%s versions' % (self.container, self.path))
1294 38dc5d2f Stavros Sachtouris
        for vitem in versions:
1295 38dc5d2f Stavros Sachtouris
            t = localtime(float(vitem[1]))
1296 38dc5d2f Stavros Sachtouris
            vid = bold(unicode(vitem[0]))
1297 234954d1 Stavros Sachtouris
            print('\t%s \t(%s)' % (vid, strftime('%d-%m-%Y %H:%M:%S', t)))