Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-tools / pithos / tools / fs.py @ 94a83ed6

History | View | Annotate | Download (12 kB)

1 51f905a2 Giorgos Verigakis
#!/usr/bin/env python
2 51f905a2 Giorgos Verigakis
3 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
4 2715ade4 Sofia Papagiannaki
#
5 51f905a2 Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
6 51f905a2 Giorgos Verigakis
# without modification, are permitted provided that the following
7 51f905a2 Giorgos Verigakis
# conditions are met:
8 2715ade4 Sofia Papagiannaki
#
9 51f905a2 Giorgos Verigakis
#   1. Redistributions of source code must retain the above
10 51f905a2 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
11 51f905a2 Giorgos Verigakis
#      disclaimer.
12 2715ade4 Sofia Papagiannaki
#
13 51f905a2 Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
14 51f905a2 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
15 51f905a2 Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
16 51f905a2 Giorgos Verigakis
#      provided with the distribution.
17 2715ade4 Sofia Papagiannaki
#
18 51f905a2 Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 51f905a2 Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 51f905a2 Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 51f905a2 Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 51f905a2 Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 51f905a2 Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 51f905a2 Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 51f905a2 Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 51f905a2 Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 51f905a2 Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 51f905a2 Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 51f905a2 Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
30 2715ade4 Sofia Papagiannaki
#
31 51f905a2 Giorgos Verigakis
# The views and conclusions contained in the software and
32 51f905a2 Giorgos Verigakis
# documentation are those of the authors and should not be
33 51f905a2 Giorgos Verigakis
# interpreted as representing official policies, either expressed
34 51f905a2 Giorgos Verigakis
# or implied, of GRNET S.A.
35 51f905a2 Giorgos Verigakis
36 51f905a2 Giorgos Verigakis
from cStringIO import StringIO
37 51f905a2 Giorgos Verigakis
from errno import (EACCES, EBADF, EINVAL, EISDIR, EIO, ENOENT, ENOTDIR,
38 2715ade4 Sofia Papagiannaki
                   ENOTEMPTY)
39 51f905a2 Giorgos Verigakis
from getpass import getuser
40 51f905a2 Giorgos Verigakis
from stat import S_IFDIR, S_IFREG
41 51f905a2 Giorgos Verigakis
from sys import argv
42 51f905a2 Giorgos Verigakis
from time import time
43 51f905a2 Giorgos Verigakis
44 6e147ecc Antony Chazapis
from synnefo.lib.parsedate import parse_http_date
45 6e147ecc Antony Chazapis
46 6e147ecc Antony Chazapis
from pithos.tools.lib.client import OOS_Client, Fault
47 6e147ecc Antony Chazapis
from pithos.tools.lib.fuse import FUSE, FuseOSError, Operations
48 6e147ecc Antony Chazapis
from pithos.tools.lib.util import get_user, get_auth, get_url
49 51f905a2 Giorgos Verigakis
50 51f905a2 Giorgos Verigakis
51 51f905a2 Giorgos Verigakis
epoch = int(time())
52 51f905a2 Giorgos Verigakis
53 51f905a2 Giorgos Verigakis
54 51f905a2 Giorgos Verigakis
class StoreFS(Operations):
55 2152daa0 Giorgos Verigakis
    def __init__(self, verbose=False):
56 51f905a2 Giorgos Verigakis
        self.verbose = verbose
57 43cc6f76 Sofia Papagiannaki
        self.client = OOS_Client(get_url(), get_auth(), get_user())
58 2715ade4 Sofia Papagiannaki
59 51f905a2 Giorgos Verigakis
    def __call__(self, op, path, *args):
60 51f905a2 Giorgos Verigakis
        container, sep, object = path[1:].partition('/')
61 51f905a2 Giorgos Verigakis
        if self.verbose:
62 51f905a2 Giorgos Verigakis
            data = repr(args)[:100]
63 51f905a2 Giorgos Verigakis
            print '-> %s %r %r %r' % (op, container, object, data)
64 51f905a2 Giorgos Verigakis
        ret = '[Unhandled Exception]'
65 2715ade4 Sofia Papagiannaki
66 51f905a2 Giorgos Verigakis
        try:
67 51f905a2 Giorgos Verigakis
            if object:
68 71c0f614 Giorgos Verigakis
                func = getattr(self, 'object_' + op, None)
69 71c0f614 Giorgos Verigakis
                funcargs = (container, object) + args
70 51f905a2 Giorgos Verigakis
            elif container:
