def rename(self, old, new): if old == new: return logger.debug('rename %s %s' % (old, new)) id = query.resolve_path(old) if not id: raise FuseOSError(errno.ENOENT) new_bn, old_bn = os.path.basename(new), os.path.basename(old) new_dn, old_dn = os.path.dirname(new), os.path.dirname(old) existing_id = query.resolve_path(new) if existing_id: en = query.get_node(existing_id) if en and en.is_file() and en.size == 0: trash.move_to_trash(existing_id) else: raise FuseOSError(errno.EEXIST) if new_bn != old_bn: self._rename(id, new_bn) if new_dn != old_dn: odir_id = query.resolve_path(old_dn) ndir_id = query.resolve_path(new_dn) if not odir_id or not ndir_id: raise FuseOSError(errno.ENOTDIR) self._move(id, odir_id, ndir_id)
def rename(self, old, new): if old == new: return id = query.resolve_path(old, False) if not id: raise FuseOSError(errno.ENOENT) new_bn, old_bn = os.path.basename(new), os.path.basename(old) new_dn, old_dn = os.path.dirname(new), os.path.dirname(old) existing_id = query.resolve_path(new, False) if existing_id: en = query.get_node(existing_id) if en and en.is_file(): trash.move_to_trash(existing_id) else: raise FuseOSError(errno.EEXIST) if new_bn != old_bn: self._rename(id, new_bn) if new_dn != old_dn: odir_id = query.resolve_path(old_dn, False) ndir_id = query.resolve_path(new_dn, False) if not odir_id or not ndir_id: raise FuseOSError(errno.ENOTDIR) self._move(id, odir_id, ndir_id)
def read(self, path, length, offset, fh): logger.debug("%s l %d o %d fh %d" % (path, length, offset, fh)) id = query.resolve_path(path, trash=False) b = io.BytesIO() # content.chunked_download(id, b, offset=offset, length=offset + length) content.download_chunk(id, b, offset=offset, length=length) return b.getvalue()
def read(self, path, length, offset, fh): logger.debug("read %s, ln: %d of: %d fh %d" % (os.path.basename(path), length, offset, fh)) id = query.resolve_path(path, trash=False) if query.file_size(id) == 0: return b'' return StreamedResponseCache.get(id, offset, length)
def create_action(args: argparse.Namespace) -> int: parent, folder = os.path.split(args.new_folder) # no trailing slash if not folder: parent, folder = os.path.split(parent) if not folder: logger.error('Cannot create folder with empty name.') return INVALID_ARG_RETVAL p_id = query.resolve_path(parent) if not p_id: logger.error('Invalid parent path "%s".' % parent) return INVALID_ARG_RETVAL try: r = content.create_folder(folder, p_id) sync.insert_folders([r]) except RequestError as e: logger.debug(str(e.status_code) + e.msg) if e.status_code == 409: logger.warning('Folder "%s" already exists.' % folder) else: logger.error('Error creating folder "%s".' % folder) return ERR_CR_FOLDER
def rmdir(self, path): n = query.resolve_path(path) if not n: raise FuseOSError(errno.ENOENT) try: r = trash.move_to_trash(n) sync.insert_node(r) except RequestError as e: if e.status_code == e.CODE.CONN_EXCEPTION: raise FuseOSError(errno.ECOMM) else: raise FuseOSError(errno.EREMOTEIO)
def mkdir(self, path, mode): name = os.path.basename(path) ppath = os.path.dirname(path) pid = query.resolve_path(ppath) if not pid: raise FuseOSError(errno.ENOTDIR) try: r = content.create_folder(name, pid) except RequestError as e: FuseOSError.convert(e) else: sync.insert_node(r)
def rename(self, old, new): id = query.resolve_path(old) new = os.path.basename(new) try: r = metadata.rename_node(id, new) sync.insert_node(r) except RequestError as e: if e.status_code == e.CODE.CONN_EXCEPTION: raise FuseOSError(errno.ECOMM) elif e.status_code == 409: raise FuseOSError(errno.EEXIST) else: raise FuseOSError(errno.EREMOTEIO)
def getattr(self, path, fh=None): id = query.resolve_path(path, trash=False) node = query.get_node(id) if not node: raise FuseOSError(errno.ENOENT) times = dict(st_atime=time(), st_mtime=(node.modified - datetime(1970, 1, 1)) / timedelta(seconds=1), st_ctime=(node.created - datetime(1970, 1, 1)) / timedelta(seconds=1)) if node.is_folder(): return dict(st_mode=stat.S_IFDIR | 0o7777, **times) if node.is_file(): return dict(st_mode=stat.S_IFREG | 0o6667, st_size=node.size, **times)
def create(self, path, mode): name = os.path.basename(path) ppath = os.path.dirname(path) pid = query.resolve_path(ppath, False) if not pid: raise FuseOSError(errno.ENOTDIR) try: r = content.create_file(name, pid) sync.insert_node(r) except RequestError as e: FuseOSError.convert(e) self.fh += 1 return self.fh
def resolve_remote_path_args(args: argparse.Namespace, attrs: list, exclude_actions: list): """Replaces certain attributes in Namespace by resolved node ID.""" for id_attr in attrs: if hasattr(args, id_attr): val = getattr(args, id_attr) if not val: continue if '/' in val: incl_trash = args.action not in exclude_actions v = query.resolve_path(val, trash=incl_trash) if not v: logger.error('Could not resolve path "%s".' % val) sys.exit(INVALID_ARG_RETVAL) logger.info('Resolved "%s" to "%s"' % (val, v)) setattr(args, id_attr, v) elif len(val) != 22: logger.critical('Invalid ID format: "%s".' % val) sys.exit(INVALID_ARG_RETVAL)
def create(self, path, mode): name = os.path.basename(path) ppath = os.path.dirname(path) pid = query.resolve_path(ppath) if not pid: raise FuseOSError(errno.ENOTDIR) try: r = content.create_file(name, pid) sync.insert_node(r) except RequestError as e: if e.status_code == e.CODE.CONN_EXCEPTION: raise FuseOSError(errno.ECOMM) elif e.status_code == 409: raise FuseOSError(errno.EEXIST) else: raise FuseOSError(errno.EREMOTEIO) return 0
def mkdir(self, path, mode): logger.debug('+mkdir %s' % path) name = os.path.basename(path) ppath = os.path.dirname(path) pid = query.resolve_path(ppath) if not pid: raise FuseOSError(errno.ENOTDIR) try: r = content.create_folder(name, pid) except RequestError as e: if e.status_code == e.CODE.CONN_EXCEPTION: raise FuseOSError(errno.ECOMM) elif e.status_code == 409: raise FuseOSError(errno.EEXIST) else: raise FuseOSError(errno.EREMOTEIO) else: sync.insert_node(r)
def getattr(self, path, fh=None): logger.debug('getattr %s' % path) id = query.resolve_path(path, trash=False) node = query.get_node(id) if not node: raise FuseOSError(errno.ENOENT) times = dict(st_atime=time(), st_mtime=(node.modified - datetime(1970, 1, 1)) / timedelta(seconds=1), st_ctime=(node.created - datetime(1970, 1, 1)) / timedelta(seconds=1)) if node.is_folder(): nlinks = 1 + len(node.parents) for c in node.children: if c.is_folder() and c.is_available(): nlinks += 1 return dict(st_mode=stat.S_IFDIR | 0o0777, st_nlink=nlinks, **times) if node.is_file(): return dict(st_mode=stat.S_IFREG | 0o0666, st_nlink=len(node.parents), st_size=node.size, **times)
def resolve_action(args: argparse.Namespace) -> int: node = query.resolve_path(args.path) if node: print(node) else: return INVALID_ARG_RETVAL
def readdir(self, path, fh): id = query.resolve_path(path, trash=False) return [_ for _ in ['.', '..'] + [b.node.name for b in query.list_children(id)]]