source: trunk/packages/invirt-remote-server/files/usr/sbin/invirt-remconffs @ 1699

Last change on this file since 1699 was 1697, checked in by broder, 16 years ago

Add real caching to remconffs

  • Property svn:executable set to *
File size: 2.3 KB
RevLine 
[518]1#!/usr/bin/python
2
[982]3import routefs
4from routes import Mapper
[518]5
[982]6from syslog import *
[518]7from time import time
8
[835]9from invirt import database
[830]10from invirt.config import structs as config
[518]11
[982]12class RemConfFS(routefs.RouteFS):
[518]13        """
14        RemConfFS creates a filesytem for configuring remctl, like this:
15        /
16        |-- acl
17        |   |-- machine1
18        |   ...
19        |   `-- machinen
[982]20        `-- conf
[1697]21       
[518]22        The machine list and the acls are drawn from a database.
23        """
24       
25        def __init__(self, *args, **kw):
26                """Initialize the filesystem and set it to allow_other access besides
27                the user who mounts the filesystem (i.e. root)
28                """
[982]29                super(RemConfFS, self).__init__(*args, **kw)
[1697]30                self.lasttime = 0
[982]31                self.fuse_args.add("allow_other", True)
[518]32               
[1176]33                openlog('invirt-remconffs ', LOG_PID, LOG_DAEMON)
[518]34               
35                syslog(LOG_DEBUG, 'Init complete.')
[1697]36       
37        def make_map(self):
38                m = Mapper()
39                m.connect('', controller='getroot')
40                m.connect('acl', controller='getmachines')
41                m.connect('acl/:machine', controller='getacl')
42                m.connect('conf', controller='getconf')
43                return m
44       
45        def recache(self):
46                if time() - self.lasttime > 15:
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       
51        def getroot(self, **kw):
52                return ['acl', 'conf']
53       
[982]54        def getacl(self, machine, **kw):
[518]55                """Build the ACL file for a machine
56                """
[1697]57                self.recache()
58                machine = self.machines[machine]
[518]59                users = [acl.user for acl in machine.acl]
60                return "\n".join(map(self.userToPrinc, users)
61                                 + ['include /etc/remctl/acl/web',
[1697]62                                        ''])
63       
[982]64        def getconf(self, **kw):
[519]65                """Build the master conf file, with all machines
[518]66                """
[1176]67                return '\n'.join("control %s /usr/sbin/invirt-remote-proxy-control"
[519]68                                 " /etc/remctl/remconffs/acl/%s"
69                                 % (machine_name, machine_name)
[986]70                                 for machine_name in self.getmachines())+'\n'
[518]71       
[986]72        def getmachines(self, **kw):
[982]73                """Get the list of VMs in the database, clearing the cache if it's
74                older than 15 seconds"""
[1697]75                self.recache()
76                return self.machines.keys()
77       
[518]78        def userToPrinc(self, user):
79                """Convert Kerberos v4-style names to v5-style and append a default
80                realm if none is specified
81                """
82                if '@' in user:
83                        (princ, realm) = user.split('@')
84                else:
85                        princ = user
[830]86                        realm = config.authn[0].realm
[518]87               
88                return princ.replace('.', '/') + '@' + realm
89
90if __name__ == '__main__':
[835]91        database.connect()
[1697]92        routefs.main(RemConfFS)
Note: See TracBrowser for help on using the repository browser.