71 71c0f614 Giorgos Verigakis
                func = getattr(self, 'container_' + op, None)
72 71c0f614 Giorgos Verigakis
                funcargs = (container,) + args
73 51f905a2 Giorgos Verigakis
            else:
74 71c0f614 Giorgos Verigakis
                func = getattr(self, 'account_' + op, None)
75 71c0f614 Giorgos Verigakis
                funcargs = args
76 71c0f614 Giorgos Verigakis
77 71c0f614 Giorgos Verigakis
            if not func:
78 71c0f614 Giorgos Verigakis
                # Fallback to defaults
79 71c0f614 Giorgos Verigakis
                func = getattr(self, op)
80 71c0f614 Giorgos Verigakis
                funcargs = (path,) + args
81 2715ade4 Sofia Papagiannaki
82 71c0f614 Giorgos Verigakis
            ret = func(*funcargs)
83 51f905a2 Giorgos Verigakis
            return ret
84 51f905a2 Giorgos Verigakis
        except FuseOSError, e:
85 51f905a2 Giorgos Verigakis
            ret = str(e)
86 51f905a2 Giorgos Verigakis
            raise
87 51f905a2 Giorgos Verigakis
        finally:
88 51f905a2 Giorgos Verigakis
            if self.verbose:
89 51f905a2 Giorgos Verigakis
                print '<-', op, repr(ret)
90 2715ade4 Sofia Papagiannaki
91 51f905a2 Giorgos Verigakis
    def _get_container_meta(self, container, **kwargs):
92 51f905a2 Giorgos Verigakis
        try:
93 51f905a2 Giorgos Verigakis
            return self.client.retrieve_container_metadata(container, **kwargs)
94 51f905a2 Giorgos Verigakis
        except Fault:
95 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
96 2715ade4 Sofia Papagiannaki
97 51f905a2 Giorgos Verigakis
    def _get_object_meta(self, container, object, **kwargs):
98 51f905a2 Giorgos Verigakis
        try:
99 51f905a2 Giorgos Verigakis
            return self.client.retrieve_object_metadata(container, object,
100 51f905a2 Giorgos Verigakis
                                                        **kwargs)
101 51f905a2 Giorgos Verigakis
        except Fault:
102 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
103 2715ade4 Sofia Papagiannaki
104 51f905a2 Giorgos Verigakis
    # Global
105 51f905a2 Giorgos Verigakis
    def statfs(self, path):
106 2715ade4 Sofia Papagiannaki
        return dict(f_bsize=1024, f_blocks=1024 ** 2, f_bfree=1024 ** 2,
107 2715ade4 Sofia Papagiannaki
                    f_bavail=1024 ** 2)
108 2715ade4 Sofia Papagiannaki
109 51f905a2 Giorgos Verigakis
    # Account Level
110 51f905a2 Giorgos Verigakis
    def account_chmod(self, mode):
111 71c0f614 Giorgos Verigakis
        self.client.update_account_metadata(mode=str(mode))
112 2715ade4 Sofia Papagiannaki
113 51f905a2 Giorgos Verigakis
    def account_chown(self, uid, gid):
114 51f905a2 Giorgos Verigakis
        self.client.update_account_metadata(uid=uid, gid=gid)
115 2715ade4 Sofia Papagiannaki
116 51f905a2 Giorgos Verigakis
    def account_getattr(self, fh=None):
117 71c0f614 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata()
118 51f905a2 Giorgos Verigakis
        mode = int(meta.get('x-account-meta-mode', 0755))
119 71c0f614 Giorgos Verigakis
        last_modified = meta.get('last-modified', None)
120 71c0f614 Giorgos Verigakis
        modified = parse_http_date(last_modified) if last_modified else epoch
121 51f905a2 Giorgos Verigakis
        count = int(meta['x-account-container-count'])
122 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
123 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
124 2715ade4 Sofia Papagiannaki
125 51f905a2 Giorgos Verigakis
        return {
126 51f905a2 Giorgos Verigakis
            'st_mode': S_IFDIR | mode,
127 51f905a2 Giorgos Verigakis
            'st_nlink': 2 + count,
128 51f905a2 Giorgos Verigakis
            'st_uid': uid,
129 51f905a2 Giorgos Verigakis
            'st_gid': gid,
130 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
131 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
132 51f905a2 Giorgos Verigakis
            'st_atime': modified}
133 2715ade4 Sofia Papagiannaki
134 51f905a2 Giorgos Verigakis
    def account_getxattr(self, name, position=0):
