|
|
|
@ -1,6 +1,10 @@ |
|
|
|
|
import sys |
|
|
|
|
import sys, ldap, termios |
|
|
|
|
from getopt import getopt |
|
|
|
|
from ceo import members, terms |
|
|
|
|
import ceo.ldapi as ldapi |
|
|
|
|
|
|
|
|
|
uwldap_uri = "ldap://uwldap.uwaterloo.ca/" |
|
|
|
|
uwldap_base = "dc=uwaterloo,dc=ca" |
|
|
|
|
|
|
|
|
|
shortopts = [ |
|
|
|
|
] |
|
|
|
@ -11,16 +15,66 @@ longopts = [ |
|
|
|
|
def start(): |
|
|
|
|
(opts, args) = getopt(sys.argv[1:], shortopts, longopts) |
|
|
|
|
if len(args) == 1: |
|
|
|
|
if args[0] == 'memberlist': |
|
|
|
|
mlist = members.list_term(terms.current()).values() |
|
|
|
|
for member in mlist: |
|
|
|
|
print '%s %s %s' % ( |
|
|
|
|
member['uid'][0].ljust(12), |
|
|
|
|
member['cn'][0].ljust(30), |
|
|
|
|
member.get('program', [''])[0] |
|
|
|
|
) |
|
|
|
|
if args[0] in commands: |
|
|
|
|
commands[args[0]](args[1:]) |
|
|
|
|
else: |
|
|
|
|
print "Invalid argument '%s'" % args[0] |
|
|
|
|
print "Invalid command '%s'" % args[0] |
|
|
|
|
|
|
|
|
|
def help(): |
|
|
|
|
print 'ceo memberlist' |
|
|
|
|
print 'Available commands:' |
|
|
|
|
for c in commands: |
|
|
|
|
print ' %s' % c |
|
|
|
|
|
|
|
|
|
def memberlist(args): |
|
|
|
|
mlist = members.list_term(terms.current()).values() |
|
|
|
|
print type(mlist) |
|
|
|
|
for member in mlist: |
|
|
|
|
print '%s %s %s' % ( |
|
|
|
|
member['uid'][0].ljust(12), |
|
|
|
|
member['cn'][0].ljust(30), |
|
|
|
|
member.get('program', [''])[0] |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
def updateprogram(args): |
|
|
|
|
mlist = members.list_all().items() |
|
|
|
|
uwldap = ldap.initialize(uwldap_uri) |
|
|
|
|
fd = sys.stdin.fileno() |
|
|
|
|
for (dn, member) in mlist: |
|
|
|
|
uid = member['uid'][0] |
|
|
|
|
user = uwldap.search_s(uwldap_base, ldap.SCOPE_SUBTREE, |
|
|
|
|
'(uid=%s)' % ldapi.escape(uid)) |
|
|
|
|
if len(user) == 0: |
|
|
|
|
continue |
|
|
|
|
user = user[0][1] |
|
|
|
|
oldprog = member.get('program', [''])[0] |
|
|
|
|
newprog = user.get('ou', [''])[0] |
|
|
|
|
if oldprog == newprog: |
|
|
|
|
continue |
|
|
|
|
sys.stdout.write("%s: '%s' => '%s'? (y/n) " % (uid, oldprog, newprog)) |
|
|
|
|
new = old = termios.tcgetattr(fd) |
|
|
|
|
new[3] = new[3] & ~termios.ICANON |
|
|
|
|
try: |
|
|
|
|
termios.tcsetattr(fd, termios.TCSANOW, new) |
|
|
|
|
try: |
|
|
|
|
if sys.stdin.read(1) != 'y': |
|
|
|
|
continue |
|
|
|
|
except KeyboardInterrupt: |
|
|
|
|
return '' |
|
|
|
|
finally: |
|
|
|
|
print '' |
|
|
|
|
termios.tcsetattr(fd, termios.TCSANOW, old) |
|
|
|
|
old = new = {} |
|
|
|
|
if oldprog != '': |
|
|
|
|
old = {'program': [oldprog]} |
|
|
|
|
if newprog != '': |
|
|
|
|
new = {'program': [newprog]} |
|
|
|
|
mlist = ldapi.make_modlist(old, new) |
|
|
|
|
# TODO: don't use members.ld directly |
|
|
|
|
members.ld.modify_s(dn, mlist) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# list of commands |
|
|
|
|
commands = { |
|
|
|
|
'memberlist' : memberlist, |
|
|
|
|
'updateprogram' : updateprogram, |
|
|
|
|
} |
|
|
|
|