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