From 0c4e4799536fec5fade77f0c827141c52e6da506 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Fri, 3 Apr 2015 18:22:23 +0200 Subject: [PATCH] Move stale LDAP users check to own command --- .../commands/clean_up_internal_users.py | 84 +++++++++++++++++++ .../sync_active_to_internal_systems.py | 9 -- 2 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 neuf_userinfo/management/commands/clean_up_internal_users.py diff --git a/neuf_userinfo/management/commands/clean_up_internal_users.py b/neuf_userinfo/management/commands/clean_up_internal_users.py new file mode 100644 index 0000000..9c0d44e --- /dev/null +++ b/neuf_userinfo/management/commands/clean_up_internal_users.py @@ -0,0 +1,84 @@ +from django.core.management.base import BaseCommand +from django.db.models import Q + +from inside.models import InsideGroup, InsideUser +from neuf_ldap.models import LdapGroup, LdapUser + +from optparse import make_option + +ACTIVE_USERS_GROUP = 'dns-aktiv' + + +class Command(BaseCommand): + # TODO: Actually clean up stuff + help = 'Clean up stale LDAP/ users not in group dns-aktiv from Inside' + option_list = BaseCommand.option_list + ( + make_option( + '--dry-run', + action='store_true', + dest='dry_run', + default=False, + help='Dry run when syncronizing, does not save anything.' + ),) + + SYNC_GROUP_PREFIX = 'dns-' + options = {} + + def handle(self, *args, **options): + self.options = options + + # Get all active user from Inside + inside_users_diffable = self.get_inside_users_diffable() + + # Get existing users in LDAP + ldap_users_diffable = self.get_ldap_users_diffable() + + # Are any LDAP users stale? + self.stale_ldap_users(inside_users_diffable, ldap_users_diffable) + + def get_inside_users_diffable(self): + inside_users_diffable = {} + group = InsideGroup.objects.get(posix_group=ACTIVE_USERS_GROUP) + inside_users = InsideUser.objects.filter(group_rels__group=group) + inside_users = inside_users.exclude(Q(ldap_username__isnull=True) | Q(registration_status='partial')) + + for u in inside_users: + inside_groups = InsideGroup.objects.filter(user_rels__user=u).exclude(posix_group='') + inside_groups = inside_groups.values_list('posix_group', flat=True) + inside_users_diffable[u.ldap_username] = { + 'username': u.ldap_username, + 'first_name': u.first_name, + 'last_name': u.last_name, + 'email': u.email, + 'groups': inside_groups + } + if self.options['verbosity'] == '3': + self.stdout.write('Found {} Inside users'.format(len(inside_users_diffable))) + + return inside_users_diffable + + def get_ldap_users_diffable(self): + ldap_users_diffable = {} + ldap_active_members = LdapGroup.objects.get(name=ACTIVE_USERS_GROUP).members + ldap_users = LdapUser.objects.filter(username__in=ldap_active_members) + + for u in ldap_users: + ldap_groups = LdapGroup.objects\ + .filter(name__startswith=self.SYNC_GROUP_PREFIX, members__contains=u.username)\ + .values_list('name', flat=True) + ldap_users_diffable[u.username] = { + 'username': u.username, + 'first_name': u.first_name, + 'last_name': u.last_name, + 'email': u.email, + 'groups': ldap_groups + } + if self.options['verbosity'] == '3': + self.stdout.write('Found {} LDAP users'.format(len(ldap_users_diffable))) + + return ldap_users_diffable + + def stale_ldap_users(self, inside_users_diffable, ldap_users_diffable): + for username, u in ldap_users_diffable.iteritems(): + if username not in inside_users_diffable: + self.stdout.write('LDAP user {} is not in group {} in Inside'.format(username, ACTIVE_USERS_GROUP)) \ No newline at end of file diff --git a/neuf_userinfo/management/commands/sync_active_to_internal_systems.py b/neuf_userinfo/management/commands/sync_active_to_internal_systems.py index 84aa1ab..4e96445 100644 --- a/neuf_userinfo/management/commands/sync_active_to_internal_systems.py +++ b/neuf_userinfo/management/commands/sync_active_to_internal_systems.py @@ -46,9 +46,6 @@ class Command(BaseCommand): # Do actual sync self.sync_users(inside_users_diffable, ldap_users_diffable) - # Are any LDAP users stale? - self.stale_ldap_users(inside_users_diffable, ldap_users_diffable) - self.log_totals() # Voila! @@ -125,12 +122,6 @@ class Command(BaseCommand): if int(self.options['verbosity']) == 3: self.stdout.write('[OK] Inside user {} is in sync with LDAP'.format(username)) - def stale_ldap_users(self, inside_users_diffable, ldap_users_diffable): - for username, u in ldap_users_diffable.iteritems(): - if username not in inside_users_diffable: - if int(self.options['verbosity']) >= 2: - self.stdout.write('LDAP user {} is not in list of to-be-synced users from Inside'.format(username)) - def log_totals(self): if self.COUNTS['create'] > 0 or self.COUNTS['update'] > 0 or int(self.options['verbosity']) >= 2: self.stdout.write('Totals: created {}, updated {}, in sync: {}'.format(