Statistics
| Branch: | Tag: | Revision:

root / contrib / snf-pithos-tools / pithos / tools / fs.py @ faad3c72

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 896754a6 Christos Stavrakakis
45 896754a6 Christos Stavrakakis
from snf_django.lib.api.parsedate import parse_http_date
46 6e147ecc Antony Chazapis
47 6e147ecc Antony Chazapis
from pithos.tools.lib.client import OOS_Client, Fault
48 6e147ecc Antony Chazapis
from pithos.tools.lib.fuse import FUSE, FuseOSError, Operations
49 6e147ecc Antony Chazapis
from pithos.tools.lib.util import get_user, get_auth, get_url
50 51f905a2 Giorgos Verigakis
51 51f905a2 Giorgos Verigakis
52 51f905a2 Giorgos Verigakis
epoch = int(time())
53 51f905a2 Giorgos Verigakis
54 51f905a2 Giorgos Verigakis
55 51f905a2 Giorgos Verigakis
class StoreFS(Operations):
56 2152daa0 Giorgos Verigakis
    def __init__(self, verbose=False):
57 51f905a2 Giorgos Verigakis
        self.verbose = verbose
58 43cc6f76 Sofia Papagiannaki
        self.client = OOS_Client(get_url(), get_auth(), get_user())
59 2715ade4 Sofia Papagiannaki
60 51f905a2 Giorgos Verigakis
    def __call__(self, op, path, *args):
61 51f905a2 Giorgos Verigakis
        container, sep, object = path[1:].partition('/')
62 51f905a2 Giorgos Verigakis
        if self.verbose:
63 51f905a2 Giorgos Verigakis
            data = repr(args)[:100]
64 51f905a2 Giorgos Verigakis
            print '-> %s %r %r %r' % (op, container, object, data)
65 51f905a2 Giorgos Verigakis
        ret = '[Unhandled Exception]'
66 2715ade4 Sofia Papagiannaki
67 51f905a2 Giorgos Verigakis
        try:
68 51f905a2 Giorgos Verigakis
            if object:
69 71c0f614 Giorgos Verigakis
                func = getattr(self, 'object_' + op, None)
70 71c0f614 Giorgos Verigakis
                funcargs = (container, object) + args
71 51f905a2 Giorgos Verigakis
            elif container:
72 71c0f614 Giorgos Verigakis
                func = getattr(self, 'container_' + op, None)
73 71c0f614 Giorgos Verigakis
                funcargs = (container,) + args
74 51f905a2 Giorgos Verigakis
            else:
75 71c0f614 Giorgos Verigakis
                func = getattr(self, 'account_' + op, None)
76 71c0f614 Giorgos Verigakis
                funcargs = args
77 71c0f614 Giorgos Verigakis
78 71c0f614 Giorgos Verigakis
            if not func:
79 71c0f614 Giorgos Verigakis
                # Fallback to defaults
80 71c0f614 Giorgos Verigakis
                func = getattr(self, op)
81 71c0f614 Giorgos Verigakis
                funcargs = (path,) + args
82 2715ade4 Sofia Papagiannaki
83 71c0f614 Giorgos Verigakis
            ret = func(*funcargs)
84 51f905a2 Giorgos Verigakis
            return ret
85 51f905a2 Giorgos Verigakis
        except FuseOSError, e:
86 51f905a2 Giorgos Verigakis
            ret = str(e)
87 51f905a2 Giorgos Verigakis
            raise
88 51f905a2 Giorgos Verigakis
        finally:
89 51f905a2 Giorgos Verigakis
            if self.verbose:
90 51f905a2 Giorgos Verigakis
                print '<-', op, repr(ret)
91 2715ade4 Sofia Papagiannaki
92 51f905a2 Giorgos Verigakis
    def _get_container_meta(self, container, **kwargs):
93 51f905a2 Giorgos Verigakis
        try:
94 51f905a2 Giorgos Verigakis
            return self.client.retrieve_container_metadata(container, **kwargs)
95 51f905a2 Giorgos Verigakis
        except Fault:
96 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
97 2715ade4 Sofia Papagiannaki
98 51f905a2 Giorgos Verigakis
    def _get_object_meta(self, container, object, **kwargs):
