X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/python-routefs.git/blobdiff_plain/7cabb211aef08afe8aacbc91415d992b8a45a669..837e818319e2394caf2dcab5e40b18dcad3c6f0b:/routefs/__init__.py diff --git a/routefs/__init__.py b/routefs/__init__.py index a9a9144..294ec93 100644 --- a/routefs/__init__.py +++ b/routefs/__init__.py @@ -7,13 +7,17 @@ inspired by filesystems, and now you can have filesystems inspired by URLs. """ -import fuse -import routes + import errno import stat +import fuse +import routes + + fuse.fuse_python_api = (0, 2) + class RouteStat(fuse.Stat): """ RouteStat is a descendent of fuse.Stat, defined to make sure that @@ -31,10 +35,11 @@ class RouteStat(fuse.Stat): self.st_mtime = 0 self.st_ctime = 0 + class RouteFS(fuse.Fuse): """ RouteFS: Web 2.0 for filesystems - + Any method that will be used as the controller in a Routes mapping (either by explicitly specifying the controller or by using the ':controller' variable) must be added to RouteFS.controllers @@ -42,21 +47,21 @@ class RouteFS(fuse.Fuse): controllers = [] def __init__(self, *args, **kwargs): super(RouteFS, self).__init__(*args, **kwargs) - + self.map = self.make_map() self.map.create_regs(self.controllers) - + def make_map(self): """ This method should be overridden by descendents of RouteFS to define the routing for the filesystem """ m = routes.Mapper() - + m.connect(':controller') - + return m - + def _get_file(self, path): """ Find the filesystem entry object for a given path @@ -73,36 +78,36 @@ class RouteFS(fuse.Fuse): if type(result) is list: result = Directory(result) return result - + def readdir(self, path, offset): """ If the path referred to is a directory, return the elements of that diectory """ return self._get_file(path).readdir(offset) - + def getattr(self, path): """ Return the stat information for a path - + The stat information for a directory, symlink, or file is predetermined based on which it is. """ return self._get_file(path).getattr() - + def read(self, path, length, offset): """ If the path specified is a file, return the requested portion of the file """ return self._get_file(path).read(length, offset) - + def readlink(self, path): """ If the path specified is a symlink, return the target """ return self._get_file(path).readlink() - + def write(self, path, buf, offset): """ If the path specified is a file, call the appropriate member @@ -110,6 +115,7 @@ class RouteFS(fuse.Fuse): """ return self._get_file(path).write(buf, offset) + class TreeKey(object): def getattr(self): return -errno.EINVAL @@ -122,6 +128,7 @@ class TreeKey(object): def write(self, length, offset): return -errno.EINVAL + class NoEntry(TreeKey): def getattr(self): return -errno.ENOENT @@ -134,20 +141,22 @@ class NoEntry(TreeKey): def write(self, length, offset): return -errno.ENOENT + class TreeEntry(TreeKey): default_mode = 0444 - + def __new__(cls, contents, mode=None): return super(TreeEntry, cls).__new__(cls, contents) - + def __init__(self, contents, mode=None): if mode is None: self.mode = self.default_mode else: self.mode = mode - + super(TreeEntry, self).__init__(contents) + class Directory(TreeEntry, list): """ A dummy class representing a filesystem entry that should be a @@ -165,6 +174,7 @@ class Directory(TreeEntry, list): for member in ['.', '..'] + self: yield fuse.Direntry(str(member)) + class Symlink(TreeEntry, str): """ A dummy class representing something that should be a symlink @@ -181,6 +191,7 @@ class Symlink(TreeEntry, str): def readlink(self): return self + class File(TreeEntry, str): """ A dummy class representing something that should be a file @@ -197,6 +208,7 @@ class File(TreeEntry, str): def read(self, length, offset): return self[offset:offset + length] + def main(cls): """ A convenience function for initializing a RouteFS filesystem @@ -207,6 +219,7 @@ def main(cls): server.parse(values=server, errex=1) server.main() + from dictfs import DictFS __all__ = ['RouteFS', 'DictFS', 'Symlink', 'Directory', 'File', 'main']