diff --git a/bin/ldapuserdir-ctl b/bin/ldapuserdir-ctl index 811be30..7f7385b 100755 --- a/bin/ldapuserdir-ctl +++ b/bin/ldapuserdir-ctl @@ -145,7 +145,12 @@ parser.add_option('-g', parser.add_option('-u', action = 'store', dest = 'userfilter', - help = 'list all matching ldap users that have defined unix mappings (always implies -n)' + help = 'list all ldap users matching the filter expression' +) +parser.add_option('-m', '--mail', + action = 'store', + dest = 'mailfilter', + help = 'list all ldap users based on the mail address filter expression' ) parser.add_option('--dn', action = 'store_true', @@ -220,6 +225,7 @@ if options.flag_debug: flag_verbose = options.flag_verbose userfilter = options.userfilter +mailfilter = options.mailfilter flag_mssfu = options.flag_mssfu flag_showdn = options.flag_showdn @@ -263,6 +269,8 @@ if options.flag_add: flag_needprivileges = True if userfilter: mode = 'userlist' +if mailfilter: + mode = 'maillist' if options.user_to_group: mode = "user_to_group" user_to_group = options.user_to_group @@ -325,7 +333,12 @@ try: verbose=flag_verbose) elif mode == 'userlist': - ldapdir.list_users_etcpwd(userfilter, verbose = flag_verbose) + records = ldapdir.get_users(userfilter, config['user_ou'], mssfu=flag_mssfu) + ldapdir.list_users_etcpwd(records, verbose = flag_verbose) + + elif mode == 'maillist': + records = ldapdir.get_users_by_mailaddr(mailfilter, config['user_ou'], mssfu=flag_mssfu) + ldapdir.list_users_etcpwd(records, verbose = flag_verbose) elif mode == 'user_to_group': sfilter = None diff --git a/ldapuserdir/ldapuserdir.py b/ldapuserdir/ldapuserdir.py index 336d25c..f24d515 100644 --- a/ldapuserdir/ldapuserdir.py +++ b/ldapuserdir/ldapuserdir.py @@ -235,7 +235,7 @@ class LdapUserDir(object): dictionary of the matching users { dn1:list1, ... } """ if ou == None: - user_ou = self.user_ou + ou = self.user_ou if mssfu: srch = '(&(objectClass=user)(!(objectClass=computer))(msSFU30UidNumber=*)(msSFU30HomeDirectory=*)(cn=%s))' @@ -243,24 +243,53 @@ class LdapUserDir(object): srch = '(&(objectClass=user)(!(objectClass=computer))(cn=%s))' #try: - r = self.search_s_reconn(user_ou, ldap.SCOPE_SUBTREE, + r = self.search_s_reconn(ou, ldap.SCOPE_SUBTREE, srch % filter) #except ldap.LDAPError, e: # print e # return return r - def list_users_etcpwd(self, filter='*', ou=None, verbose = False): - """Print '/etc/pwd' format like information about matching users + def get_users_by_mailaddr(self, filter='*', ou=None, mssfu=False): + """get the names of all users from the directory service + Parameters ---------- filter : str, optional filter expression used for the cn part of the ldap dn ou : str, optional + mssfu : bool, optional + Whether to only show users with mssfu mappings + + Returns + ------- + dict + dictionary of the matching users { dn1:list1, ... } + """ + if ou == None: + ou = self.user_ou + + if mssfu: + srch = '(&(objectClass=user)(!(objectClass=computer))(msSFU30UidNumber=*)(msSFU30HomeDirectory=*)(mail=%s))' + else: + srch = '(&(objectClass=user)(!(objectClass=computer))(mail=%s))' + + #try: + r = self.search_s_reconn(ou, ldap.SCOPE_SUBTREE, + srch % filter) + #except ldap.LDAPError, e: + # print e + # return + return r + + def list_users_etcpwd(self, records, verbose = False): + """Print '/etc/pwd' format like information about matching users + Parameters + ---------- + records : ldap result structure with user records verbose : bool, optional """ - r = self.get_users(filter, ou, mssfu=True) - for dn, entry in r: + for dn, entry in records: # MUST fields try: print ':'.join([entry['cn'][0], entry['msSFU30UidNumber'][0], diff --git a/ldapuserdir/version.py b/ldapuserdir/version.py index 8c0d5d5..9aa3f90 100644 --- a/ldapuserdir/version.py +++ b/ldapuserdir/version.py @@ -1 +1 @@ -__version__ = "2.0.0" +__version__ = "2.1.0"