99 51f905a2 Giorgos Verigakis
        try:
100 51f905a2 Giorgos Verigakis
            return self.client.retrieve_object_metadata(container, object,
101 51f905a2 Giorgos Verigakis
                                                        **kwargs)
102 51f905a2 Giorgos Verigakis
        except Fault:
103 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
104 2715ade4 Sofia Papagiannaki
105 51f905a2 Giorgos Verigakis
    # Global
106 51f905a2 Giorgos Verigakis
    def statfs(self, path):
107 2715ade4 Sofia Papagiannaki
        return dict(f_bsize=1024, f_blocks=1024 ** 2, f_bfree=1024 ** 2,
108 2715ade4 Sofia Papagiannaki
                    f_bavail=1024 ** 2)
109 2715ade4 Sofia Papagiannaki
110 51f905a2 Giorgos Verigakis
    # Account Level
111 51f905a2 Giorgos Verigakis
    def account_chmod(self, mode):
112 71c0f614 Giorgos Verigakis
        self.client.update_account_metadata(mode=str(mode))
113 2715ade4 Sofia Papagiannaki
114 51f905a2 Giorgos Verigakis
    def account_chown(self, uid, gid):
115 51f905a2 Giorgos Verigakis
        self.client.update_account_metadata(uid=uid, gid=gid)
116 2715ade4 Sofia Papagiannaki
117 51f905a2 Giorgos Verigakis
    def account_getattr(self, fh=None):
118 71c0f614 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata()
119 51f905a2 Giorgos Verigakis
        mode = int(meta.get('x-account-meta-mode', 0755))
120 71c0f614 Giorgos Verigakis
        last_modified = meta.get('last-modified', None)
121 71c0f614 Giorgos Verigakis
        modified = parse_http_date(last_modified) if last_modified else epoch
122 51f905a2 Giorgos Verigakis
        count = int(meta['x-account-container-count'])
123 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
124 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
125 2715ade4 Sofia Papagiannaki
126 51f905a2 Giorgos Verigakis
        return {
127 51f905a2 Giorgos Verigakis
            'st_mode': S_IFDIR | mode,
128 51f905a2 Giorgos Verigakis
            'st_nlink': 2 + count,
129 51f905a2 Giorgos Verigakis
            'st_uid': uid,
130 51f905a2 Giorgos Verigakis
            'st_gid': gid,
131 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
132 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
133 51f905a2 Giorgos Verigakis
            'st_atime': modified}
134 2715ade4 Sofia Papagiannaki
135 51f905a2 Giorgos Verigakis
    def account_getxattr(self, name, position=0):
136 51f905a2 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata(restricted=True)
137 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
138 2715ade4 Sofia Papagiannaki
139 51f905a2 Giorgos Verigakis
    def account_listxattr(self):
140 51f905a2 Giorgos Verigakis
        meta = self.client.retrieve_account_metadata(restricted=True)
141 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
142 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
143 2715ade4 Sofia Papagiannaki
144 51f905a2 Giorgos Verigakis
    def account_readdir(self, fh):
145 2152daa0 Giorgos Verigakis
        return ['.', '..'] + self.client.list_containers() or []
146 2715ade4 Sofia Papagiannaki
147 51f905a2 Giorgos Verigakis
    def account_removexattr(self, name):
148 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
149 51f905a2 Giorgos Verigakis
        self.client.delete_account_metadata([attr])
150 2715ade4 Sofia Papagiannaki
151 51f905a2 Giorgos Verigakis
    def account_setxattr(self, name, value, options, position=0):
152 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
153 51f905a2 Giorgos Verigakis
        meta = {attr: value}
154 51f905a2 Giorgos Verigakis
        self.client.update_account_metadata(**meta)
155 2715ade4 Sofia Papagiannaki
156 51f905a2 Giorgos Verigakis
    # Container Level
157 51f905a2 Giorgos Verigakis
    def container_chmod(self, container, mode):
158 71c0f614 Giorgos Verigakis
        self.client.update_container_metadata(container, mode=str(mode))
159 2715ade4 Sofia Papagiannaki
160 51f905a2 Giorgos Verigakis
    def container_chown(self, container, uid, gid):
161 51f905a2 Giorgos Verigakis
        self.client.update_container_metadata(container, uid=uid, gid=gid)
