Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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()
Example #4
0
    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)
Example #5
0
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
Example #6
0
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
Example #7
0
 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)
Example #8
0
    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)
Example #9
0
 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)
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
    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
Example #13
0
    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
Example #14
0
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)
Example #15
0
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)
Example #16
0
    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
Example #17
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)
Example #18
0
    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)
Example #19
0
def resolve_action(args: argparse.Namespace) -> int:
    node = query.resolve_path(args.path)
    if node:
        print(node)
    else:
        return INVALID_ARG_RETVAL
Example #20
0
    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)]]
Example #21
0
def resolve_action(args: argparse.Namespace) -> int:
    node = query.resolve_path(args.path)
    if node:
        print(node)
    else:
        return INVALID_ARG_RETVAL