135 51f905a2 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata(restricted=True)
136 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
137 2715ade4 Sofia Papagiannaki
138 51f905a2 Giorgos Verigakis
    def account_listxattr(self):
139 51f905a2 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata(restricted=True)
140 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
141 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
142 2715ade4 Sofia Papagiannaki
143 51f905a2 Giorgos Verigakis
    def account_readdir(self, fh):
144 2152daa0 Giorgos Verigakis
        return ['.', '..'] + self.client.list_containers() or []
145 2715ade4 Sofia Papagiannaki
146 51f905a2 Giorgos Verigakis
    def account_removexattr(self, name):
147 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
148 51f905a2 Giorgos Verigakis
        self.client.delete_account_metadata([attr])
149 2715ade4 Sofia Papagiannaki
150 51f905a2 Giorgos Verigakis
    def account_setxattr(self, name, value, options, position=0):
151 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
152 51f905a2 Giorgos Verigakis
        meta = {attr: value}
153 51f905a2 Giorgos Verigakis
        self.client.update_account_metadata(**meta)
154 2715ade4 Sofia Papagiannaki
155 51f905a2 Giorgos Verigakis
    # Container Level
156 51f905a2 Giorgos Verigakis
    def container_chmod(self, container, mode):
157 71c0f614 Giorgos Verigakis
        self.client.update_container_metadata(container, mode=str(mode))
158 2715ade4 Sofia Papagiannaki
159 51f905a2 Giorgos Verigakis
    def container_chown(self, container, uid, gid):
160 51f905a2 Giorgos Verigakis
        self.client.update_container_metadata(container, uid=uid, gid=gid)
161 2715ade4 Sofia Papagiannaki
162 51f905a2 Giorgos Verigakis
    def container_getattr(self, container, fh=None):
163 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container)
164 51f905a2 Giorgos Verigakis
        mode = int(meta.get('x-container-meta-mode', 0755))
165 51f905a2 Giorgos Verigakis
        modified = parse_http_date(meta['last-modified'])
166 51f905a2 Giorgos Verigakis
        count = int(meta['x-container-object-count'])
167 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
168 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
169 2715ade4 Sofia Papagiannaki
170 51f905a2 Giorgos Verigakis
        return {
171 51f905a2 Giorgos Verigakis
            'st_mode': S_IFDIR | mode,
172 51f905a2 Giorgos Verigakis
            'st_nlink': 2 + count,
173 51f905a2 Giorgos Verigakis
            'st_uid': uid,
174 51f905a2 Giorgos Verigakis
            'st_gid': gid,
175 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
176 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
177 51f905a2 Giorgos Verigakis
            'st_atime': modified}
178 2715ade4 Sofia Papagiannaki
179 51f905a2 Giorgos Verigakis
    def container_getxattr(self, container, name, position=0):
180 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container)
181 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
182 2715ade4 Sofia Papagiannaki
183 51f905a2 Giorgos Verigakis
    def container_listxattr(self, container):
184 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container, restricted=True)
185 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
186 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
187 2715ade4 Sofia Papagiannaki
188 51f905a2 Giorgos Verigakis
    def container_mkdir(self, container, mode):
189 71c0f614 Giorgos Verigakis
        mode = str(mode & 0777)
190 71c0f614 Giorgos Verigakis
        self.client.create_container(container, mode=mode)
191 2715ade4 Sofia Papagiannaki
192 51f905a2 Giorgos Verigakis
    def container_readdir(self, container, fh):
193 2152daa0 Giorgos Verigakis
        objects = self.client.list_objects(container, delimiter='/', prefix='')
194 51f905a2 Giorgos Verigakis
        files = [o for o in objects if not o.endswith('/')]
195 51f905a2 Giorgos Verigakis
        return ['.', '..'] + files
196 2715ade4 Sofia Papagiannaki
197 51f905a2 Giorgos Verigakis
    def container_removexattr(self, container, name):
198 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
199 51f905a2 Giorgos Verigakis
        self.client.delete_container_metadata(container, [attr])
200 2715ade4 Sofia Papagiannaki
201 51f905a2 Giorgos Verigakis
    def container_rename(self, container, path):
202 51f905a2 Giorgos Verigakis
        new_container, sep, new_object = path[1:].partition('/')
203 51f905a2 Giorgos Verigakis
        if not new_container or new_object:
204 51f905a2 Giorgos Verigakis
            raise FuseOSError(EINVAL)