162 2715ade4 Sofia Papagiannaki
163 51f905a2 Giorgos Verigakis
    def container_getattr(self, container, fh=None):
164 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container)
165 51f905a2 Giorgos Verigakis
        mode = int(meta.get('x-container-meta-mode', 0755))
166 51f905a2 Giorgos Verigakis
        modified = parse_http_date(meta['last-modified'])
167 51f905a2 Giorgos Verigakis
        count = int(meta['x-container-object-count'])
168 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
169 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
170 2715ade4 Sofia Papagiannaki
171 51f905a2 Giorgos Verigakis
        return {
172 51f905a2 Giorgos Verigakis
            'st_mode': S_IFDIR | mode,
173 51f905a2 Giorgos Verigakis
            'st_nlink': 2 + count,
174 51f905a2 Giorgos Verigakis
            'st_uid': uid,
175 51f905a2 Giorgos Verigakis
            'st_gid': gid,
176 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
177 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
178 51f905a2 Giorgos Verigakis
            'st_atime': modified}
179 2715ade4 Sofia Papagiannaki
180 51f905a2 Giorgos Verigakis
    def container_getxattr(self, container, name, position=0):
181 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container)
182 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
183 2715ade4 Sofia Papagiannaki
184 51f905a2 Giorgos Verigakis
    def container_listxattr(self, container):
185 51f905a2 Giorgos Verigakis
        meta = self._get_container_meta(container, restricted=True)
186 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
187 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
188 2715ade4 Sofia Papagiannaki
189 51f905a2 Giorgos Verigakis
    def container_mkdir(self, container, mode):
190 71c0f614 Giorgos Verigakis
        mode = str(mode & 0777)
191 71c0f614 Giorgos Verigakis
        self.client.create_container(container, mode=mode)
192 2715ade4 Sofia Papagiannaki
193 51f905a2 Giorgos Verigakis
    def container_readdir(self, container, fh):
194 2152daa0 Giorgos Verigakis
        objects = self.client.list_objects(container, delimiter='/', prefix='')
195 51f905a2 Giorgos Verigakis
        files = [o for o in objects if not o.endswith('/')]
196 51f905a2 Giorgos Verigakis
        return ['.', '..'] + files
197 2715ade4 Sofia Papagiannaki
198 51f905a2 Giorgos Verigakis
    def container_removexattr(self, container, name):
199 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
200 51f905a2 Giorgos Verigakis
        self.client.delete_container_metadata(container, [attr])
201 2715ade4 Sofia Papagiannaki
202 51f905a2 Giorgos Verigakis
    def container_rename(self, container, path):
203 51f905a2 Giorgos Verigakis
        new_container, sep, new_object = path[1:].partition('/')
204 51f905a2 Giorgos Verigakis
        if not new_container or new_object:
205 51f905a2 Giorgos Verigakis
            raise FuseOSError(EINVAL)
206 51f905a2 Giorgos Verigakis
        self.client.delete_container(container)
207 51f905a2 Giorgos Verigakis
        self.client.create_container(new_container)
208 2715ade4 Sofia Papagiannaki
209 51f905a2 Giorgos Verigakis
    def container_rmdir(self, container):
210 51f905a2 Giorgos Verigakis
        try:
211 51f905a2 Giorgos Verigakis
            self.client.delete_container(container)
212 51f905a2 Giorgos Verigakis
        except Fault:
213 51f905a2 Giorgos Verigakis
            raise FuseOSError(ENOENT)
214 2715ade4 Sofia Papagiannaki
215 51f905a2 Giorgos Verigakis
    def container_setxattr(self, container, name, value, options, position=0):
216 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
217 51f905a2 Giorgos Verigakis
        meta = {attr: value}
218 51f905a2 Giorgos Verigakis
        self.client.update_container_metadata(container, **meta)
219 2715ade4 Sofia Papagiannaki
220 51f905a2 Giorgos Verigakis
    # Object Level
221 51f905a2 Giorgos Verigakis
    def object_chmod(self, container, object, mode):
222 71c0f614 Giorgos Verigakis
        self.client.update_object_metadata(container, object, mode=str(mode))
