Implement updateprogram (interactively updates program from uwldap)
authorDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Mon, 14 Jan 2008 02:14:38 +0000 (21:14 -0500)
committerDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Mon, 14 Jan 2008 02:14:38 +0000 (21:14 -0500)
ceo/console/main.py

index 0fb3528..bc0fcf6 100644 (file)
@@ -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,
+}