205 51f905a2 Giorgos Verigakis
        self.client.delete_container(container)
206 51f905a2 Giorgos Verigakis
        self.client.create_container(new_container)
207 2715ade4 Sofia Papagiannaki
208 51f905a2 Giorgos Verigakis
    def container_rmdir(self, container):
209 51f905a2 Giorgos Verigakis
        try:
210 51f905a2 Giorgos Verigakis
            self.client.delete_container(container)
211 51f905a2 Giorgos Verigakis
        except Fault:
212 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
213 2715ade4 Sofia Papagiannaki
214 51f905a2 Giorgos Verigakis
    def container_setxattr(self, container, name, value, options, position=0):
215 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
216 51f905a2 Giorgos Verigakis
        meta = {attr: value}
217 51f905a2 Giorgos Verigakis
        self.client.update_container_metadata(container, **meta)
218 2715ade4 Sofia Papagiannaki
219 51f905a2 Giorgos Verigakis
    # Object Level
220 51f905a2 Giorgos Verigakis
    def object_chmod(self, container, object, mode):
221 71c0f614 Giorgos Verigakis
        self.client.update_object_metadata(container, object, mode=str(mode))
222 2715ade4 Sofia Papagiannaki
223 51f905a2 Giorgos Verigakis
    def object_chown(self, container, uid, gid):
224 71c0f614 Giorgos Verigakis
        self.client.update_object_metadata(container, object,
225 2715ade4 Sofia Papagiannaki
                                           uid=str(uid), gid=str(gid))
226 2715ade4 Sofia Papagiannaki
227 51f905a2 Giorgos Verigakis
    def object_create(self, container, object, mode, fi=None):
228 51f905a2 Giorgos Verigakis
        mode &= 0777
229 71c0f614 Giorgos Verigakis
        self.client.create_object(container, object,
230 2715ade4 Sofia Papagiannaki
                                  f=None,
231 2715ade4 Sofia Papagiannaki
                                  content_type='application/octet-stream',
232 2715ade4 Sofia Papagiannaki
                                  mode=str(mode))
233 51f905a2 Giorgos Verigakis
        return 0
234 2715ade4 Sofia Papagiannaki
235 51f905a2 Giorgos Verigakis
    def object_getattr(self, container, object, fh=None):
236 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object)
237 51f905a2 Giorgos Verigakis
        modified = parse_http_date(meta['last-modified'])
238 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
239 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
240 2152daa0 Giorgos Verigakis
        size = int(meta.get('content-length', 0))
241 2715ade4 Sofia Papagiannaki
242 692485cc Antony Chazapis
        if meta['content-type'].split(';', 1)[0].strip() == 'application/directory':
243 2152daa0 Giorgos Verigakis
            mode = int(meta.get('x-object-meta-mode', 0755))
244 51f905a2 Giorgos Verigakis
            flags = S_IFDIR
245 51f905a2 Giorgos Verigakis
            nlink = 2
246 51f905a2 Giorgos Verigakis
        else:
247 2152daa0 Giorgos Verigakis
            mode = int(meta.get('x-object-meta-mode', 0644))
248 51f905a2 Giorgos Verigakis
            flags = S_IFREG
249 51f905a2 Giorgos Verigakis
            nlink = 1
250 2715ade4 Sofia Papagiannaki
251 51f905a2 Giorgos Verigakis
        return {
252 51f905a2 Giorgos Verigakis
            'st_mode': flags | mode,
253 51f905a2 Giorgos Verigakis
            'st_nlink': nlink,
254 51f905a2 Giorgos Verigakis
            'st_uid': uid,
255 51f905a2 Giorgos Verigakis
            'st_gid': gid,
256 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
257 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
258 51f905a2 Giorgos Verigakis
            'st_atime': modified,
259 51f905a2 Giorgos Verigakis
            'st_size': size}
260 2715ade4 Sofia Papagiannaki
261 51f905a2 Giorgos Verigakis
    def object_getxattr(self, container, object, name, position=0):
262 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object, restricted=True)
263 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
264 2715ade4 Sofia Papagiannaki
265 51f905a2 Giorgos Verigakis
    def object_listxattr(self, container, object):
266 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object, restricted=True)
267 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
268 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
269 2715ade4 Sofia Papagiannaki
270 51f905a2 Giorgos Verigakis
    def object_mkdir(self, container, object, mode):
271 71c0f614 Giorgos Verigakis
        mode = str(mode & 0777)
