#!/usr/bin/python2.4 import os, sys, urllib, libxml2, libxslt, ldap, time # # globals # cscUri = "http://csclub.uwaterloo.ca/xsltproc" cscTerms = ["Winter", "Spring", "Fall"] cscShortTerms = ['w', 's', 'f'] cscLdapUri = "ldap://ldap1.csclub.uwaterloo.ca ldap://ldap2.csclub.uwaterloo.ca" cscLdap = None cscPeopleBase = 'ou=People,dc=csclub,dc=uwaterloo,dc=ca' # # cscLdapConnect # def cscLdapConnect(): global cscLdap cscLdap = ldap.initialize(cscLdapUri) cscLdap.simple_bind_s("", "") # # csc:encode-for-uri # def cscEncodeForUri(ctx, arg): if type(arg) == type([]): arg = libxml2.xmlNode(arg[0]).getContent() return urllib.quote(arg) # # csc:term # def cscTerm(ctx, arg): if type(arg) == type([]): arg = libxml2.xmlNode(arg[0]).getContent() try: [year, month, day] = arg.split("-") term = (int(month) - 1) / 4 return cscTerms[term] + " " + year except: print "Invalid term '%s'" % arg # # csc:member-list # def cscMemberList(ctx, arg): try: if cscLdap == None: cscLdapConnect() curDate = time.strftime('%d-%m-%Y') year = time.localtime().tm_year term = cscShortTerms[int(time.localtime().tm_mon - 1) / 4] members = cscLdap.search_s(cscPeopleBase, ldap.SCOPE_SUBTREE, '(&(objectClass=member)(term=%s%d))' % (term, year)) doc = libxml2.newDoc("1.0") root = doc.newChild(None, "memberlist", None) for (_, member) in members: node = root.newChild(None, "member", None) node.setProp("userid", member['uid'][0]) node.setProp("name", member['cn'][0]) if not 'program' in member: member['program'] = [''] node.setProp("program", member['program'][0]) return [root] except Exception, e: print e raise # # csc:email # def cscEmail(ctx, arg): if type(arg) == type([]): str = libxml2.xmlNode(arg[0]).getContent() return "_EMAIL_TODO_" # # main # # check argv if len(sys.argv) < 4: print "Usage: xsltproc.py input-file style-sheet output-file [params...]" sys.exit(1) inFile = sys.argv[1] xsltFile = sys.argv[2] outFile = sys.argv[3] rawParams = sys.argv[4:] # check params params = {} for p in rawParams: try: [key, val] = p.split("=") params[key] = "'" + val + "'" except: print "Missing value for parameter '%s'" % p sys.exit(1) try: # register extensions libxslt.registerExtModuleFunction("encode-for-uri", cscUri, cscEncodeForUri) libxslt.registerExtModuleFunction("term", cscUri, cscTerm) libxslt.registerExtModuleFunction("member-list", cscUri, cscMemberList) libxslt.registerExtModuleFunction("email", cscUri, cscEmail) # parse xml/xslt and apply style-sheet style = libxslt.parseStylesheetFile(xsltFile) doc = libxml2.parseFile(inFile) res = style.applyStylesheet(doc, params) ret = style.saveResultToFilename(outFile, res, 0) except Exception, e: print e sys.exit(1)