Ignore:
Timestamp:
Dec 19, 2011, 8:30:04 PM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage, test-hooks
Children:
8d36a62, 9af5b25
Parents:
b90e90b
git-author:
Alex Dehnert <adehnert@…> (12/18/11 01:00:30)
git-committer:
Alex Dehnert <adehnert@…> (12/19/11 20:30:04)
Message:

Moira->Django sync script

Major changes from 776830deb5:

  • Actually sync
  • Use AFS
File:
1 edited

Legend:

Unmodified
Added
Removed
  • asadb/util/sync_moira_authz.py

    • Property mode changed from 100644 to 100755
    r776830d r5543d51  
    11#!/usr/bin/python
    22
     3import afs.pts
    34import ldap
    45import ldap.dn
     
    78import sys
    89
    9 class LDAPConnector(object):
     10if __name__ == '__main__':
     11    cur_file = os.path.abspath(__file__)
     12    django_dir = os.path.abspath(os.path.join(os.path.dirname(cur_file), '..'))
     13    sys.path.append(django_dir)
     14    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
     15
     16import django.contrib.auth.models
     17
     18import mit
     19
     20class DjangoConnector(object):
    1021    def __init__(self, ):
     22        self.dj_groups = django.contrib.auth.models.Group.objects
     23
     24    def sync_members(self, sys_name, dj_name, ):
     25        kept = []
     26        added = []
     27        nonexist = []
     28        created = []
     29        removed = []
     30        sys_members = self.get_members(sys_name)
     31        dj_group = self.dj_groups.get(name=dj_name)
     32        dj_members = dj_group.user_set.all()
     33        dj_usernames = set([m.username for m in dj_members])
     34        for username in sys_members:
     35            if username in dj_usernames:
     36                kept.append(username)
     37            else:
     38                # Need to add to the Django group
     39                try:
     40                    user, is_new = mit.get_or_create_mit_user(username, )
     41                    if is_new: created.append(username)
     42                    user.groups.add(dj_group)
     43                    added.append(username)
     44                except ValueError:
     45                    nonexist.append(username)
     46        for user in dj_members:
     47            username = user.username
     48            if username in sys_members:
     49                assert username in kept
     50            else:
     51                user.groups.remove(dj_group)
     52                removed.append(username)
     53        return {
     54            'change' : len(added) + len(removed),
     55            'keep' : kept,
     56            'add'  : added,
     57            'create' : created,
     58            'nonexist' : nonexist,
     59            'remove': removed,
     60        }
     61
     62    def sync_many(con, what, force_print=False, ):
     63        changed = False
     64        results = {}
     65        for sys_name, dj_group in what:
     66            assert dj_group not in results
     67            results[dj_group] = con_afs.sync_members(sys_name, dj_group)
     68            if results[dj_group]['change']: changed = True
     69        if changed or force_print:
     70            for group in results:
     71                print ""
     72                print "Results for %s:" % (group, )
     73                for key, value in results[group].items():
     74                    print "%7s:\t%s" % (key, value, )
     75
     76
     77class LDAPConnector(DjangoConnector):
     78    name = "LDAP"
     79
     80    def __init__(self, *args, **kwargs):
     81        super(LDAPConnector, self).__init__(*args, **kwargs)
    1182        self.con = ldap.initialize('ldaps://ldap-too.mit.edu')
    1283        self.con.simple_bind_s("", "")
    1384
    14     def get_members_ldap(self, groupname):
     85    def get_members(self, groupname):
    1586        base_dn = 'ou=lists,ou=moira,dc=mit,dc=edu'
    1687        groupfilter = ldap.filter.filter_format('(&(objectClass=group)(displayName=%s))', [groupname])
     
    35106            else:
    36107                assert False, "Don't know what %s is" % (c_type, )
    37         return ret
     108        return [r[1] for r in ret if r[0] == 'user']
     109
     110class AFSConnector(DjangoConnector):
     111    name = "AFS"
     112
     113    def __init__(self, *args, **kwargs):
     114        super(AFSConnector, self).__init__(*args, **kwargs)
     115        # TODO: possibly kinit and aklog
     116        self.pts = afs.pts.PTS(sec=afs.pts.PTS_ENCRYPT, cell='athena.mit.edu', )
     117    def get_members(self, groupname, ):
     118        afs_members = self.pts.getEntry("system:%s" % (groupname, )).members
     119        members = [ m.name for m in afs_members ]
     120        return members
     121
     122sync_pairs = [
     123    ('asa-internal', 'asa-ebm', ),
     124]
     125
     126def test_memberships(cons):
     127    for sys_name, dj_group in sync_pairs:
     128        for con in cons:
     129            members = con.get_members(sys_name)
     130            print "%s\t%s\t%s" % (con.name, sys_name, sorted(members))
    38131
    39132if __name__ == '__main__':
    40     con = LDAPConnector()
    41     for listname in sys.argv[1:]:
    42         members = con.get_members_ldap(listname)
    43         print "%s\t%s" % (listname, members)
     133    con_afs = AFSConnector()
     134    #con_ldap = LDAPConnector()
     135    #test_memberships([con_afs, con_ldap, ])
     136    con_afs.sync_many(sync_pairs)
Note: See TracChangeset for help on using the changeset viewer.