Esempio n. 1
0
    def remove(self, path):
        self._log(INFO, 'Removing file %s' % path)
        if self.getmeta("read_only"):
            raise errors.UnsupportedError('read only filesystem')

        if not self.isfile(path):
            if not self.isdir(path):
                raise errors.ResourceNotFoundError(path)
            raise errors.ResourceInvalidError(path)
        
        try:
            self.tahoeutil.unlink(self.dircap, path)
        except Exception, e:
            raise errors.ResourceInvalidError(path)
Esempio n. 2
0
 def open(self, path, mode='r', **kwargs):
     self._log(INFO, 'Opening file %s in mode %s' % (path, mode))        
     newfile = False
     if not self.exists(path):
         if 'w' in mode or 'a' in mode:
             newfile = True
         else:
             self._log(DEBUG, "File %s not found while opening for reads" % path)
             raise errors.ResourceNotFoundError(path)
     elif self.isdir(path):
         self._log(DEBUG, "Path %s is directory, not a file" % path)
         raise errors.ResourceInvalidError(path)
     elif 'w' in mode:
         newfile = True
     
     if newfile:
         self._log(DEBUG, 'Creating empty file %s' % path)
         if self.getmeta("read_only"):
             raise errors.UnsupportedError('read only filesystem')
         self.setcontents(path, b(''))
         handler = NullFile()
     else:
         self._log(DEBUG, 'Opening existing file %s for reading' % path)
         handler = self.getrange(path,0)
     
     return RemoteFileBuffer(self, path, mode, handler,
                 write_on_flush=False)
Esempio n. 3
0
    def _info(self, path, data):
        if isinstance(data, list):
            type = data[0]
            data = data[1]
        elif isinstance(data, dict):
            type = data['type']
        else:
            raise errors.ResourceInvalidError('Metadata in unknown format!')

        if type == 'unknown':
            raise errors.ResourceNotFoundError(path)

        info = {
            'name': str(self.fixwinpath(path, True)),
            'type': type,
            'size': data.get('size', 0),
            'ctime': None,
            'uri': data.get('rw_uri', data.get('ro_uri'))
        }
        if 'metadata' in data:
            info['ctime'] = data['metadata'].get('ctime')

        if info['type'] == 'dirnode':
            info['st_mode'] = 0o777 | statinfo.S_IFDIR
        else:
            info['st_mode'] = 0o644

        return info
Esempio n. 4
0
 def makedir(self, path, recursive=False, allow_recreate=False):
     self._log(INFO, "Creating directory %s" % path)
     if self.getmeta("read_only"):
         raise errors.UnsupportedError('read only filesystem')       
     if self.exists(path):
         if not self.isdir(path):
             raise errors.ResourceInvalidError(path)
         if not allow_recreate: 
             raise errors.DestinationExistsError(path)
     if not recursive and not self.exists(dirname(path)):
         raise errors.ParentDirectoryMissingError(path)
     self.tahoeutil.mkdir(self.dircap, path)
Esempio n. 5
0
    def list(self, dircap, path=None):
        path = self.fixwinpath(path, False)

        data = json.load(
            self.connection.get('/uri/%s%s' % (dircap, path), {'t': 'json'}))

        if len(data) < 2 or data[0] != 'dirnode':
            raise errors.ResourceInvalidError('Metadata in unknown format!')

        data = data[1]['children']
        for i in list(data.keys()):
            x = self._info(i, data[i])
            yield x
Esempio n. 6
0
 def _urlopen(self, req):
     try:
         return urlopen(req)
     except Exception, e:
         if not getattr(e, 'getcode', None):
             raise errors.RemoteConnectionError(str(e))
         code = e.getcode()
         if code == 500:
             # Probably out of space or unhappiness error
             raise errors.StorageSpaceError(e.fp.read())
         elif code in (400, 404, 410):
             # Standard not found
             raise errors.ResourceNotFoundError(e.fp.read())
         raise errors.ResourceInvalidError(e.fp.read())
Esempio n. 7
0
 def _urlopen(self, req):
     self.log.debug("_urlopen %s: %s" %
                    (repr(req), repr(req.get_full_url())))
     try:
         return urllib2.urlopen(req)
     except Exception, e:
         if not getattr(e, 'getcode', None):
             raise errors.RemoteConnectionError(str(e))
         code = e.getcode()
         if code == 500:
             raise errors.StorageSpaceError(e.fp.read())
         elif code in (400, 404, 410):
             raise errors.ResourceNotFoundError(e.fp.read())
         raise errors.ResourceInvalidError(e.fp.read())
Esempio n. 8
0
    def removedir(self, path, recursive=False, force=False):
        self._log(INFO, "Removing directory %s" % path) 
        if self.getmeta("read_only"):
            raise errors.UnsupportedError('read only filesystem')
        if not self.isdir(path):
            if not self.isfile(path):
                raise errors.ResourceNotFoundError(path)
            raise errors.ResourceInvalidError(path)
        if not force and self.listdir(path):
            raise errors.DirectoryNotEmptyError(path)
        
        self.tahoeutil.unlink(self.dircap, path)

        if recursive and path != '/':
            try:
                self.removedir(dirname(path), recursive=True)
            except errors.DirectoryNotEmptyError:
                pass