root / snf-pithos-tools / pithos / tools / sh.py @ db117cac
History | View | Annotate | Download (32.9 kB)
1 | cfac048c | Giorgos Verigakis | #!/usr/bin/env python
|
---|---|---|---|
2 | cfac048c | Giorgos Verigakis | |
3 | 2e662088 | Antony Chazapis | # Copyright 2011-2012 GRNET S.A. All rights reserved.
|
4 | a4c10cbc | Sofia Papagiannaki | #
|
5 | a4c10cbc | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
6 | a4c10cbc | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
7 | a4c10cbc | Sofia Papagiannaki | # conditions are met:
|
8 | a4c10cbc | Sofia Papagiannaki | #
|
9 | a4c10cbc | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
10 | a4c10cbc | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
11 | a4c10cbc | Sofia Papagiannaki | # disclaimer.
|
12 | a4c10cbc | Sofia Papagiannaki | #
|
13 | a4c10cbc | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
14 | a4c10cbc | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
15 | a4c10cbc | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
16 | a4c10cbc | Sofia Papagiannaki | # provided with the distribution.
|
17 | a4c10cbc | Sofia Papagiannaki | #
|
18 | a4c10cbc | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
19 | a4c10cbc | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20 | a4c10cbc | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
21 | a4c10cbc | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
22 | a4c10cbc | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23 | a4c10cbc | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24 | a4c10cbc | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
25 | a4c10cbc | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
26 | a4c10cbc | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
27 | a4c10cbc | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
28 | a4c10cbc | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29 | a4c10cbc | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
30 | a4c10cbc | Sofia Papagiannaki | #
|
31 | a4c10cbc | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
32 | a4c10cbc | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
33 | a4c10cbc | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
34 | a4c10cbc | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
35 | a4c10cbc | Sofia Papagiannaki | |
36 | cfac048c | Giorgos Verigakis | from getpass import getuser |
37 | cfac048c | Giorgos Verigakis | from optparse import OptionParser |
38 | bcb7c5a8 | Sofia Papagiannaki | from os import environ |
39 | f07c5a53 | Sofia Papagiannaki | from sys import argv, exit, stdin, stdout |
40 | d2d5c360 | Sofia Papagiannaki | from datetime import datetime |
41 | 5a96180b | Antony Chazapis | |
42 | 6e147ecc | Antony Chazapis | from pithos.tools.lib.client import Pithos_Client, Fault |
43 | 6e147ecc | Antony Chazapis | from pithos.tools.lib.util import get_user, get_auth, get_url |
44 | 6e147ecc | Antony Chazapis | from pithos.tools.lib.transfer import upload, download |
45 | cfac048c | Giorgos Verigakis | |
46 | cfac048c | Giorgos Verigakis | import json |
47 | cfac048c | Giorgos Verigakis | import logging |
48 | f07c5a53 | Sofia Papagiannaki | import types |
49 | d2d5c360 | Sofia Papagiannaki | import re |
50 | d2d5c360 | Sofia Papagiannaki | import time as _time |
51 | bcb7c5a8 | Sofia Papagiannaki | import os |
52 | cfac048c | Giorgos Verigakis | |
53 | cfac048c | Giorgos Verigakis | _cli_commands = {} |
54 | cfac048c | Giorgos Verigakis | |
55 | cfac048c | Giorgos Verigakis | def cli_command(*args): |
56 | cfac048c | Giorgos Verigakis | def decorator(cls): |
57 | cfac048c | Giorgos Verigakis | cls.commands = args |
58 | cfac048c | Giorgos Verigakis | for name in args: |
59 | cfac048c | Giorgos Verigakis | _cli_commands[name] = cls |
60 | cfac048c | Giorgos Verigakis | return cls
|
61 | cfac048c | Giorgos Verigakis | return decorator
|
62 | cfac048c | Giorgos Verigakis | |
63 | cfac048c | Giorgos Verigakis | def class_for_cli_command(name): |
64 | cfac048c | Giorgos Verigakis | return _cli_commands[name]
|
65 | cfac048c | Giorgos Verigakis | |
66 | cfac048c | Giorgos Verigakis | class Command(object): |
67 | 10998c60 | Sofia Papagiannaki | syntax = ''
|
68 | 10998c60 | Sofia Papagiannaki | |
69 | a2defd86 | Sofia Papagiannaki | def __init__(self, name, argv): |
70 | a2defd86 | Sofia Papagiannaki | parser = OptionParser('%%prog %s [options] %s' % (name, self.syntax)) |
71 | 96738a78 | Sofia Papagiannaki | parser.add_option('--url', dest='url', metavar='URL', |
72 | 2a0d6ae0 | Sofia Papagiannaki | default=get_url(), help='server URL (currently: %s)' % get_url())
|
73 | 2a0d6ae0 | Sofia Papagiannaki | parser.add_option('--user', dest='user', metavar='USER', |
74 | a5149fd0 | Sofia Papagiannaki | default=get_user(), |
75 | 2a0d6ae0 | Sofia Papagiannaki | help='account USER (currently: %s)' % get_user())
|
76 | 2a0d6ae0 | Sofia Papagiannaki | parser.add_option('--token', dest='token', metavar='TOKEN', |
77 | a5149fd0 | Sofia Papagiannaki | default=get_auth(), |
78 | 2a0d6ae0 | Sofia Papagiannaki | help='account TOKEN (currently: %s)' % get_auth())
|
79 | f07c5a53 | Sofia Papagiannaki | parser.add_option('-v', action='store_true', dest='verbose', |
80 | 2a0d6ae0 | Sofia Papagiannaki | default=False, help='verbose output') |
81 | f07c5a53 | Sofia Papagiannaki | parser.add_option('-d', action='store_true', dest='debug', |
82 | 2a0d6ae0 | Sofia Papagiannaki | default=False, help='debug output') |
83 | cfac048c | Giorgos Verigakis | self.add_options(parser)
|
84 | cfac048c | Giorgos Verigakis | options, args = parser.parse_args(argv) |
85 | cfac048c | Giorgos Verigakis | |
86 | cfac048c | Giorgos Verigakis | # Add options to self
|
87 | cfac048c | Giorgos Verigakis | for opt in parser.option_list: |
88 | cfac048c | Giorgos Verigakis | key = opt.dest |
89 | cfac048c | Giorgos Verigakis | if key:
|
90 | cfac048c | Giorgos Verigakis | val = getattr(options, key)
|
91 | cfac048c | Giorgos Verigakis | setattr(self, key, val) |
92 | cfac048c | Giorgos Verigakis | |
93 | 09fd65c7 | Sofia Papagiannaki | self.client = Pithos_Client(self.url, self.token, self.user, self.verbose, |
94 | f07c5a53 | Sofia Papagiannaki | self.debug)
|
95 | cfac048c | Giorgos Verigakis | |
96 | cfac048c | Giorgos Verigakis | self.parser = parser
|
97 | cfac048c | Giorgos Verigakis | self.args = args
|
98 | 25c3841c | Sofia Papagiannaki | |
99 | 25c3841c | Sofia Papagiannaki | def _build_args(self, attrs): |
100 | 25c3841c | Sofia Papagiannaki | args = {} |
101 | 25c3841c | Sofia Papagiannaki | for a in [a for a in attrs if getattr(self, a)]: |
102 | 25c3841c | Sofia Papagiannaki | args[a] = getattr(self, a) |
103 | 25c3841c | Sofia Papagiannaki | return args
|
104 | 25c3841c | Sofia Papagiannaki | |
105 | cfac048c | Giorgos Verigakis | def add_options(self, parser): |
106 | cfac048c | Giorgos Verigakis | pass
|
107 | f7ab99df | Sofia Papagiannaki | |
108 | cfac048c | Giorgos Verigakis | def execute(self, *args): |
109 | cfac048c | Giorgos Verigakis | pass
|
110 | cfac048c | Giorgos Verigakis | |
111 | cfac048c | Giorgos Verigakis | @cli_command('list', 'ls') |
112 | cfac048c | Giorgos Verigakis | class List(Command): |
113 | f07c5a53 | Sofia Papagiannaki | syntax = '[<container>[/<object>]]'
|
114 | cfac048c | Giorgos Verigakis | description = 'list containers or objects'
|
115 | cfac048c | Giorgos Verigakis | |
116 | cfac048c | Giorgos Verigakis | def add_options(self, parser): |
117 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('-l', action='store_true', dest='detail', |
118 | 3f5b02c7 | Sofia Papagiannaki | default=False, help='show detailed output') |
119 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('-n', action='store', type='int', dest='limit', |
120 | 25c3841c | Sofia Papagiannaki | default=10000, help='show limited output') |
121 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--marker', action='store', type='str', |
122 | 3f5b02c7 | Sofia Papagiannaki | dest='marker', default=None, |
123 | 3f5b02c7 | Sofia Papagiannaki | help='show output greater then marker')
|
124 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--prefix', action='store', type='str', |
125 | 3f5b02c7 | Sofia Papagiannaki | dest='prefix', default=None, |
126 | 3f5b02c7 | Sofia Papagiannaki | help='show output starting with prefix')
|
127 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--delimiter', action='store', type='str', |
128 | 3f5b02c7 | Sofia Papagiannaki | dest='delimiter', default=None, |
129 | 3f5b02c7 | Sofia Papagiannaki | help='show output up to the delimiter')
|
130 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--path', action='store', type='str', |
131 | 3f5b02c7 | Sofia Papagiannaki | dest='path', default=None, |
132 | 3f5b02c7 | Sofia Papagiannaki | help='show output starting with prefix up to /')
|
133 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--meta', action='store', type='str', |
134 | 3f5b02c7 | Sofia Papagiannaki | dest='meta', default=None, |
135 | 3f5b02c7 | Sofia Papagiannaki | help='show output having the specified meta keys')
|
136 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--if-modified-since', action='store', type='str', |
137 | 3f5b02c7 | Sofia Papagiannaki | dest='if_modified_since', default=None, |
138 | 3f5b02c7 | Sofia Papagiannaki | help='show output if modified since then')
|
139 | 3f5b02c7 | Sofia Papagiannaki | parser.add_option('--if-unmodified-since', action='store', type='str', |
140 | 3f5b02c7 | Sofia Papagiannaki | dest='if_unmodified_since', default=None, |
141 | 3f5b02c7 | Sofia Papagiannaki | help='show output if not modified since then')
|
142 | d2d5c360 | Sofia Papagiannaki | parser.add_option('--until', action='store', dest='until', |
143 | f0eacc2c | Sofia Papagiannaki | default=None, help='show metadata until that date') |
144 | d2d5c360 | Sofia Papagiannaki | parser.add_option('--format', action='store', dest='format', |
145 | d2d5c360 | Sofia Papagiannaki | default='%d/%m/%Y', help='format to parse until date') |
146 | f7ab99df | Sofia Papagiannaki | |
147 | cfac048c | Giorgos Verigakis | def execute(self, container=None): |
148 | cfac048c | Giorgos Verigakis | if container:
|
149 | cfac048c | Giorgos Verigakis | self.list_objects(container)
|
150 | cfac048c | Giorgos Verigakis | else:
|
151 | cfac048c | Giorgos Verigakis | self.list_containers()
|
152 | f7ab99df | Sofia Papagiannaki | |
153 | cfac048c | Giorgos Verigakis | def list_containers(self): |
154 | f0eacc2c | Sofia Papagiannaki | attrs = ['limit', 'marker', 'if_modified_since', |
155 | 25c3841c | Sofia Papagiannaki | 'if_unmodified_since']
|
156 | 25c3841c | Sofia Papagiannaki | args = self._build_args(attrs)
|
157 | f0eacc2c | Sofia Papagiannaki | args['format'] = 'json' if self.detail else 'text' |
158 | d2d5c360 | Sofia Papagiannaki | |
159 | f0eacc2c | Sofia Papagiannaki | if getattr(self, 'until'): |
160 | d2d5c360 | Sofia Papagiannaki | t = _time.strptime(self.until, self.format) |
161 | 25c3841c | Sofia Papagiannaki | args['until'] = int(_time.mktime(t)) |
162 | d2d5c360 | Sofia Papagiannaki | |
163 | 25c3841c | Sofia Papagiannaki | l = self.client.list_containers(**args)
|
164 | f07c5a53 | Sofia Papagiannaki | print_list(l) |
165 | f7ab99df | Sofia Papagiannaki | |
166 | cfac048c | Giorgos Verigakis | def list_objects(self, container): |
167 | bcb7c5a8 | Sofia Papagiannaki | #prepate params
|
168 | bcb7c5a8 | Sofia Papagiannaki | params = {} |
169 | f0eacc2c | Sofia Papagiannaki | attrs = ['limit', 'marker', 'prefix', 'delimiter', 'path', |
170 | 25c3841c | Sofia Papagiannaki | 'meta', 'if_modified_since', 'if_unmodified_since'] |
171 | 25c3841c | Sofia Papagiannaki | args = self._build_args(attrs)
|
172 | f0eacc2c | Sofia Papagiannaki | args['format'] = 'json' if self.detail else 'text' |
173 | bcb7c5a8 | Sofia Papagiannaki | |
174 | bcb7c5a8 | Sofia Papagiannaki | if self.until: |
175 | bcb7c5a8 | Sofia Papagiannaki | t = _time.strptime(self.until, self.format) |
176 | 25c3841c | Sofia Papagiannaki | args['until'] = int(_time.mktime(t)) |
177 | bcb7c5a8 | Sofia Papagiannaki | |
178 | d2d5c360 | Sofia Papagiannaki | container, sep, object = container.partition('/')
|
179 | d2d5c360 | Sofia Papagiannaki | if object: |
180 | d2d5c360 | Sofia Papagiannaki | return
|
181 | d2d5c360 | Sofia Papagiannaki | |
182 | a4c10cbc | Sofia Papagiannaki | detail = 'json'
|
183 | a2defd86 | Sofia Papagiannaki | #if request with meta quering disable trash filtering
|
184 | a2defd86 | Sofia Papagiannaki | show_trashed = True if self.meta else False |
185 | 25c3841c | Sofia Papagiannaki | l = self.client.list_objects(container, **args)
|
186 | a4c10cbc | Sofia Papagiannaki | print_list(l, detail=self.detail)
|
187 | cfac048c | Giorgos Verigakis | |
188 | cfac048c | Giorgos Verigakis | @cli_command('meta') |
189 | cfac048c | Giorgos Verigakis | class Meta(Command): |
190 | cfac048c | Giorgos Verigakis | syntax = '[<container>[/<object>]]'
|
191 | f63cf249 | Sofia Papagiannaki | description = 'get account/container/object metadata'
|
192 | 0ea1dcc4 | Sofia Papagiannaki | |
193 | 0ea1dcc4 | Sofia Papagiannaki | def add_options(self, parser): |
194 | 0ea1dcc4 | Sofia Papagiannaki | parser.add_option('-r', action='store_true', dest='restricted', |
195 | 0ea1dcc4 | Sofia Papagiannaki | default=False, help='show only user defined metadata') |
196 | d2d5c360 | Sofia Papagiannaki | parser.add_option('--until', action='store', dest='until', |
197 | f0eacc2c | Sofia Papagiannaki | default=None, help='show metadata until that date') |
198 | d2d5c360 | Sofia Papagiannaki | parser.add_option('--format', action='store', dest='format', |
199 | d2d5c360 | Sofia Papagiannaki | default='%d/%m/%Y', help='format to parse until date') |
200 | e3fd7f91 | Sofia Papagiannaki | parser.add_option('--version', action='store', dest='version', |
201 | e3fd7f91 | Sofia Papagiannaki | default=None, help='show specific version \ |
202 | e3fd7f91 | Sofia Papagiannaki | (applies only for objects)')
|
203 | f7ab99df | Sofia Papagiannaki | |
204 | cfac048c | Giorgos Verigakis | def execute(self, path=''): |
205 | cfac048c | Giorgos Verigakis | container, sep, object = path.partition('/')
|
206 | f546c15e | Antony Chazapis | args = {'restricted': self.restricted} |
207 | f0eacc2c | Sofia Papagiannaki | if getattr(self, 'until'): |
208 | d2d5c360 | Sofia Papagiannaki | t = _time.strptime(self.until, self.format) |
209 | 25c3841c | Sofia Papagiannaki | args['until'] = int(_time.mktime(t)) |
210 | 7812e1f9 | Sofia Papagiannaki | |
211 | cfac048c | Giorgos Verigakis | if object: |
212 | 0ea1dcc4 | Sofia Papagiannaki | meta = self.client.retrieve_object_metadata(container, object, |
213 | 8fe01d72 | Sofia Papagiannaki | self.restricted,
|
214 | 8fe01d72 | Sofia Papagiannaki | self.version)
|
215 | cfac048c | Giorgos Verigakis | elif container:
|
216 | 25c3841c | Sofia Papagiannaki | meta = self.client.retrieve_container_metadata(container, **args)
|
217 | cfac048c | Giorgos Verigakis | else:
|
218 | 25c3841c | Sofia Papagiannaki | meta = self.client.retrieve_account_metadata(**args)
|
219 | f07c5a53 | Sofia Papagiannaki | if meta == None: |
220 | f07c5a53 | Sofia Papagiannaki | print 'Entity does not exist' |
221 | f07c5a53 | Sofia Papagiannaki | else:
|
222 | f07c5a53 | Sofia Papagiannaki | print_dict(meta, header=None)
|
223 | cfac048c | Giorgos Verigakis | |
224 | cfac048c | Giorgos Verigakis | @cli_command('create') |
225 | cfac048c | Giorgos Verigakis | class CreateContainer(Command): |
226 | f07c5a53 | Sofia Papagiannaki | syntax = '<container> [key=val] [...]'
|
227 | cfac048c | Giorgos Verigakis | description = 'create a container'
|
228 | 5a8dc30c | Sofia Papagiannaki | |
229 | 5a8dc30c | Sofia Papagiannaki | def add_options(self, parser): |
230 | 93abb8b2 | Antony Chazapis | parser.add_option('--versioning', action='store', dest='versioning', |
231 | 5a8dc30c | Sofia Papagiannaki | default=None, help='set container versioning (auto/none)') |
232 | 93abb8b2 | Antony Chazapis | parser.add_option('--quota', action='store', dest='quota', |
233 | 5a8dc30c | Sofia Papagiannaki | default=None, help='set default container quota') |
234 | cfac048c | Giorgos Verigakis | |
235 | f07c5a53 | Sofia Papagiannaki | def execute(self, container, *args): |
236 | bcb7c5a8 | Sofia Papagiannaki | meta = {} |
237 | f07c5a53 | Sofia Papagiannaki | for arg in args: |
238 | f07c5a53 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
239 | bcb7c5a8 | Sofia Papagiannaki | meta[key] = val |
240 | 93abb8b2 | Antony Chazapis | policy = {} |
241 | 93abb8b2 | Antony Chazapis | if getattr(self, 'versioning'): |
242 | 93abb8b2 | Antony Chazapis | policy['versioning'] = self.versioning |
243 | 93abb8b2 | Antony Chazapis | if getattr(self, 'quota'): |
244 | 93abb8b2 | Antony Chazapis | policy['quota'] = self.quota |
245 | 5a8dc30c | Sofia Papagiannaki | ret = self.client.create_container(container, meta=meta, policies=policy)
|
246 | cfac048c | Giorgos Verigakis | if not ret: |
247 | cfac048c | Giorgos Verigakis | print 'Container already exists' |
248 | cfac048c | Giorgos Verigakis | |
249 | cfac048c | Giorgos Verigakis | @cli_command('delete', 'rm') |
250 | cfac048c | Giorgos Verigakis | class Delete(Command): |
251 | cfac048c | Giorgos Verigakis | syntax = '<container>[/<object>]'
|
252 | cfac048c | Giorgos Verigakis | description = 'delete a container or an object'
|
253 | cfac048c | Giorgos Verigakis | |
254 | 25c3841c | Sofia Papagiannaki | def add_options(self, parser): |
255 | 25c3841c | Sofia Papagiannaki | parser.add_option('--until', action='store', dest='until', |
256 | f0eacc2c | Sofia Papagiannaki | default=None, help='remove history until that date') |
257 | 25c3841c | Sofia Papagiannaki | parser.add_option('--format', action='store', dest='format', |
258 | 25c3841c | Sofia Papagiannaki | default='%d/%m/%Y', help='format to parse until date') |
259 | db117cac | Sofia Papagiannaki | parser.add_option('--delimiter', action='store', type='str', |
260 | db117cac | Sofia Papagiannaki | dest='delimiter', default=None, |
261 | db117cac | Sofia Papagiannaki | help='mass delete objects with path staring with <src object> + delimiter')
|
262 | db117cac | Sofia Papagiannaki | parser.add_option('-r', action='store_true', |
263 | db117cac | Sofia Papagiannaki | dest='recursive', default=False, |
264 | db117cac | Sofia Papagiannaki | help='mass delimiter objects with delimiter /')
|
265 | 25c3841c | Sofia Papagiannaki | |
266 | cfac048c | Giorgos Verigakis | def execute(self, path): |
267 | cfac048c | Giorgos Verigakis | container, sep, object = path.partition('/')
|
268 | f0eacc2c | Sofia Papagiannaki | until = None
|
269 | f0eacc2c | Sofia Papagiannaki | if getattr(self, 'until'): |
270 | 25c3841c | Sofia Papagiannaki | t = _time.strptime(self.until, self.format) |
271 | 25c3841c | Sofia Papagiannaki | until = int(_time.mktime(t))
|
272 | 25c3841c | Sofia Papagiannaki | |
273 | cfac048c | Giorgos Verigakis | if object: |
274 | db117cac | Sofia Papagiannaki | kwargs = {} |
275 | db117cac | Sofia Papagiannaki | if self.delimiter: |
276 | db117cac | Sofia Papagiannaki | kwargs['delimiter'] = self.delimiter |
277 | db117cac | Sofia Papagiannaki | elif self.recursive: |
278 | db117cac | Sofia Papagiannaki | kwargs['delimiter'] = '/' |
279 | db117cac | Sofia Papagiannaki | self.client.delete_object(container, object, until, **kwargs) |
280 | cfac048c | Giorgos Verigakis | else:
|
281 | 25c3841c | Sofia Papagiannaki | self.client.delete_container(container, until)
|
282 | cfac048c | Giorgos Verigakis | |
283 | cfac048c | Giorgos Verigakis | @cli_command('get') |
284 | cfac048c | Giorgos Verigakis | class GetObject(Command): |
285 | cfac048c | Giorgos Verigakis | syntax = '<container>/<object>'
|
286 | cfac048c | Giorgos Verigakis | description = 'get the data of an object'
|
287 | cfac048c | Giorgos Verigakis | |
288 | f07c5a53 | Sofia Papagiannaki | def add_options(self, parser): |
289 | f07c5a53 | Sofia Papagiannaki | parser.add_option('-l', action='store_true', dest='detail', |
290 | f07c5a53 | Sofia Papagiannaki | default=False, help='show detailed output') |
291 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--range', action='store', dest='range', |
292 | f07c5a53 | Sofia Papagiannaki | default=None, help='show range of data') |
293 | 25c3841c | Sofia Papagiannaki | parser.add_option('--if-range', action='store', dest='if_range', |
294 | b44d602e | Sofia Papagiannaki | default=None, help='show range of data') |
295 | 25c3841c | Sofia Papagiannaki | parser.add_option('--if-match', action='store', dest='if_match', |
296 | f07c5a53 | Sofia Papagiannaki | default=None, help='show output if ETags match') |
297 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--if-none-match', action='store', |
298 | 25c3841c | Sofia Papagiannaki | dest='if_none_match', default=None, |
299 | f07c5a53 | Sofia Papagiannaki | help='show output if ETags don\'t match')
|
300 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--if-modified-since', action='store', type='str', |
301 | 25c3841c | Sofia Papagiannaki | dest='if_modified_since', default=None, |
302 | f07c5a53 | Sofia Papagiannaki | help='show output if modified since then')
|
303 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--if-unmodified-since', action='store', type='str', |
304 | 25c3841c | Sofia Papagiannaki | dest='if_unmodified_since', default=None, |
305 | f07c5a53 | Sofia Papagiannaki | help='show output if not modified since then')
|
306 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('-o', action='store', type='str', |
307 | f07c5a53 | Sofia Papagiannaki | dest='file', default=None, |
308 | f07c5a53 | Sofia Papagiannaki | help='save output in file')
|
309 | 8fe01d72 | Sofia Papagiannaki | parser.add_option('--version', action='store', type='str', |
310 | ad71a0ce | Sofia Papagiannaki | dest='version', default=None, |
311 | 085a31d7 | Sofia Papagiannaki | help='get the specific \
|
312 | 8fe01d72 | Sofia Papagiannaki | version')
|
313 | 085a31d7 | Sofia Papagiannaki | parser.add_option('--versionlist', action='store_true', |
314 | 085a31d7 | Sofia Papagiannaki | dest='versionlist', default=False, |
315 | 085a31d7 | Sofia Papagiannaki | help='get the full object version list')
|
316 | f9e723fd | Sofia Papagiannaki | parser.add_option('--hashmap', action='store_true', |
317 | f9e723fd | Sofia Papagiannaki | dest='hashmap', default=False, |
318 | f9e723fd | Sofia Papagiannaki | help='get the object hashmap instead')
|
319 | f7ab99df | Sofia Papagiannaki | |
320 | cfac048c | Giorgos Verigakis | def execute(self, path): |
321 | f0eacc2c | Sofia Papagiannaki | attrs = ['if_match', 'if_none_match', 'if_modified_since', |
322 | f9e723fd | Sofia Papagiannaki | 'if_unmodified_since', 'hashmap'] |
323 | 25c3841c | Sofia Papagiannaki | args = self._build_args(attrs)
|
324 | f0eacc2c | Sofia Papagiannaki | args['format'] = 'json' if self.detail else 'text' |
325 | f07c5a53 | Sofia Papagiannaki | if self.range: |
326 | f546c15e | Antony Chazapis | args['range'] = 'bytes=%s' % self.range |
327 | 25c3841c | Sofia Papagiannaki | if getattr(self, 'if_range'): |
328 | 25c3841c | Sofia Papagiannaki | args['if-range'] = 'If-Range:%s' % getattr(self, 'if_range') |
329 | 25c3841c | Sofia Papagiannaki | |
330 | cfac048c | Giorgos Verigakis | container, sep, object = path.partition('/')
|
331 | 25c3841c | Sofia Papagiannaki | data = None
|
332 | 085a31d7 | Sofia Papagiannaki | if self.versionlist: |
333 | 25c3841c | Sofia Papagiannaki | if 'detail' in args.keys(): |
334 | 25c3841c | Sofia Papagiannaki | args.pop('detail')
|
335 | 7f769d34 | Sofia Papagiannaki | args.pop('format')
|
336 | 11999722 | Sofia Papagiannaki | self.detail = True |
337 | 25c3841c | Sofia Papagiannaki | data = self.client.retrieve_object_versionlist(container, object, **args) |
338 | 25c3841c | Sofia Papagiannaki | elif self.version: |
339 | 25c3841c | Sofia Papagiannaki | data = self.client.retrieve_object_version(container, object, |
340 | 25c3841c | Sofia Papagiannaki | self.version, **args)
|
341 | f9e723fd | Sofia Papagiannaki | elif self.hashmap: |
342 | f9e723fd | Sofia Papagiannaki | if 'detail' in args.keys(): |
343 | f9e723fd | Sofia Papagiannaki | args.pop('detail')
|
344 | f9e723fd | Sofia Papagiannaki | args.pop('format')
|
345 | f9e723fd | Sofia Papagiannaki | self.detail = True |
346 | f9e723fd | Sofia Papagiannaki | data = self.client.retrieve_object_hashmap(container, object, **args) |
347 | 25c3841c | Sofia Papagiannaki | else:
|
348 | 25c3841c | Sofia Papagiannaki | data = self.client.retrieve_object(container, object, **args) |
349 | 25c3841c | Sofia Papagiannaki | |
350 | af6d3b5d | Antony Chazapis | f = open(self.file, 'w') if self.file else stdout |
351 | f9e723fd | Sofia Papagiannaki | if self.detail or type(data) == types.DictionaryType: |
352 | 085a31d7 | Sofia Papagiannaki | if self.versionlist: |
353 | 8fe01d72 | Sofia Papagiannaki | print_versions(data, f=f) |
354 | f07c5a53 | Sofia Papagiannaki | else:
|
355 | 8fe01d72 | Sofia Papagiannaki | print_dict(data, f=f) |
356 | f07c5a53 | Sofia Papagiannaki | else:
|
357 | 8fe01d72 | Sofia Papagiannaki | f.write(data) |
358 | 8fe01d72 | Sofia Papagiannaki | f.close() |
359 | cfac048c | Giorgos Verigakis | |
360 | f7ab99df | Sofia Papagiannaki | @cli_command('mkdir') |
361 | f7ab99df | Sofia Papagiannaki | class PutMarker(Command): |
362 | f7ab99df | Sofia Papagiannaki | syntax = '<container>/<directory marker>'
|
363 | f7ab99df | Sofia Papagiannaki | description = 'create a directory marker'
|
364 | f7ab99df | Sofia Papagiannaki | |
365 | f7ab99df | Sofia Papagiannaki | def execute(self, path): |
366 | f7ab99df | Sofia Papagiannaki | container, sep, object = path.partition('/')
|
367 | f7ab99df | Sofia Papagiannaki | self.client.create_directory_marker(container, object) |
368 | f7ab99df | Sofia Papagiannaki | |
369 | cfac048c | Giorgos Verigakis | @cli_command('put') |
370 | cfac048c | Giorgos Verigakis | class PutObject(Command): |
371 | f63cf249 | Sofia Papagiannaki | syntax = '<container>/<object> [key=val] [...]'
|
372 | f89e3cf4 | Sofia Papagiannaki | description = 'create/override object'
|
373 | f7ab99df | Sofia Papagiannaki | |
374 | f07c5a53 | Sofia Papagiannaki | def add_options(self, parser): |
375 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('--use_hashes', action='store_true', dest='use_hashes', |
376 | bcb7c5a8 | Sofia Papagiannaki | default=False, help='provide hashmap instead of data') |
377 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--chunked', action='store_true', dest='chunked', |
378 | f07c5a53 | Sofia Papagiannaki | default=False, help='set chunked transfer mode') |
379 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--etag', action='store', dest='etag', |
380 | f07c5a53 | Sofia Papagiannaki | default=None, help='check written data') |
381 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--content-encoding', action='store', |
382 | 25c3841c | Sofia Papagiannaki | dest='content_encoding', default=None, |
383 | f07c5a53 | Sofia Papagiannaki | help='provide the object MIME content type')
|
384 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--content-disposition', action='store', type='str', |
385 | 25c3841c | Sofia Papagiannaki | dest='content_disposition', default=None, |
386 | f07c5a53 | Sofia Papagiannaki | help='provide the presentation style of the object')
|
387 | 25c3841c | Sofia Papagiannaki | #parser.add_option('-S', action='store',
|
388 | 25c3841c | Sofia Papagiannaki | # dest='segment_size', default=False,
|
389 | 25c3841c | Sofia Papagiannaki | # help='use for large file support')
|
390 | 050ec33b | Sofia Papagiannaki | parser.add_option('--manifest', action='store', |
391 | 25c3841c | Sofia Papagiannaki | dest='x_object_manifest', default=None, |
392 | f9e723fd | Sofia Papagiannaki | help='provide object parts prefix in <container>/<object> form')
|
393 | 25c3841c | Sofia Papagiannaki | parser.add_option('--content-type', action='store', |
394 | 25c3841c | Sofia Papagiannaki | dest='content_type', default=None, |
395 | f7ab99df | Sofia Papagiannaki | help='create object with specific content type')
|
396 | d3fd269f | Sofia Papagiannaki | parser.add_option('--sharing', action='store', |
397 | 25c3841c | Sofia Papagiannaki | dest='x_object_sharing', default=None, |
398 | d3fd269f | Sofia Papagiannaki | help='define sharing object policy')
|
399 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('-f', action='store', |
400 | bcb7c5a8 | Sofia Papagiannaki | dest='srcpath', default=None, |
401 | f89e3cf4 | Sofia Papagiannaki | help='file descriptor to read from (pass - for standard input)')
|
402 | 25c3841c | Sofia Papagiannaki | parser.add_option('--public', action='store_true', |
403 | 25c3841c | Sofia Papagiannaki | dest='x_object_public', default=False, |
404 | 7812e1f9 | Sofia Papagiannaki | help='make object publicly accessible')
|
405 | f89e3cf4 | Sofia Papagiannaki | |
406 | bcb7c5a8 | Sofia Papagiannaki | def execute(self, path, *args): |
407 | bcb7c5a8 | Sofia Papagiannaki | if path.find('=') != -1: |
408 | bcb7c5a8 | Sofia Papagiannaki | raise Fault('Missing path argument') |
409 | bcb7c5a8 | Sofia Papagiannaki | |
410 | bcb7c5a8 | Sofia Papagiannaki | #prepare user defined meta
|
411 | bcb7c5a8 | Sofia Papagiannaki | meta = {} |
412 | bcb7c5a8 | Sofia Papagiannaki | for arg in args: |
413 | bcb7c5a8 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
414 | bcb7c5a8 | Sofia Papagiannaki | meta[key] = val |
415 | d3fd269f | Sofia Papagiannaki | |
416 | 25c3841c | Sofia Papagiannaki | attrs = ['etag', 'content_encoding', 'content_disposition', |
417 | 25c3841c | Sofia Papagiannaki | 'content_type', 'x_object_sharing', 'x_object_public'] |
418 | 25c3841c | Sofia Papagiannaki | args = self._build_args(attrs)
|
419 | f07c5a53 | Sofia Papagiannaki | |
420 | cfac048c | Giorgos Verigakis | container, sep, object = path.partition('/')
|
421 | f07c5a53 | Sofia Papagiannaki | |
422 | d2d5c360 | Sofia Papagiannaki | f = None
|
423 | bcb7c5a8 | Sofia Papagiannaki | if self.srcpath: |
424 | bcb7c5a8 | Sofia Papagiannaki | f = open(self.srcpath) if self.srcpath != '-' else stdin |
425 | bcb7c5a8 | Sofia Papagiannaki | |
426 | bcb7c5a8 | Sofia Papagiannaki | if self.use_hashes and not f: |
427 | bcb7c5a8 | Sofia Papagiannaki | raise Fault('Illegal option combination') |
428 | 25c3841c | Sofia Papagiannaki | |
429 | 25c3841c | Sofia Papagiannaki | if self.chunked: |
430 | 25c3841c | Sofia Papagiannaki | self.client.create_object_using_chunks(container, object, f, |
431 | 25c3841c | Sofia Papagiannaki | meta=meta, **args) |
432 | 25c3841c | Sofia Papagiannaki | elif self.use_hashes: |
433 | 54ca3d0f | Sofia Papagiannaki | data = f.read() |
434 | b8fa0222 | Sofia Papagiannaki | hashmap = json.loads(data) |
435 | b8fa0222 | Sofia Papagiannaki | self.client.create_object_by_hashmap(container, object, hashmap, |
436 | b8fa0222 | Sofia Papagiannaki | meta=meta, **args) |
437 | 25c3841c | Sofia Papagiannaki | elif self.x_object_manifest: |
438 | 25c3841c | Sofia Papagiannaki | self.client.create_manifestation(container, object, self.x_object_manifest) |
439 | cd6ada1d | Sofia Papagiannaki | elif not f: |
440 | cd6ada1d | Sofia Papagiannaki | self.client.create_zero_length_object(container, object, meta=meta, **args) |
441 | 25c3841c | Sofia Papagiannaki | else:
|
442 | 4211443b | Sofia Papagiannaki | self.client.create_object(container, object, f, meta=meta, **args) |
443 | d2d5c360 | Sofia Papagiannaki | if f:
|
444 | d2d5c360 | Sofia Papagiannaki | f.close() |
445 | cfac048c | Giorgos Verigakis | |
446 | cfac048c | Giorgos Verigakis | @cli_command('copy', 'cp') |
447 | cfac048c | Giorgos Verigakis | class CopyObject(Command): |
448 | 7812e1f9 | Sofia Papagiannaki | syntax = '<src container>/<src object> [<dst container>/]<dst object> [key=val] [...]'
|
449 | f89e3cf4 | Sofia Papagiannaki | description = 'copy an object to a different location'
|
450 | cfac048c | Giorgos Verigakis | |
451 | ad71a0ce | Sofia Papagiannaki | def add_options(self, parser): |
452 | ad71a0ce | Sofia Papagiannaki | parser.add_option('--version', action='store', |
453 | ad71a0ce | Sofia Papagiannaki | dest='version', default=False, |
454 | ad71a0ce | Sofia Papagiannaki | help='copy specific version')
|
455 | 7812e1f9 | Sofia Papagiannaki | parser.add_option('--public', action='store_true', |
456 | 7812e1f9 | Sofia Papagiannaki | dest='public', default=False, |
457 | 7812e1f9 | Sofia Papagiannaki | help='make object publicly accessible')
|
458 | d4a63b9b | Sofia Papagiannaki | parser.add_option('--content-type', action='store', |
459 | d4a63b9b | Sofia Papagiannaki | dest='content_type', default=None, |
460 | d4a63b9b | Sofia Papagiannaki | help='change object\'s content type')
|
461 | db117cac | Sofia Papagiannaki | parser.add_option('--delimiter', action='store', type='str', |
462 | db117cac | Sofia Papagiannaki | dest='delimiter', default=None, |
463 | db117cac | Sofia Papagiannaki | help='mass copy objects with path staring with <src object> + delimiter')
|
464 | db117cac | Sofia Papagiannaki | parser.add_option('-r', action='store_true', |
465 | db117cac | Sofia Papagiannaki | dest='recursive', default=False, |
466 | db117cac | Sofia Papagiannaki | help='mass copy with delimiter /')
|
467 | f7ab99df | Sofia Papagiannaki | |
468 | 7812e1f9 | Sofia Papagiannaki | def execute(self, src, dst, *args): |
469 | cfac048c | Giorgos Verigakis | src_container, sep, src_object = src.partition('/')
|
470 | cfac048c | Giorgos Verigakis | dst_container, sep, dst_object = dst.partition('/')
|
471 | 7812e1f9 | Sofia Papagiannaki | |
472 | 7812e1f9 | Sofia Papagiannaki | #prepare user defined meta
|
473 | 7812e1f9 | Sofia Papagiannaki | meta = {} |
474 | 7812e1f9 | Sofia Papagiannaki | for arg in args: |
475 | 7812e1f9 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
476 | 7812e1f9 | Sofia Papagiannaki | meta[key] = val |
477 | 7812e1f9 | Sofia Papagiannaki | |
478 | cfac048c | Giorgos Verigakis | if not sep: |
479 | cfac048c | Giorgos Verigakis | dst_container = src_container |
480 | cfac048c | Giorgos Verigakis | dst_object = dst |
481 | 7812e1f9 | Sofia Papagiannaki | |
482 | d4a63b9b | Sofia Papagiannaki | args = {'content_type':self.content_type} if self.content_type else {} |
483 | db117cac | Sofia Papagiannaki | if self.delimiter: |
484 | db117cac | Sofia Papagiannaki | args['delimiter'] = self.delimiter |
485 | db117cac | Sofia Papagiannaki | elif self.recursive: |
486 | db117cac | Sofia Papagiannaki | args['delimiter'] = '/' |
487 | f07c5a53 | Sofia Papagiannaki | self.client.copy_object(src_container, src_object, dst_container,
|
488 | d4a63b9b | Sofia Papagiannaki | dst_object, meta, self.public, self.version, |
489 | d4a63b9b | Sofia Papagiannaki | **args) |
490 | cfac048c | Giorgos Verigakis | |
491 | cfac048c | Giorgos Verigakis | @cli_command('set') |
492 | 3f5b02c7 | Sofia Papagiannaki | class SetMeta(Command): |
493 | 3f5b02c7 | Sofia Papagiannaki | syntax = '[<container>[/<object>]] key=val [key=val] [...]'
|
494 | f63cf249 | Sofia Papagiannaki | description = 'set account/container/object metadata'
|
495 | cfac048c | Giorgos Verigakis | |
496 | cfac048c | Giorgos Verigakis | def execute(self, path, *args): |
497 | 3f5b02c7 | Sofia Papagiannaki | #in case of account fix the args
|
498 | f07c5a53 | Sofia Papagiannaki | if path.find('=') != -1: |
499 | 3f5b02c7 | Sofia Papagiannaki | args = list(args)
|
500 | 3f5b02c7 | Sofia Papagiannaki | args.append(path) |
501 | 3f5b02c7 | Sofia Papagiannaki | args = tuple(args)
|
502 | 3f5b02c7 | Sofia Papagiannaki | path = ''
|
503 | cfac048c | Giorgos Verigakis | meta = {} |
504 | cfac048c | Giorgos Verigakis | for arg in args: |
505 | cfac048c | Giorgos Verigakis | key, sep, val = arg.partition('=')
|
506 | cfac048c | Giorgos Verigakis | meta[key.strip()] = val.strip() |
507 | 3f5b02c7 | Sofia Papagiannaki | container, sep, object = path.partition('/')
|
508 | 3f5b02c7 | Sofia Papagiannaki | if object: |
509 | 3f5b02c7 | Sofia Papagiannaki | self.client.update_object_metadata(container, object, **meta) |
510 | 3f5b02c7 | Sofia Papagiannaki | elif container:
|
511 | 3f5b02c7 | Sofia Papagiannaki | self.client.update_container_metadata(container, **meta)
|
512 | 3f5b02c7 | Sofia Papagiannaki | else:
|
513 | 3f5b02c7 | Sofia Papagiannaki | self.client.update_account_metadata(**meta)
|
514 | cfac048c | Giorgos Verigakis | |
515 | f07c5a53 | Sofia Papagiannaki | @cli_command('update') |
516 | f07c5a53 | Sofia Papagiannaki | class UpdateObject(Command): |
517 | f07c5a53 | Sofia Papagiannaki | syntax = '<container>/<object> path [key=val] [...]'
|
518 | e3fd7f91 | Sofia Papagiannaki | description = 'update object metadata/data (default mode: append)'
|
519 | f07c5a53 | Sofia Papagiannaki | |
520 | f07c5a53 | Sofia Papagiannaki | def add_options(self, parser): |
521 | f07c5a53 | Sofia Papagiannaki | parser.add_option('-a', action='store_true', dest='append', |
522 | e3fd7f91 | Sofia Papagiannaki | default=True, help='append data') |
523 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('--offset', action='store', |
524 | bcb7c5a8 | Sofia Papagiannaki | dest='offset',
|
525 | a2defd86 | Sofia Papagiannaki | default=None, help='starting offest to be updated') |
526 | f9e723fd | Sofia Papagiannaki | parser.add_option('--range', action='store', dest='content_range', |
527 | f07c5a53 | Sofia Papagiannaki | default=None, help='range of data to be updated') |
528 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--chunked', action='store_true', dest='chunked', |
529 | f07c5a53 | Sofia Papagiannaki | default=False, help='set chunked transfer mode') |
530 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--content-encoding', action='store', |
531 | 25c3841c | Sofia Papagiannaki | dest='content_encoding', default=None, |
532 | f07c5a53 | Sofia Papagiannaki | help='provide the object MIME content type')
|
533 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--content-disposition', action='store', type='str', |
534 | 25c3841c | Sofia Papagiannaki | dest='content_disposition', default=None, |
535 | f07c5a53 | Sofia Papagiannaki | help='provide the presentation style of the object')
|
536 | f07c5a53 | Sofia Papagiannaki | parser.add_option('--manifest', action='store', type='str', |
537 | 25c3841c | Sofia Papagiannaki | dest='x_object_manifest', default=None, |
538 | d3fd269f | Sofia Papagiannaki | help='use for large file support')
|
539 | d3fd269f | Sofia Papagiannaki | parser.add_option('--sharing', action='store', |
540 | 25c3841c | Sofia Papagiannaki | dest='x_object_sharing', default=None, |
541 | d3fd269f | Sofia Papagiannaki | help='define sharing object policy')
|
542 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('--nosharing', action='store_true', |
543 | bcb7c5a8 | Sofia Papagiannaki | dest='no_sharing', default=None, |
544 | bcb7c5a8 | Sofia Papagiannaki | help='clear object sharing policy')
|
545 | bcb7c5a8 | Sofia Papagiannaki | parser.add_option('-f', action='store', |
546 | bcb7c5a8 | Sofia Papagiannaki | dest='srcpath', default=None, |
547 | bcb7c5a8 | Sofia Papagiannaki | help='file descriptor to read from: pass - for standard input')
|
548 | 7812e1f9 | Sofia Papagiannaki | parser.add_option('--public', action='store_true', |
549 | 25c3841c | Sofia Papagiannaki | dest='x_object_public', default=False, |
550 | 7812e1f9 | Sofia Papagiannaki | help='make object publicly accessible')
|
551 | 633bbb9f | Sofia Papagiannaki | parser.add_option('--replace', action='store_true', |
552 | 633bbb9f | Sofia Papagiannaki | dest='replace', default=False, |
553 | 633bbb9f | Sofia Papagiannaki | help='override metadata')
|
554 | f7ab99df | Sofia Papagiannaki | |
555 | bcb7c5a8 | Sofia Papagiannaki | def execute(self, path, *args): |
556 | bcb7c5a8 | Sofia Papagiannaki | if path.find('=') != -1: |
557 | bcb7c5a8 | Sofia Papagiannaki | raise Fault('Missing path argument') |
558 | bcb7c5a8 | Sofia Papagiannaki | |
559 | f07c5a53 | Sofia Papagiannaki | #prepare user defined meta
|
560 | bcb7c5a8 | Sofia Papagiannaki | meta = {} |
561 | f07c5a53 | Sofia Papagiannaki | for arg in args: |
562 | f07c5a53 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
563 | bcb7c5a8 | Sofia Papagiannaki | meta[key] = val |
564 | f07c5a53 | Sofia Papagiannaki | |
565 | 25c3841c | Sofia Papagiannaki | |
566 | 25c3841c | Sofia Papagiannaki | attrs = ['content_encoding', 'content_disposition', 'x_object_sharing', |
567 | f9e723fd | Sofia Papagiannaki | 'x_object_public', 'x_object_manifest', 'replace', 'offset', |
568 | f9e723fd | Sofia Papagiannaki | 'content_range']
|
569 | 25c3841c | Sofia Papagiannaki | args = self._build_args(attrs)
|
570 | 25c3841c | Sofia Papagiannaki | |
571 | 38bf2cdc | Sofia Papagiannaki | if self.no_sharing: |
572 | 38bf2cdc | Sofia Papagiannaki | args['x_object_sharing'] = '' |
573 | 38bf2cdc | Sofia Papagiannaki | |
574 | f07c5a53 | Sofia Papagiannaki | container, sep, object = path.partition('/')
|
575 | f07c5a53 | Sofia Papagiannaki | |
576 | a2defd86 | Sofia Papagiannaki | f = None
|
577 | bcb7c5a8 | Sofia Papagiannaki | if self.srcpath: |
578 | 25c3841c | Sofia Papagiannaki | f = open(self.srcpath) if self.srcpath != '-' else stdin |
579 | 25c3841c | Sofia Papagiannaki | |
580 | 25c3841c | Sofia Papagiannaki | if self.chunked: |
581 | 25c3841c | Sofia Papagiannaki | self.client.update_object_using_chunks(container, object, f, |
582 | 25c3841c | Sofia Papagiannaki | meta=meta, **args) |
583 | 25c3841c | Sofia Papagiannaki | else:
|
584 | f0964245 | Sofia Papagiannaki | self.client.update_object(container, object, f, meta=meta, **args) |
585 | a2defd86 | Sofia Papagiannaki | if f:
|
586 | a2defd86 | Sofia Papagiannaki | f.close() |
587 | f07c5a53 | Sofia Papagiannaki | |
588 | f07c5a53 | Sofia Papagiannaki | @cli_command('move', 'mv') |
589 | f07c5a53 | Sofia Papagiannaki | class MoveObject(Command): |
590 | f07c5a53 | Sofia Papagiannaki | syntax = '<src container>/<src object> [<dst container>/]<dst object>'
|
591 | f89e3cf4 | Sofia Papagiannaki | description = 'move an object to a different location'
|
592 | f89e3cf4 | Sofia Papagiannaki | |
593 | f89e3cf4 | Sofia Papagiannaki | def add_options(self, parser): |
594 | 7812e1f9 | Sofia Papagiannaki | parser.add_option('--public', action='store_true', |
595 | 7812e1f9 | Sofia Papagiannaki | dest='public', default=False, |
596 | 7812e1f9 | Sofia Papagiannaki | help='make object publicly accessible')
|
597 | d4a63b9b | Sofia Papagiannaki | parser.add_option('--content-type', action='store', |
598 | d4a63b9b | Sofia Papagiannaki | dest='content_type', default=None, |
599 | d4a63b9b | Sofia Papagiannaki | help='change object\'s content type')
|
600 | db117cac | Sofia Papagiannaki | parser.add_option('--delimiter', action='store', type='str', |
601 | db117cac | Sofia Papagiannaki | dest='delimiter', default=None, |
602 | db117cac | Sofia Papagiannaki | help='mass move objects with path staring with <src object> + delimiter')
|
603 | db117cac | Sofia Papagiannaki | parser.add_option('-r', action='store_true', |
604 | db117cac | Sofia Papagiannaki | dest='recursive', default=False, |
605 | db117cac | Sofia Papagiannaki | help='mass move objects with delimiter /')
|
606 | f07c5a53 | Sofia Papagiannaki | |
607 | 7812e1f9 | Sofia Papagiannaki | def execute(self, src, dst, *args): |
608 | f07c5a53 | Sofia Papagiannaki | src_container, sep, src_object = src.partition('/')
|
609 | f07c5a53 | Sofia Papagiannaki | dst_container, sep, dst_object = dst.partition('/')
|
610 | f07c5a53 | Sofia Papagiannaki | if not sep: |
611 | f07c5a53 | Sofia Papagiannaki | dst_container = src_container |
612 | f07c5a53 | Sofia Papagiannaki | dst_object = dst |
613 | 7812e1f9 | Sofia Papagiannaki | |
614 | 7812e1f9 | Sofia Papagiannaki | #prepare user defined meta
|
615 | 7812e1f9 | Sofia Papagiannaki | meta = {} |
616 | 7812e1f9 | Sofia Papagiannaki | for arg in args: |
617 | 7812e1f9 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
618 | 7812e1f9 | Sofia Papagiannaki | meta[key] = val |
619 | 7812e1f9 | Sofia Papagiannaki | |
620 | d4a63b9b | Sofia Papagiannaki | args = {'content_type':self.content_type} if self.content_type else {} |
621 | db117cac | Sofia Papagiannaki | if self.delimiter: |
622 | db117cac | Sofia Papagiannaki | args['delimiter'] = self.delimiter |
623 | db117cac | Sofia Papagiannaki | elif self.recursive: |
624 | db117cac | Sofia Papagiannaki | args['delimiter'] = '/' |
625 | f07c5a53 | Sofia Papagiannaki | self.client.move_object(src_container, src_object, dst_container,
|
626 | 97d45f69 | Antony Chazapis | dst_object, meta, self.public, **args)
|
627 | f7ab99df | Sofia Papagiannaki | |
628 | f7ab99df | Sofia Papagiannaki | @cli_command('unset') |
629 | bcb7c5a8 | Sofia Papagiannaki | class UnsetObject(Command): |
630 | f7ab99df | Sofia Papagiannaki | syntax = '<container>/[<object>] key [key] [...]'
|
631 | f89e3cf4 | Sofia Papagiannaki | description = 'delete metadata info'
|
632 | f7ab99df | Sofia Papagiannaki | |
633 | f7ab99df | Sofia Papagiannaki | def execute(self, path, *args): |
634 | f7ab99df | Sofia Papagiannaki | #in case of account fix the args
|
635 | 961f2fbe | Sofia Papagiannaki | if len(args) == 0: |
636 | f7ab99df | Sofia Papagiannaki | args = list(args)
|
637 | f7ab99df | Sofia Papagiannaki | args.append(path) |
638 | f7ab99df | Sofia Papagiannaki | args = tuple(args)
|
639 | f7ab99df | Sofia Papagiannaki | path = ''
|
640 | f7ab99df | Sofia Papagiannaki | meta = [] |
641 | f7ab99df | Sofia Papagiannaki | for key in args: |
642 | f7ab99df | Sofia Papagiannaki | meta.append(key) |
643 | f7ab99df | Sofia Papagiannaki | container, sep, object = path.partition('/')
|
644 | f7ab99df | Sofia Papagiannaki | if object: |
645 | f7ab99df | Sofia Papagiannaki | self.client.delete_object_metadata(container, object, meta) |
646 | f7ab99df | Sofia Papagiannaki | elif container:
|
647 | f7ab99df | Sofia Papagiannaki | self.client.delete_container_metadata(container, meta)
|
648 | f7ab99df | Sofia Papagiannaki | else:
|
649 | f7ab99df | Sofia Papagiannaki | self.client.delete_account_metadata(meta)
|
650 | f7ab99df | Sofia Papagiannaki | |
651 | d3fd269f | Sofia Papagiannaki | @cli_command('group') |
652 | f63cf249 | Sofia Papagiannaki | class CreateGroup(Command): |
653 | d3fd269f | Sofia Papagiannaki | syntax = 'key=val [key=val] [...]'
|
654 | f63cf249 | Sofia Papagiannaki | description = 'create account groups'
|
655 | d3fd269f | Sofia Papagiannaki | |
656 | bcb7c5a8 | Sofia Papagiannaki | def execute(self, *args): |
657 | d3fd269f | Sofia Papagiannaki | groups = {} |
658 | d3fd269f | Sofia Papagiannaki | for arg in args: |
659 | d3fd269f | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
660 | d3fd269f | Sofia Papagiannaki | groups[key] = val |
661 | bcb7c5a8 | Sofia Papagiannaki | self.client.set_account_groups(**groups)
|
662 | bcb7c5a8 | Sofia Papagiannaki | |
663 | f63cf249 | Sofia Papagiannaki | @cli_command('ungroup') |
664 | f63cf249 | Sofia Papagiannaki | class DeleteGroup(Command): |
665 | f63cf249 | Sofia Papagiannaki | syntax = 'key [key] [...]'
|
666 | f63cf249 | Sofia Papagiannaki | description = 'delete account groups'
|
667 | f63cf249 | Sofia Papagiannaki | |
668 | f63cf249 | Sofia Papagiannaki | def execute(self, *args): |
669 | f63cf249 | Sofia Papagiannaki | groups = [] |
670 | f63cf249 | Sofia Papagiannaki | for arg in args: |
671 | f63cf249 | Sofia Papagiannaki | groups.append(arg) |
672 | f63cf249 | Sofia Papagiannaki | self.client.unset_account_groups(groups)
|
673 | f63cf249 | Sofia Papagiannaki | |
674 | bcb7c5a8 | Sofia Papagiannaki | @cli_command('policy') |
675 | bcb7c5a8 | Sofia Papagiannaki | class SetPolicy(Command): |
676 | bcb7c5a8 | Sofia Papagiannaki | syntax = 'container key=val [key=val] [...]'
|
677 | f89e3cf4 | Sofia Papagiannaki | description = 'set container policies'
|
678 | bcb7c5a8 | Sofia Papagiannaki | |
679 | bcb7c5a8 | Sofia Papagiannaki | def execute(self, path, *args): |
680 | bcb7c5a8 | Sofia Papagiannaki | if path.find('=') != -1: |
681 | bcb7c5a8 | Sofia Papagiannaki | raise Fault('Missing container argument') |
682 | bcb7c5a8 | Sofia Papagiannaki | |
683 | bcb7c5a8 | Sofia Papagiannaki | container, sep, object = path.partition('/')
|
684 | bcb7c5a8 | Sofia Papagiannaki | |
685 | bcb7c5a8 | Sofia Papagiannaki | if object: |
686 | bcb7c5a8 | Sofia Papagiannaki | raise Fault('Only containers have policies') |
687 | bcb7c5a8 | Sofia Papagiannaki | |
688 | bcb7c5a8 | Sofia Papagiannaki | policies = {} |
689 | bcb7c5a8 | Sofia Papagiannaki | for arg in args: |
690 | bcb7c5a8 | Sofia Papagiannaki | key, sep, val = arg.partition('=')
|
691 | bcb7c5a8 | Sofia Papagiannaki | policies[key] = val |
692 | bcb7c5a8 | Sofia Papagiannaki | |
693 | bcb7c5a8 | Sofia Papagiannaki | self.client.set_container_policies(container, **policies)
|
694 | d3fd269f | Sofia Papagiannaki | |
695 | f89e3cf4 | Sofia Papagiannaki | @cli_command('publish') |
696 | f89e3cf4 | Sofia Papagiannaki | class PublishObject(Command): |
697 | f89e3cf4 | Sofia Papagiannaki | syntax = '<container>/<object>'
|
698 | f89e3cf4 | Sofia Papagiannaki | description = 'publish an object'
|
699 | f89e3cf4 | Sofia Papagiannaki | |
700 | f89e3cf4 | Sofia Papagiannaki | def execute(self, src): |
701 | f89e3cf4 | Sofia Papagiannaki | src_container, sep, src_object = src.partition('/')
|
702 | f89e3cf4 | Sofia Papagiannaki | |
703 | f89e3cf4 | Sofia Papagiannaki | self.client.publish_object(src_container, src_object)
|
704 | f89e3cf4 | Sofia Papagiannaki | |
705 | f89e3cf4 | Sofia Papagiannaki | @cli_command('unpublish') |
706 | f89e3cf4 | Sofia Papagiannaki | class UnpublishObject(Command): |
707 | f89e3cf4 | Sofia Papagiannaki | syntax = '<container>/<object>'
|
708 | f89e3cf4 | Sofia Papagiannaki | description = 'unpublish an object'
|
709 | f89e3cf4 | Sofia Papagiannaki | |
710 | f89e3cf4 | Sofia Papagiannaki | def execute(self, src): |
711 | f89e3cf4 | Sofia Papagiannaki | src_container, sep, src_object = src.partition('/')
|
712 | f89e3cf4 | Sofia Papagiannaki | |
713 | f89e3cf4 | Sofia Papagiannaki | self.client.unpublish_object(src_container, src_object)
|
714 | f89e3cf4 | Sofia Papagiannaki | |
715 | d4a63b9b | Sofia Papagiannaki | @cli_command('sharing') |
716 | d4a63b9b | Sofia Papagiannaki | class SharingObject(Command): |
717 | d4a63b9b | Sofia Papagiannaki | syntax = 'list users sharing objects with the user'
|
718 | d4a63b9b | Sofia Papagiannaki | description = 'list user accounts sharing objects with the user'
|
719 | d4a63b9b | Sofia Papagiannaki | |
720 | d4a63b9b | Sofia Papagiannaki | def add_options(self, parser): |
721 | d4a63b9b | Sofia Papagiannaki | parser.add_option('-l', action='store_true', dest='detail', |
722 | d4a63b9b | Sofia Papagiannaki | default=False, help='show detailed output') |
723 | d4a63b9b | Sofia Papagiannaki | parser.add_option('-n', action='store', type='int', dest='limit', |
724 | d4a63b9b | Sofia Papagiannaki | default=10000, help='show limited output') |
725 | d4a63b9b | Sofia Papagiannaki | parser.add_option('--marker', action='store', type='str', |
726 | d4a63b9b | Sofia Papagiannaki | dest='marker', default=None, |
727 | d4a63b9b | Sofia Papagiannaki | help='show output greater then marker')
|
728 | d4a63b9b | Sofia Papagiannaki | |
729 | d4a63b9b | Sofia Papagiannaki | |
730 | d4a63b9b | Sofia Papagiannaki | def execute(self): |
731 | d4a63b9b | Sofia Papagiannaki | attrs = ['limit', 'marker'] |
732 | d4a63b9b | Sofia Papagiannaki | args = self._build_args(attrs)
|
733 | d4a63b9b | Sofia Papagiannaki | args['format'] = 'json' if self.detail else 'text' |
734 | d4a63b9b | Sofia Papagiannaki | |
735 | d4a63b9b | Sofia Papagiannaki | print_list(self.client.list_shared_by_others(**args))
|
736 | d4a63b9b | Sofia Papagiannaki | |
737 | 822cc7eb | Antony Chazapis | @cli_command('send') |
738 | 822cc7eb | Antony Chazapis | class Send(Command): |
739 | 822cc7eb | Antony Chazapis | syntax = '<file> <container>[/<prefix>]'
|
740 | 822cc7eb | Antony Chazapis | description = 'upload file to container (using prefix)'
|
741 | f546c15e | Antony Chazapis | |
742 | f546c15e | Antony Chazapis | def execute(self, file, path): |
743 | f546c15e | Antony Chazapis | container, sep, prefix = path.partition('/')
|
744 | 822cc7eb | Antony Chazapis | upload(self.client, file, container, prefix) |
745 | 822cc7eb | Antony Chazapis | |
746 | f546c15e | Antony Chazapis | @cli_command('receive') |
747 | f546c15e | Antony Chazapis | class Receive(Command): |
748 | f546c15e | Antony Chazapis | syntax = '<container>/<object> <file>'
|
749 | f546c15e | Antony Chazapis | description = 'download object to file'
|
750 | f546c15e | Antony Chazapis | |
751 | f546c15e | Antony Chazapis | def execute(self, path, file): |
752 | f546c15e | Antony Chazapis | container, sep, object = path.partition('/')
|
753 | f546c15e | Antony Chazapis | download(self.client, container, object, file) |
754 | f546c15e | Antony Chazapis | |
755 | cfac048c | Giorgos Verigakis | def print_usage(): |
756 | 10998c60 | Sofia Papagiannaki | cmd = Command('', [])
|
757 | cfac048c | Giorgos Verigakis | parser = cmd.parser |
758 | cfac048c | Giorgos Verigakis | parser.usage = '%prog <command> [options]'
|
759 | cfac048c | Giorgos Verigakis | parser.print_help() |
760 | cfac048c | Giorgos Verigakis | |
761 | cfac048c | Giorgos Verigakis | commands = [] |
762 | cfac048c | Giorgos Verigakis | for cls in set(_cli_commands.values()): |
763 | cfac048c | Giorgos Verigakis | name = ', '.join(cls.commands)
|
764 | cfac048c | Giorgos Verigakis | description = getattr(cls, 'description', '') |
765 | cfac048c | Giorgos Verigakis | commands.append(' %s %s' % (name.ljust(12), description)) |
766 | cfac048c | Giorgos Verigakis | print '\nCommands:\n' + '\n'.join(sorted(commands)) |
767 | cfac048c | Giorgos Verigakis | |
768 | a4c10cbc | Sofia Papagiannaki | def print_dict(d, header='name', f=stdout, detail=True): |
769 | ae75584f | Sofia Papagiannaki | header = header if header in d else 'subdir' |
770 | f07c5a53 | Sofia Papagiannaki | if header and header in d: |
771 | ae75584f | Sofia Papagiannaki | f.write('%s\n' %d.pop(header).encode('utf8')) |
772 | a4c10cbc | Sofia Papagiannaki | if detail:
|
773 | a4c10cbc | Sofia Papagiannaki | patterns = ['^x_(account|container|object)_meta_(\w+)$']
|
774 | a4c10cbc | Sofia Papagiannaki | patterns.append(patterns[0].replace('_', '-')) |
775 | a4c10cbc | Sofia Papagiannaki | for key, val in sorted(d.items()): |
776 | a4c10cbc | Sofia Papagiannaki | f.write('%s: %s\n' % (key.rjust(30), val)) |
777 | f07c5a53 | Sofia Papagiannaki | |
778 | a4c10cbc | Sofia Papagiannaki | def print_list(l, verbose=False, f=stdout, detail=True): |
779 | f07c5a53 | Sofia Papagiannaki | for elem in l: |
780 | f07c5a53 | Sofia Papagiannaki | #if it's empty string continue
|
781 | f07c5a53 | Sofia Papagiannaki | if not elem: |
782 | f07c5a53 | Sofia Papagiannaki | continue
|
783 | f07c5a53 | Sofia Papagiannaki | if type(elem) == types.DictionaryType: |
784 | a4c10cbc | Sofia Papagiannaki | print_dict(elem, f=f, detail=detail) |
785 | f07c5a53 | Sofia Papagiannaki | elif type(elem) == types.StringType: |
786 | f07c5a53 | Sofia Papagiannaki | if not verbose: |
787 | f07c5a53 | Sofia Papagiannaki | elem = elem.split('Traceback')[0] |
788 | f07c5a53 | Sofia Papagiannaki | f.write('%s\n' % elem)
|
789 | f07c5a53 | Sofia Papagiannaki | else:
|
790 | f07c5a53 | Sofia Papagiannaki | f.write('%s\n' % elem)
|
791 | cfac048c | Giorgos Verigakis | |
792 | 8fe01d72 | Sofia Papagiannaki | def print_versions(data, f=stdout): |
793 | 8fe01d72 | Sofia Papagiannaki | if 'versions' not in data: |
794 | 8fe01d72 | Sofia Papagiannaki | f.write('%s\n' %data)
|
795 | 8fe01d72 | Sofia Papagiannaki | return
|
796 | 8fe01d72 | Sofia Papagiannaki | f.write('versions:\n')
|
797 | 8fe01d72 | Sofia Papagiannaki | for id, t in data['versions']: |
798 | e414f54d | Sofia Papagiannaki | f.write('%s @ %s\n' % (str(id).rjust(30), datetime.fromtimestamp(float(t)))) |
799 | 8fe01d72 | Sofia Papagiannaki | |
800 | 9e826a59 | Kostas Papadimitriou | |
801 | cfac048c | Giorgos Verigakis | def main(): |
802 | cfac048c | Giorgos Verigakis | try:
|
803 | cfac048c | Giorgos Verigakis | name = argv[1]
|
804 | cfac048c | Giorgos Verigakis | cls = class_for_cli_command(name) |
805 | cfac048c | Giorgos Verigakis | except (IndexError, KeyError): |
806 | cfac048c | Giorgos Verigakis | print_usage() |
807 | cfac048c | Giorgos Verigakis | exit(1) |
808 | f07c5a53 | Sofia Papagiannaki | |
809 | a2defd86 | Sofia Papagiannaki | cmd = cls(name, argv[2:])
|
810 | cfac048c | Giorgos Verigakis | |
811 | 95e92490 | Sofia Papagiannaki | try:
|
812 | 95e92490 | Sofia Papagiannaki | cmd.execute(*cmd.args) |
813 | 95e92490 | Sofia Papagiannaki | except TypeError, e: |
814 | 95e92490 | Sofia Papagiannaki | cmd.parser.print_help() |
815 | 95e92490 | Sofia Papagiannaki | exit(1) |
816 | 95e92490 | Sofia Papagiannaki | except Fault, f:
|
817 | af6d3b5d | Antony Chazapis | status = '%s ' % f.status if f.status else '' |
818 | 95e92490 | Sofia Papagiannaki | print '%s%s' % (status, f.data) |
819 | cfac048c | Giorgos Verigakis | |
820 | 9e826a59 | Kostas Papadimitriou | |
821 | cfac048c | Giorgos Verigakis | if __name__ == '__main__': |
822 | cfac048c | Giorgos Verigakis | main() |