Welcome to mirror list, hosted at ThFree Co, Russian Federation.

bvfsfile.py « node « fuse « bareos - github.com/bareos/python-bareos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 06e7fc4b9855654b2db2321bd0040044c32e29cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""
Bareos specific Fuse node.
"""

from   bareos.fuse.node.bvfscommon import BvfsCommon
from   bareos.fuse.node.file import File
import errno
import os

class BvfsFile(File, BvfsCommon):
    def __init__(self, root, file, bvfspath):
        super(BvfsFile, self).__init__(root, file['name'], content = None)
        self.file = file
        self.bvfspath = bvfspath
        self.id = self.get_id(file, bvfspath)
        BvfsCommon.init(self, self.root, self.file['jobid'], self.bvfspath,  self.file['name'], self.file['stat'])

    @classmethod
    def get_id(cls, file, bvfspath):
        return str(file['fileid'])

    # Filesystem methods
    # ==================

    def readlink(self, path):
        self.logger.debug( "readlink %s" % (path) )
        try:
            pathname = os.readlink(self.restorepathfull)
            if pathname.startswith("/"):
                # Path name is absolute, sanitize it.
                return str(os.path.relpath(pathname, self.restorepath))
            else:
                return str(pathname)
        except OSError:
            return -errno.ENOENT

    def setxattr(self, path, key, value, flags):
        if path.len() == 0:
            if key == self.XattrKeyRestoreTrigger and value == "restore":
                if not self.root.restoreclient:
                    self.logger.error("no restoreclient given, files can not be restored")
                    return -errno.EPERM
                if not self.root.restorepath:
                    self.logger.error("no restorepath given, files can not be restored")
                    return -errno.EPERM
                else:
                    self.restore(path, None, [ self.file['fileid'] ])
        return super(BvfsFile, self).setxattr(path, key, value, flags)


    # File methods
    # ============

    def open(self, path, flags):
        return os.open(self.restorepathfull, flags)

    #def create(self, path, mode, fi=None):
        #full_path = self._full_path(path)
        #return os.open(full_path, os.O_WRONLY | os.O_CREAT, mode)

    def read(self, path, length, offset):
        try:
            fh=self.open(path, os.O_RDONLY)
            os.lseek(fh, offset, os.SEEK_SET)
            return os.read(fh, length)
        except OSError:
            return -errno.ENOENT

    #def write(self, path, buf, offset, fh):
        #os.lseek(fh, offset, os.SEEK_SET)
        #return os.write(fh, buf)

    #def truncate(self, path, length, fh=None):
        #full_path = self._full_path(path)
        #with open(full_path, 'r+') as f:
            #f.truncate(length)

    #def flush(self, path, fh):
        #return os.fsync(fh)

    #def release(self, path, fh):
        #return os.close(fh)

    #def fsync(self, path, fdatasync, fh):
        #return self.flush(path, fh)