One of those LdapWordEdit was not meant to be
[mspang/pyceo.git] / ceo / console / updateprograms.py
1 import ldap, sys, termios
2 from ceo import members, uwldap, ldapi
3
4 class UpdatePrograms:
5   help = '''
6 updateprograms
7
8 Interactively updates the program field for an account by querying uwdir.
9 '''
10   def main(self, args):
11     mlist = members.list_all().items()
12     uwl = ldap.initialize(uwldap.uri())
13     fd = sys.stdin.fileno()
14     for (dn, member) in mlist:
15       uid = member['uid'][0]
16       user = uwl.search_s(uwldap.base(), ldap.SCOPE_SUBTREE,
17         '(uid=%s)' % ldapi.escape(uid))
18       if len(user) == 0:
19         continue
20       user = user[0][1]
21       oldprog = member.get('program', [''])[0]
22       newprog = user.get('ou', [''])[0]
23       if oldprog == newprog or newprog == '':
24         continue
25       sys.stdout.write("%s: '%s' => '%s'? (y/n) " % (uid, oldprog, newprog))
26       new = old = termios.tcgetattr(fd)
27       new[3] = new[3] & ~termios.ICANON
28       try:
29         termios.tcsetattr(fd, termios.TCSANOW, new)
30         try:
31           if sys.stdin.read(1) != 'y':
32             continue
33         except KeyboardInterrupt:
34           return ''
35       finally:
36         print ''
37         termios.tcsetattr(fd, termios.TCSANOW, old)
38       old = new = {}
39       if oldprog != '':
40         old = {'program': [oldprog]}
41       if newprog != '':
42         new = {'program': [newprog]}
43       mlist = ldapi.make_modlist(old, new)
44       # TODO: don't use members.ld directly
45       #if newprog != '':
46       #  members.set_program(uid, newprog)
47       members.ld.modify_s(dn, mlist)