| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import koji |
| import os.path |
| import sys |
| from collections import defaultdict |
| |
| KOJI_URL = 'http://localhost/kojihub' |
| CLIENT_CERT = os.path.expanduser('/etc/pki/koji/koji-admin.pem') |
| CLIENTCA_CERT = os.path.expanduser('/etc/pki/koji/koji_ca_cert.crt') |
| SERVERCA_CERT = os.path.expanduser('/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt') |
| USER = 'koji' |
| FASDUMP = '/etc/bsadmin/groups' |
| SYSTEM_USERS = ['koji', 'kojira'] |
| IMAGE_PERM = ['virt', 'cloud', 'atomic', 'cloudinstance'] |
| |
| def get_user_list(): |
| users = [(x['name'], x['id']) for x in kojiclient.listUsers()] |
| return users if len(users) else None |
| |
| def get_user(user): |
| user = kojiclient.getUser(user) |
| return user |
| |
| def get_user_perms(user): |
| perms = kojiclient.getUserPerms(user[1]) |
| return perms |
| |
| def get_users_perms(): |
| userlist = defaultdict(list) |
| for user in get_user_list(): |
| userlist[user[0]] = get_user_perms(user) |
| |
| return userlist if len(userlist) else None |
| |
| def get_user_perms_from_file(user): |
| perms = get_users_perms_from_file() |
| return perms[user] |
| |
| def get_all_defined_perms(): |
| perms = [] |
| for perm in kojiclient.getAllPerms(): |
| perms.append(perm['name']) |
| return perms |
| |
| def get_users_perms_from_file(): |
| userlist = defaultdict(list) |
| try: |
| groups = open(FASDUMP, 'r') |
| except: |
| return None |
| |
| for line in groups.readlines(): |
| sig, users = line.strip('\n').split(':') |
| for user in users.replace(" ", "").split(','): |
| perm = "build-"+sig |
| userlist[user].append(perm) |
| userlist[user].append('build') |
| if sig in IMAGE_PERM: |
| userlist[user].append('image') |
| |
| return userlist if len(userlist) else None |
| |
| def fix_permissions(new, old): |
| usernames = list(set(new)|set(old)) |
| |
| usernames = [u for u in usernames if u not in SYSTEM_USERS] |
| for username in usernames: |
| togrant = list(set(new[username]) - set(old[username])) |
| torevoke = list(set(old[username]) - set(new[username])) |
| user = get_user(username) |
| if togrant or torevoke: |
| print "\n# user:%s\n# NEW perms:%s\n# OLD perms:%s \ |
| \n# To grant:%s\n# To revoke:%s" \ |
| % (user, new[username], old[username], togrant, torevoke) |
| if not user: |
| |
| user = kojiclient.createUser(username) |
| |
| kojiclient.grantPermission(username, 'build') |
| for perm in togrant: |
| if perm in get_all_defined_perms(): |
| kojiclient.grantPermission(username, perm) |
| for perm in torevoke: |
| if perm in get_all_defined_perms(): |
| kojiclient.revokePermission(username, perm) |
| |
| if __name__ == '__main__': |
| try: |
| kojiclient = koji.ClientSession(KOJI_URL) |
| kojiclient.ssl_login(CLIENT_CERT, CLIENTCA_CERT, SERVERCA_CERT) |
| except: |
| print "Could not connect to koji API" |
| sys.exit(2) |
| |
| fas_perms = get_users_perms_from_file() |
| koji_perms = get_users_perms() |
| |
| if not fas_perms: |
| print "Could not read %s file." % FASDUMP |
| sys.exit(1) |
| |
| if not koji_perms: |
| print "Could not read koji's user database" |
| sys.exit(2) |
| |
| fix_permissions(fas_perms, koji_perms) |
| sys.exit(0) |