272 51f905a2 Giorgos Verigakis
        self.client.create_directory_marker(container, object)
273 51f905a2 Giorgos Verigakis
        self.client.update_object_metadata(container, object, mode=mode)
274 2715ade4 Sofia Papagiannaki
275 51f905a2 Giorgos Verigakis
    def object_read(self, container, object, nbyte, offset, fh):
276 51f905a2 Giorgos Verigakis
        data = self.client.retrieve_object(container, object)
277 51f905a2 Giorgos Verigakis
        return data[offset:offset + nbyte]
278 2715ade4 Sofia Papagiannaki
279 51f905a2 Giorgos Verigakis
    def object_readdir(self, container, object, fh):
280 2152daa0 Giorgos Verigakis
        objects = self.client.list_objects(container, delimiter='/',
281 2715ade4 Sofia Papagiannaki
                                           prefix=object)
282 51f905a2 Giorgos Verigakis
        files = [o.rpartition('/')[2] for o in objects if not o.endswith('/')]
283 51f905a2 Giorgos Verigakis
        return ['.', '..'] + files
284 2715ade4 Sofia Papagiannaki
285 51f905a2 Giorgos Verigakis
    def object_removexattr(self, container, object, name):
286 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
287 51f905a2 Giorgos Verigakis
        self.client.delete_object_metadata(container, object, [attr])
288 2715ade4 Sofia Papagiannaki
289 51f905a2 Giorgos Verigakis
    def object_rename(self, container, object, path):
290 51f905a2 Giorgos Verigakis
        new_container, sep, new_object = path[1:].partition('/')
291 51f905a2 Giorgos Verigakis
        if not new_container or not new_object:
292 51f905a2 Giorgos Verigakis
            raise FuseOSError(EINVAL)
293 51f905a2 Giorgos Verigakis
        self.client.move_object(container, object, new_container, new_object)
294 2715ade4 Sofia Papagiannaki
295 51f905a2 Giorgos Verigakis
    def object_rmdir(self, container, object):
296 51f905a2 Giorgos Verigakis
        self.client.delete_object(container, object)
297 2715ade4 Sofia Papagiannaki
298 51f905a2 Giorgos Verigakis
    def object_setxattr(self, container, object, name, value, options,
299 51f905a2 Giorgos Verigakis
                        position=0):
300 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
301 51f905a2 Giorgos Verigakis
        meta = {attr: value}
302 51f905a2 Giorgos Verigakis
        self.client.update_object_metadata(container, object, **meta)
303 2715ade4 Sofia Papagiannaki
304 51f905a2 Giorgos Verigakis
    def object_truncate(self, container, object, length, fh=None):
305 51f905a2 Giorgos Verigakis
        data = self.client.retrieve_object(container, object)
306 51f905a2 Giorgos Verigakis
        f = StringIO(data[:length])
307 51f905a2 Giorgos Verigakis
        self.client.update_object(container, object, f)
308 2715ade4 Sofia Papagiannaki
309 51f905a2 Giorgos Verigakis
    def object_unlink(self, container, object):
310 51f905a2 Giorgos Verigakis
        self.client.delete_object(container, object)
311 2715ade4 Sofia Papagiannaki
312 51f905a2 Giorgos Verigakis
    def object_write(self, container, object, data, offset, fh):
313 51f905a2 Giorgos Verigakis
        f = StringIO(data)
314 71c0f614 Giorgos Verigakis
        self.client.update_object(container, object, f, offset=offset)
315 51f905a2 Giorgos Verigakis
        return len(data)
316 51f905a2 Giorgos Verigakis
317 51f905a2 Giorgos Verigakis
318 9e826a59 Kostas Papadimitriou
def main():
319 2152daa0 Giorgos Verigakis
    if len(argv) != 2:
320 2152daa0 Giorgos Verigakis
        print 'usage: %s <mountpoint>' % argv[0]
321 51f905a2 Giorgos Verigakis
        exit(1)
322 2715ade4 Sofia Papagiannaki
323 51f905a2 Giorgos Verigakis
    user = getuser()
324 2152daa0 Giorgos Verigakis
    fs = StoreFS(verbose=True)
325 2152daa0 Giorgos Verigakis
    fuse = FUSE(fs, argv[1], foreground=True)
326 9e826a59 Kostas Papadimitriou
327 9e826a59 Kostas Papadimitriou
328 9e826a59 Kostas Papadimitriou
if __name__ == '__main__':
329 9e826a59 Kostas Papadimitriou
    main()