Example #1
0
 def findLocker(self, name):
     """Lookup a locker in hesiod and return its path"""
     if name in self.mounts[self._uid()]:
         return self.mounts[self._uid()][name]
     elif name.startswith('.'):
         ro = self.findLocker(name[1:])
         if ro is None or ro.startswith('/afs/.'):
             return
         else:
             rw = ro.replace('/afs/', '/afs/.', 1)
             self.mounts[self._uid()][name] = rw
             syslog(LOG_INFO, "Mounting "+name+" on "+rw)
             return rw
     else:
         try:
             filsys = hesiod.FilsysLookup(name)
         except IOError, e:
             if e.errno in (errno.ENOENT, errno.EMSGSIZE):
                 raise IOError(errno.ENOENT, os.strerror(errno.ENOENT))
             else:
                 raise IOError(errno.EIO, os.strerror(errno.EIO))
         # FIXME check if the first locker is valid
         if len(filsys.filsys) >= 1:
             pointers = filsys.filsys
             pointer = pointers[0]
             if pointer['type'] != 'AFS' and pointer['type'] != 'LOC':
                 syslog(LOG_NOTICE, "Unknown locker type "+pointer['type']+" for locker "+name+" ("+repr(pointer)+" )")
                 return None
             else:
                 self.mounts[self._uid()][name] = str(pointer['location'])
                 syslog(LOG_INFO, "Mounting "+name+" on "+pointer['location'])
                 return pointer['location']
         else:
             syslog(LOG_WARNING, "Couldn't find filsys for "+name)
             return None
Example #2
0
 def findLocker(self, name):
     """Lookup a locker in hesiod and return its path"""
     if name in self.mounts:
         return self.mounts[name]
     else:
         try:
             filsys = hesiod.FilsysLookup(name)
         except IOError, e:
             if e.errno in (errno.ENOENT, errno.EMSGSIZE):
                 raise IOError(errno.ENOENT, os.strerror(errno.ENOENT))
             else:
                 raise IOError(errno.EIO, os.strerror(errno.EIO))
         # FIXME check if the first locker is valid
         if len(filsys.filsys) >= 1:
             pointers = filsys.filsys
             pointer = pointers[0]
             if pointer['type'] != 'AFS' and pointer['type'] != 'LOC':
                 syslog(LOG_NOTICE, "Unknown locker type "+pointer['type']+" for locker "+name+" ("+repr(pointer)+" )")
                 return None
             else:
                 self.mounts[name] = pointer['location']
                 syslog(LOG_INFO, "Mounting "+name+" on "+pointer['location'])
                 return pointer['location']
         else:
             syslog(LOG_WARNING, "Couldn't find filsys for "+name)
             return None
Example #3
0
    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
Example #4
0
def resolve(name):
    """
    Lookup a locker in Hesiod and return a list of dictionaries, with
    keys 'priority', 'data', and 'type'.   If the lookup found an FSGROUP,
    the list will be sorted based on key the key 'priority'.

    Raises: LockerNotFoundError, LockerError
    """
    filesystems = []
    # Avoid generating a confusing "message too long" error from
    # Hesiod.
    if name.startswith('.'):
        raise LockerError("Invalid locker name: " + name)
    try:
        filesystems = hesiod.FilsysLookup(name, parseFilsysTypes=False).filsys
    except IOError as e:
        if e.errno == errno.ENOENT:
            raise LockerNotFoundError(name)
        else:
            raise LockerError("Hesiod Error: %s while resolving %s" % \
                              (e.strerror if e.strerror else e.message, name))
    return filesystems
Example #5
0
 def get_home(name):
     return hesiod.FilsysLookup(name).filsys[0]['location']