Ignore:
Timestamp:
Mar 30, 2008, 5:09:46 AM (17 years ago)
Author:
broder
Message:

New sipb-xen-console. Now with more magic - and more working

This package installed onto a clean Debian system should do all of the setup
for a console server except for copying the ssh private keys, granting access
to the Postgres database, and Kerberos keytabs

Location:
trunk/packages/sipb-xen-console/files
Files:
5 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/sipb-xen-console/files/etc/nss-pgsql.conf

    r335 r344  
    66database        = sipb_xen
    77login           = sipb-xen
    8 #passwd         = foo
    9 #passwdtable    = machines
    10 #grouptable     = machines
    11 # you can use anything postgres accepts as table expression
    12 #groupmembertable = accounts JOIN usergroups ON accounts.uid=usergroups.uid JOIN groups ON usergroups.gid=groups.gid
    138
    14 querypasswd = SELECT name, 'moo', 1000 as uid, 1000, '', '/vmhome/'|| name, '/usr/local/bin/sipb-xen-consolesh' FROM machines
    15 querygroup = SELECT name, NULL, 1000 as gid FROM machines
    16 querymembers = SELECT name FROM machines WHERE 1000 = %d
    17 queryids = SELECT 1000 AS gid FROM machines LIMIT 0;
     9querypasswd = SELECT name, NULL, machine_id + 1000 as uid, machine_id + 1000 as gid, '', '/consolefs/'|| name, '/usr/bin/sipb-xen-consolesh' FROM machines
     10querygroup = SELECT name, NULL, machine_id + 1000 as gid FROM machines
     11querymembers = SELECT name FROM machines WHERE 1000 + machine_id = %d
     12queryids = SELECT 1000 + machine_id AS gid FROM machines LIMIT 0
    1813
    1914passwd_name = name
    20 passwd_uid = uid
     15passwd_uid = 1000 + machine_id
    2116
    2217group_name = name
    23 group_gid = gid
     18group_gid = 1000 + machine_id
  • trunk/packages/sipb-xen-console/files/etc/nsswitch.conf.sipb-xen

    r335 r344  
    66
    77passwd:         compat pgsql
    8 group:          compat
     8group:          compat pgsql
    99shadow:         compat
    1010
  • trunk/packages/sipb-xen-console/files/etc/ssh/ssh_config.sipb-xen

    r335 r344  
    1818
    1919Host *
    20    SetEnv VM_NAME
     20   SendEnv VM_NAME
    2121#   ForwardAgent no
    2222#   ForwardX11 no
  • trunk/packages/sipb-xen-console/files/usr/bin/sipb-xen-consolefs

    r335 r344  
    1111                           # - note: these must be returned as negatives
    1212
     13import sipb_xen_database
     14
    1315fuse.fuse_python_api = (0, 2)
    1416
    15 machines = ['moo17', 'remus']
    1617realpath = "/home/machines/"
    17 uid = 1000
    1818
    1919def dirFromList(list):
     
    4848                self.st_dev = 0
    4949                self.st_nlink = 0
    50                 self.st_uid = uid
     50                self.st_uid = 0
    5151                self.st_gid = 0
    5252                self.st_size = 0
     
    6464        def __init__(self, *args, **kw):
    6565                Fuse.__init__(self, *args, **kw)
     66                self.lasttime = time()
     67                self.allow_other = 1
    6668                print 'Init complete.'
    6769       
    6870        def mirrorPath(self, path):
    6971                return realpath + "/".join(getParts(path)[1:])
     72       
     73        def getMachines(self):
     74                if time() - self.lasttime > 15:
     75                        self.lasttime = time()
     76                        sipb_xen_database.clear_cache()
     77                return [machine.name for machine in sipb_xen_database.Machine.select()]
     78       
     79        def getUid(self, machine_name):
     80                return sipb_xen_database.Machine.get_by(name=machine_name).machine_id + 1000
     81       
     82        def getK5login(self, machine_name):
     83                machine = sipb_xen_database.Machine.get_by(name=machine_name)
     84                users = [acl.user for acl in machine.acl]
     85                return "\n".join(map(self.userToPrinc, users) + [''])
     86       
     87        def userToPrinc(self, user):
     88                if '@' in user:
     89                        (princ, realm) = user.split('@')
     90                else:
     91                        princ = user
     92                        realm = "ATHENA.MIT.EDU"
     93               
     94                return princ.replace('.', '/') + realm
    7095       
    7196        def getattr(self, path):
     
    94119                        st.st_nlink = 2
    95120                elif depth == 1:
    96                         if parts[-1] in machines:
     121                        if parts[-1] in self.getMachines():
    97122                                st.st_mode = stat.S_IFDIR | 0755
    98123                                st.st_nlink = 2
     124                                st.st_uid = st.st_gid = self.getUid(parts[0])
    99125                        else:
    100126                                return -errno.ENOENT
     
    102128                        st.st_mode = stat.S_IFREG | 0444
    103129                        st.st_nlink = 1
    104                         st.st_size = 17
     130                        st.st_size = len(self.getK5login(parts[0]))
     131                        st.st_uid = st.st_gid = self.getUid(parts[0])
    105132                else:
    106                         st = os.lstat(self.mirrorPath(path))
     133                        stats = list(os.lstat(self.mirrorPath(path)))
     134                        stats[4:6] = [self.getUid(parts[0])] * 2
     135                        return tuple(stats)
    107136                return st.toTuple()
    108137       
    109138        def readdir(self, path, offset):
    110139                print '*** readdir', path, offset
     140                for (value, zero) in self.getdir(path):
     141                        yield fuse.Direntry(value)
     142       
     143        def getdir(self, path):
     144                print '*** getdir', path
    111145                if path == '/':
    112                         for r in  ['.', '..']+machines:
    113                                 yield fuse.Direntry(r)
     146                        contents = ['.', '..']+self.getMachines()
    114147                elif getDepth(path) == 1:
    115                         for r in set(os.listdir(self.mirrorPath(path)) + ['.k5login']):
    116                                 yield fuse.Direntry(r)
     148                        contents = set(os.listdir(self.mirrorPath(path)) + ['.k5login', '.', '..'])
    117149                else:
    118                         for r in os.listdir(self.mirrorPath(path)):
    119                                 yield fuse.Direntry(r)
     150                        contents = os.listdir(self.mirrorPath(path)) + ['.', '..']
     151                return [(i, 0) for i in contents]
    120152       
    121153        def read ( self, path, length, offset ):
    122154                print '*** read', path, length, offset
    123155               
     156                parts = getParts(path)
     157               
    124158                if getDepth(path) < 2:
    125159                        return -errno.ENOENT
    126                 elif getParts(path)[1:] == ['.k5login']:
    127                         pass
     160                elif parts[1:] == ['.k5login']:
     161                        if parts[0] not in self.getMachines():
     162                                return -errno.ENOENT
     163                        else:
     164                                return self.getK5login(parts[0])[offset:length + offset]
    128165                else:
    129166                        fname = self.mirrorPath(path)
     
    136173
    137174if __name__ == '__main__':
     175        sipb_xen_database.connect('postgres://sipb-xen@sipb-xen-dev.mit.edu/sipb_xen')
    138176        usage="""
    139177ConsoleFS [mount_path]
Note: See TracChangeset for help on using the changeset viewer.