223 2715ade4 Sofia Papagiannaki
224 51f905a2 Giorgos Verigakis
    def object_chown(self, container, uid, gid):
225 71c0f614 Giorgos Verigakis
        self.client.update_object_metadata(container, object,
226 2715ade4 Sofia Papagiannaki
                                           uid=str(uid), gid=str(gid))
227 2715ade4 Sofia Papagiannaki
228 51f905a2 Giorgos Verigakis
    def object_create(self, container, object, mode, fi=None):
229 51f905a2 Giorgos Verigakis
        mode &= 0777
230 71c0f614 Giorgos Verigakis
        self.client.create_object(container, object,
231 2715ade4 Sofia Papagiannaki
                                  f=None,
232 2715ade4 Sofia Papagiannaki
                                  content_type='application/octet-stream',
233 2715ade4 Sofia Papagiannaki
                                  mode=str(mode))
234 51f905a2 Giorgos Verigakis
        return 0
235 2715ade4 Sofia Papagiannaki
236 51f905a2 Giorgos Verigakis
    def object_getattr(self, container, object, fh=None):
237 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object)
238 51f905a2 Giorgos Verigakis
        modified = parse_http_date(meta['last-modified'])
239 51f905a2 Giorgos Verigakis
        uid = int(meta.get('x-account-meta-uid', 0))
240 51f905a2 Giorgos Verigakis
        gid = int(meta.get('x-account-meta-gid', 0))
241 2152daa0 Giorgos Verigakis
        size = int(meta.get('content-length', 0))
242 2715ade4 Sofia Papagiannaki
243 692485cc Antony Chazapis
        if meta['content-type'].split(';', 1)[0].strip() == 'application/directory':
244 2152daa0 Giorgos Verigakis
            mode = int(meta.get('x-object-meta-mode', 0755))
245 51f905a2 Giorgos Verigakis
            flags = S_IFDIR
246 51f905a2 Giorgos Verigakis
            nlink = 2
247 51f905a2 Giorgos Verigakis
        else:
248 2152daa0 Giorgos Verigakis
            mode = int(meta.get('x-object-meta-mode', 0644))
249 51f905a2 Giorgos Verigakis
            flags = S_IFREG
250 51f905a2 Giorgos Verigakis
            nlink = 1
251 2715ade4 Sofia Papagiannaki
252 51f905a2 Giorgos Verigakis
        return {
253 51f905a2 Giorgos Verigakis
            'st_mode': flags | mode,
254 51f905a2 Giorgos Verigakis
            'st_nlink': nlink,
255 51f905a2 Giorgos Verigakis
            'st_uid': uid,
256 51f905a2 Giorgos Verigakis
            'st_gid': gid,
257 51f905a2 Giorgos Verigakis
            'st_ctime': epoch,
258 51f905a2 Giorgos Verigakis
            'st_mtime': modified,
259 51f905a2 Giorgos Verigakis
            'st_atime': modified,
260 51f905a2 Giorgos Verigakis
            'st_size': size}
261 2715ade4 Sofia Papagiannaki
262 51f905a2 Giorgos Verigakis
    def object_getxattr(self, container, object, name, position=0):
263 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object, restricted=True)
264 51f905a2 Giorgos Verigakis
        return meta.get('xattr-' + name, '')
265 2715ade4 Sofia Papagiannaki
266 51f905a2 Giorgos Verigakis
    def object_listxattr(self, container, object):
267 51f905a2 Giorgos Verigakis
        meta = self._get_object_meta(container, object, restricted=True)
268 51f905a2 Giorgos Verigakis
        prefix = 'xattr-'
269 51f905a2 Giorgos Verigakis
        return [k[len(prefix):] for k in meta if k.startswith(prefix)]
270 2715ade4 Sofia Papagiannaki
271 51f905a2 Giorgos Verigakis
    def object_mkdir(self, container, object, mode):
272 71c0f614 Giorgos Verigakis
        mode = str(mode & 0777)
273 51f905a2 Giorgos Verigakis
        self.client.create_directory_marker(container, object)
274 51f905a2 Giorgos Verigakis
        self.client.update_object_metadata(container, object, mode=mode)
275 2715ade4 Sofia Papagiannaki
276 51f905a2 Giorgos Verigakis
    def object_read(self, container, object, nbyte, offset, fh):
