#!/usr/bin/python

import hesiod
import routefs
from routes import Mapper

class PyHesiodFS(routefs.RouteFS):
    def __init__(self, *args, **kwargs):
        super(PyHesiodFS, self).__init__(*args, **kwargs)
        self.fuse_args.add("allow_other", True)
        
        self.cache = {}
    
    def make_map(self):
        m = Mapper()
        m.connect('', controller='getList')
        m.connect('README.txt', controller='getReadme')
        m.connect(':action', controller='getLocker')
        return m
    
    def getLocker(self, action, **kwargs):
        if action in self.cache:
            return routefs.Symlink(self.cache[action])
        
        try:
            filsys = hesiod.FilsysLookup(action).filsys[0]
            if filsys['type'] == 'AFS':
                self.cache[action] = filsys['location']
                return routefs.Symlink(self.cache[action])
        except (TypeError, KeyError, IndexError):
            return
    
    def getList(self, **kwargs):
        return self.cache.keys() + ['README.txt']
    
    def getReadme(self, **kwargs):
        return """
This is the pyHesiodFS FUSE automounter. To access a Hesiod filsys,
just access /mit/name.

If you're using the Finder, try pressing Cmd+Shift+G and then entering
/mit/name
"""

if __name__ == '__main__':
    routefs.main(PyHesiodFS)
