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