#!/usr/bin/python """Re-generate the remctl configuration for build submissions. This script generates the remctl ACL and configuration for each build pocket defined in the configuration. """ import os import tempfile from invirt.authz import mech as authz from invirt.config import structs as config def userToPrinc(user): """Convert an AFS principal to a Kerberos v5 principal.""" if '@' in user: (princ, realm) = user.split('@') else: princ = user realm = config.kerberos.realm return princ.replace('.', '/') + '@' + realm def main(): # Python could really use a file-like object that gets written to # a temporary path and moved to its final resting place on # .close(). Oh well. conf_fd, conf_name = tempfile.mkstemp() conf = os.fdopen(conf_fd, 'r+') build_handler = '/usr/sbin/invirt-submit-build' for pocket in config.git.pockets: acl = authz.expandAdmin(getattr(config.git.pockets, pocket).acl, None) acl_fd, acl_name = tempfile.mkstemp() acl_fd = os.fdopen(acl_fd, 'r+') print >>acl_fd, '\n'.join(userToPrinc(a) for a in acl) acl_path = os.path.join('/etc/remctl/acl/build-%s' % pocket) os.rename(acl_name, acl_path) print >>conf, 'build %s %s %s' % (pocket, build_handler, acl_path) os.rename(conf_name, '/etc/remctl/conf.d/build') if __name__ == '__main__': main()