277 51f905a2 Giorgos Verigakis
        data = self.client.retrieve_object(container, object)
278 51f905a2 Giorgos Verigakis
        return data[offset:offset + nbyte]
279 2715ade4 Sofia Papagiannaki
280 51f905a2 Giorgos Verigakis
    def object_readdir(self, container, object, fh):
281 2152daa0 Giorgos Verigakis
        objects = self.client.list_objects(container, delimiter='/',
282 2715ade4 Sofia Papagiannaki
                                           prefix=object)
283 51f905a2 Giorgos Verigakis
        files = [o.rpartition('/')[2] for o in objects if not o.endswith('/')]
284 51f905a2 Giorgos Verigakis
        return ['.', '..'] + files
285 2715ade4 Sofia Papagiannaki
286 51f905a2 Giorgos Verigakis
    def object_removexattr(self, container, object, name):
287 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
288 51f905a2 Giorgos Verigakis
        self.client.delete_object_metadata(container, object, [attr])
289 2715ade4 Sofia Papagiannaki
290 51f905a2 Giorgos Verigakis
    def object_rename(self, container, object, path):
291 51f905a2 Giorgos Verigakis
        new_container, sep, new_object = path[1:].partition('/')
292 51f905a2 Giorgos Verigakis
        if not new_container or not new_object:
293 51f905a2 Giorgos Verigakis
            raise FuseOSError(EINVAL)
294 51f905a2 Giorgos Verigakis
        self.client.move_object(container, object, new_container, new_object)
295 2715ade4 Sofia Papagiannaki
296 51f905a2 Giorgos Verigakis
    def object_rmdir(self, container, object):
297 51f905a2 Giorgos Verigakis
        self.client.delete_object(container, object)
298 2715ade4 Sofia Papagiannaki
299 51f905a2 Giorgos Verigakis
    def object_setxattr(self, container, object, name, value, options,
300 51f905a2 Giorgos Verigakis
                        position=0):
301 51f905a2 Giorgos Verigakis
        attr = 'xattr-' + name
302 51f905a2 Giorgos Verigakis
        meta = {attr: value}
303 51f905a2 Giorgos Verigakis
        self.client.update_object_metadata(container, object, **meta)
304 2715ade4 Sofia Papagiannaki
305 51f905a2 Giorgos Verigakis
    def object_truncate(self, container, object, length, fh=None):
306 51f905a2 Giorgos Verigakis
        data = self.client.retrieve_object(container, object)
307 51f905a2 Giorgos Verigakis
        f = StringIO(data[:length])
308 51f905a2 Giorgos Verigakis
        self.client.update_object(container, object, f)
309 2715ade4 Sofia Papagiannaki
310 51f905a2 Giorgos Verigakis
    def object_unlink(self, container, object):
311 51f905a2 Giorgos Verigakis
        self.client.delete_object(container, object)
312 2715ade4 Sofia Papagiannaki
313 51f905a2 Giorgos Verigakis
    def object_write(self, container, object, data, offset, fh):
314 51f905a2 Giorgos Verigakis
        f = StringIO(data)
315 71c0f614 Giorgos Verigakis
        self.client.update_object(container, object, f, offset=offset)
316 51f905a2 Giorgos Verigakis
        return len(data)
317 51f905a2 Giorgos Verigakis
318 51f905a2 Giorgos Verigakis
319 9e826a59 Kostas Papadimitriou
def main():
320 2152daa0 Giorgos Verigakis
    if len(argv) != 2:
321 2152daa0 Giorgos Verigakis
        print 'usage: %s <mountpoint>' % argv[0]
322 51f905a2 Giorgos Verigakis
        exit(1)
323 2715ade4 Sofia Papagiannaki
324 51f905a2 Giorgos Verigakis
    user = getuser()
325 2152daa0 Giorgos Verigakis
    fs = StoreFS(verbose=True)
326 2152daa0 Giorgos Verigakis
    fuse = FUSE(fs, argv[1], foreground=True)
327 9e826a59 Kostas Papadimitriou
328 9e826a59 Kostas Papadimitriou
329 9e826a59 Kostas Papadimitriou
if __name__ == '__main__':
330 9e826a59 Kostas Papadimitriou
    main()