-
- def getattr(self, path):
- """
- - st_mode (protection bits)
- - st_ino (inode number)
- - st_dev (device)
- - st_nlink (number of hard links)
- - st_uid (user ID of owner)
- - st_gid (group ID of owner)
- - st_size (size of file, in bytes)
- - st_atime (time of most recent access)
- - st_mtime (time of most recent content modification)
- - st_ctime (platform dependent; time of most recent metadata change on Unix,
- or the time of creation on Windows).
- """
-
- print "*** getattr: " + path
-
- depth = getDepth(path)
- parts = getParts(path)
-
- st = MyStat()
- if path == '/':
- st.st_mode = stat.S_IFDIR | 0755
- st.st_nlink = 2
- elif depth == 1:
- if parts[-1] in self.getMachines():
- st.st_mode = stat.S_IFDIR | 0755
- st.st_nlink = 2
- st.st_uid = st.st_gid = self.getUid(parts[0])
- else:
- return -errno.ENOENT
- elif depth == 2 and parts[-1] == '.k5login':
- st.st_mode = stat.S_IFREG | 0444
- st.st_nlink = 1
- st.st_size = len(self.getK5login(parts[0]))
- st.st_uid = st.st_gid = self.getUid(parts[0])
- else:
- stats = list(os.lstat(self.mirrorPath(path)))
- stats[4:6] = [self.getUid(parts[0])] * 2
- return tuple(stats)
- return st.toTuple()
-
- def readdir(self, path, offset):
- print '*** readdir', path, offset
- for (value, zero) in self.getdir(path):
- yield fuse.Direntry(value)
-
- def getdir(self, path):
- print '*** getdir', path
- if path == '/':
- contents = ['.', '..']+self.getMachines()
- elif getDepth(path) == 1:
- contents = set(os.listdir(self.mirrorPath(path)) + ['.k5login', '.', '..'])
- else:
- contents = os.listdir(self.mirrorPath(path)) + ['.', '..']
- return [(i, 0) for i in contents]
-
- def read ( self, path, length, offset ):
- print '*** read', path, length, offset
-
- parts = getParts(path)
-
- if getDepth(path) < 2:
- return -errno.ENOENT
- elif parts[1:] == ['.k5login']:
- if parts[0] not in self.getMachines():
- return -errno.ENOENT
- else:
- return self.getK5login(parts[0])[offset:length + offset]
- else:
- fname = self.mirrorPath(path)
- if not os.path.isfile(fname):
- return -errno.ENOENT
- else:
- f = open(fname)
- f.seek(offset)
- return f.read(length)