- Timestamp:
- Nov 20, 2008, 10:46:54 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/invirt-console-server/files/usr/bin/invirt-consolefs
r1713 r1726 16 16 17 17 class ConsoleFS(routefs.RouteFS): 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 18 """ 19 ConsoleFS creates a series of subdirectories each mirroring the same real 20 directory, except for a single file - the .k5login - which is dynamically 21 generated for each subdirectory 22 """ 23 24 def __init__(self, *args, **kw): 25 """Initialize the filesystem and set it to allow_other access besides 26 the user who mounts the filesystem (i.e. root) 27 """ 28 super(ConsoleFS, self).__init__(*args, **kw) 29 self.lasttime = 0 30 self.machines = [] 31 self.fuse_args.add("allow_other", True) 32 33 openlog('invirt-consolefs ', LOG_PID, LOG_DAEMON) 34 35 syslog(LOG_DEBUG, 'Init complete.') 36 37 def make_map(self): 38 m = Mapper() 39 m.connect('', controller='getMachines') 40 m.connect(':machine', controller='getMirror') 41 m.connect(':machine/.k5login', controller='getK5login') 42 m.connect(':machine/*(path)', controller='getMirror') 43 return m 44 45 def recache(self): 46 if time() - self.lasttime > 5: 47 self.lasttime = time() 48 database.clear_cache() 49 self.machines = dict((machine.name, machine) for machine in database.session.query(database.Machine).all()) 50 50 51 52 53 54 55 56 57 58 59 60 61 # where there is already a .k5login in the realpath gracefully62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 51 def getMachines(self, **kw): 52 self.recache() 53 return self.machines.keys() 54 55 def getMirror(self, machine, path='', **kw): 56 """Translate the path into its realpath equivalent, and return that 57 """ 58 real = realpath + path 59 if os.path.isdir(real): 60 # The list is converted to a set so that we can handle the case 61 # where there is already a .k5login in the realpath gracefully 62 return routefs.Directory(set(os.listdir(real) + ['.k5login'])) 63 elif os.path.islink(real): 64 return routefs.Symlink(os.readlink(real)) 65 elif os.path.isfile(real): 66 return open(real).read() 67 else: 68 return -errno.EINVAL 69 70 def getK5login(self, machine, **kw): 71 self.recache() 72 machine = self.machines[machine] 73 users = [acl.user for acl in machine.acl] 74 return "\n".join(map(self.userToPrinc, users) + ['']) 75 76 def mirrorPath(self, path): 77 """Translate a virtual path to its real path counterpart""" 78 return realpath + "/".join(getParts(path)[1:]) 79 80 def userToPrinc(self, user): 81 """Convert Kerberos v4-style names to v5-style and append a default 82 realm if none is specified 83 """ 84 if '@' in user: 85 (princ, realm) = user.split('@') 86 else: 87 princ = user 88 realm = config.authn[0].realm 89 90 return princ.replace('.', '/') + '@' + realm 91 91 92 92 if __name__ == '__main__': 93 94 93 database.connect() 94 routefs.main(ConsoleFS)
Note: See TracChangeset
for help on using the changeset viewer.