#!/usr/bin/python """ This code makes it easier to look up information in Wake Forest University's LDAP. Some of it, notably "search_by_name", should be readily portable to other environments. This code looks funny because it rates around 9/10 in pylint. """ import ldap import sys __revision__ = 1 class NoUniqueResultException(Exception): """ Whatever it was couldn't find a unique result. """ pass class WFULDAP(object): """ This class makes it a little easier to search in LDAP. """ BASE_DN = 'dc=wfu,dc=edu' DEFAULT_HOST = 'ldap.wfu.edu' def __init__(self, ldap_conn=None): if ldap_conn == None: ldap_conn = ldap.open( self.DEFAULT_HOST ) self.ldap_conn = ldap_conn def search(self, baseDN=BASE_DN, searchScope=ldap.SCOPE_SUBTREE, searchFilter='objectclass=*', retrieveAttributes=None): """Returns the expanded result set""" search_id = self.ldap_conn.search( baseDN, searchScope, searchFilter, retrieveAttributes) results = [] while 1: result_type, result_data = self.ldap_conn.result( search_id, 0) if (result_data == []): break results.append( (result_type, result_data) ) return results def search_by_cn( self, canonical_name ): "Searches by canonical name. Don't pass 'cn='" return self.search( searchFilter='cn=%s' % canonical_name ) def search_by_sn( self, surname ): "Searches by last name. Don't pass 'sn='" return self.search( searchFilter='sn=%s' % surname ) def search_by_unique_name( self, unique_name ): "Tries to find a unique name." # try searching by exact name results = self.search_by_cn( unique_name ) if len(results)==1: return results[0][1] # return just the data # try searching by last name name_pieces = unique_name.split() results = self.search_by_sn( name_pieces[-1]) if len(results)==1: return results[0][1] # try searching by first and last name results = self.search_by_cn( '%s*%s' % ( name_pieces[0], name_pieces[-1], )) if len(results)==1: return results[0][1] raise NoUniqueResultException def name_to_userid( unique_name, wfuldap=WFULDAP() ): """ Try to find a userid for a name. Raises NoUniqueResultException if one couldn't be found. """ unique_name = unique_name.strip() ldap_entry = wfuldap.search_by_unique_name( unique_name ) userid = ldap_entry[0][1]['uid'][0] return userid if __name__ == '__main__': for name in sys.stdin: name = name.strip() print "%8s: %s" % ( name_to_userid( name ), name )