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
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
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 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
def get_home(name): return hesiod.FilsysLookup(name).filsys[0]['location']