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