Archived
Move stale LDAP users check to own command
This commit is contained in:
1 parent
9e22cc7a95
commit
0c4e479953
2 files changed
+84
-9
No files matched your search
@@ -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))
|
||||
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user