#!/usr/bin/env python # People # # Douglas Thrift # # $Id$ from __init__ import lock from ccscslab.main.models import Person from ccscslab.main import utils import contextlib import ldap import optparse import re if __name__ == '__main__': parser = optparse.OptionParser() parser.add_option('-D', '--debug', action = 'store_true', dest = 'debug') options = parser.parse_args()[0] lock(options.debug) connection = utils.ldap_connection() users = map(lambda user: user[1], connection.search_s('ou=People,%s' % utils.base, ldap.SCOPE_ONELEVEL, '(&(uid=*)(!(uid=root)))', ('uid', 'uidNumber', 'cn', 'loginShell'))) connection.unbind_s() for user in users: name = user['uid'][0] uid = user['uidNumber'][0] full_name = user['cn'][0] shell = user['loginShell'][0] if options.debug: print name + ':\n ' + uid + '\n ' + full_name + '\n ' + shell person, inserted = Person.objects.get_or_create(name = name, uid = uid) person.full_name = full_name person.shell = shell person.save() if options.debug: print ' ' + ('inserted' if inserted else 'updated') for person in Person.objects.exclude(name__in = map(lambda user: user['uid'][0], users)): print person with contextlib.closing(utils.finger_connection()) as finger: finger.write('/W ' + ' '.join(map(lambda user: user['uid'][0], users)) + '\r\n') finger.flush() in_plan = False in_project = False last = '' plan = '' project = '' login = re.compile(r'^Login: ([a-z0-9]{1,16})\s+Name: .+$') none = re.compile(r'^finger: [a-z0-9]{1,16}: no such user.?$') user = None public_key = re.compile(r'^Public key: .*$') plan_ = re.compile(r'^Plan: (.*)$') project_ = re.compile(r'^Project: (.*)$') def plan_project(): if options.debug: print user + ':' person = Person.objects.get(name = user) person.plan = utils.htmlify(plan.rstrip()) person.project = utils.htmlify(project.rstrip()) if options.debug: if person.plan != '': print ' plan' if person.project != '': print ' project' person.save() if options.debug: print ' updated' for line in finger: line = line.rstrip() match = login.match(line) if line == 'Plan:': if not in_plan: in_plan = True elif in_project: in_plan = True in_project = False else: plan += line + '\n' elif line == 'Project:': if not in_project: in_project = True elif not in_plan: project += line + '\n' elif last == '' and match is not None: in_plan = False in_project = False if user is not None: plan_project() user = match.group(1) plan = '' project = '' elif none.match(line) is not None: line = '' elif in_plan: if public_key.match(line) is not None: in_plan = False else: plan += line + '\n' elif in_project: match = plan_.match(line) if match is not None: in_project = False in_plan = True plan += match.group(1) + '\n' elif public_key.match(line) is not None: in_project = False else: project += line + '\n' else: match = plan_.match(line) if match is not None: in_plan = True plan += match.group(1) + '\n'; else: match = project_.match(line) if match is not None: in_project = True project += match.group(1) last = line if user is not None: plan_project()