Implement expired account emails
[public/pyceo-broken.git] / ceo / console / main.py
1 import sys, ldap, termios
2 from getopt import getopt
3 from ceo import members, terms, uwldap
4 import ceo.ldapi as ldapi
5
6 shortopts = [
7 ]
8
9 longopts = [
10 ]
11
12 def start():
13   (opts, args) = getopt(sys.argv[1:], shortopts, longopts)
14   if len(args) >= 1:
15     if args[0] in commands:
16       commands[args[0]](args[1:])
17     else:
18       print "Invalid command '%s'" % args[0]
19
20 def help():
21   print 'Available commands:'
22   for c in commands:
23     print '  %s' % c
24
25 def memberlist(args):
26   mlist = members.list_term(terms.current())
27   dns = mlist.keys()
28   dns.sort()
29   for dn in dns:
30     member = mlist[dn]
31     print '%s %s %s' % (
32       member['uid'][0].ljust(12),
33       member['cn'][0].ljust(30),
34       member.get('program', [''])[0]
35     )
36
37 def updateprogram(args):
38   mlist = members.list_all().items()
39   uwl = ldap.initialize(uwldap.uri())
40   fd = sys.stdin.fileno()
41   for (dn, member) in mlist:
42     uid = member['uid'][0]
43     user = uwl.search_s(uwldap.base(), ldap.SCOPE_SUBTREE,
44       '(uid=%s)' % ldapi.escape(uid))
45     if len(user) == 0:
46       continue
47     user = user[0][1]
48     oldprog = member.get('program', [''])[0]
49     newprog = user.get('ou', [''])[0]
50     if oldprog == newprog:
51       continue
52     sys.stdout.write("%s: '%s' => '%s'? (y/n) " % (uid, oldprog, newprog))
53     new = old = termios.tcgetattr(fd)
54     new[3] = new[3] & ~termios.ICANON
55     try:
56       termios.tcsetattr(fd, termios.TCSANOW, new)
57       try:
58         if sys.stdin.read(1) != 'y':
59           continue
60       except KeyboardInterrupt:
61         return ''
62     finally:
63       print ''
64       termios.tcsetattr(fd, termios.TCSANOW, old)
65     old = new = {}
66     if oldprog != '':
67       old = {'program': [oldprog]}
68     if newprog != '':
69       new = {'program': [newprog]}
70     mlist = ldapi.make_modlist(old, new)
71     # TODO: don't use members.ld directly
72     members.ld.modify_s(dn, mlist)
73
74 def expiredaccounts(args):
75   send_email = False
76   if len(args) == 1 and args[0] == '--email':
77     sys.stderr.write("If you want to send an account expiration notice to " \
78       "these users then type 'Yes, do this' and hit enter\n")
79     if raw_input() == 'Yes, do this':
80       send_email = True
81   uwl = ldap.initialize(uwldap.uri())
82   mlist = members.expired_accounts()
83   for member in mlist.values():
84     uid = member['uid'][0]
85     name = member['cn'][0]
86     email = uid
87     user = uwl.search_s(uwldap.base(), ldap.SCOPE_SUBTREE,
88       '(uid=%s)' % ldapi.escape(uid))
89     if len(user) > 0  and 'mailLocalAddress' in user[0][1]:
90       email = user[0][1]['mailLocalAddress'][0]
91     if send_email:
92       members.send_account_expired_email(name, email)
93     print '%s %s %s' % (uid.ljust(12), name.ljust(30), email)
94
95 # list of commands
96 commands = {
97   'memberlist' : memberlist,
98   'updateprogram' : updateprogram,
99   'expiredaccounts' : expiredaccounts,
100 }