[Limacute-commit] r51 - in trunk/tools/dn_cn2mail: . logging

jhf at projects.linpro.no jhf at projects.linpro.no
Sat Jan 6 01:00:47 CET 2007


Author: jhf
Date: 2007-01-06 01:00:46 +0100 (Sat, 06 Jan 2007)
New Revision: 51

Modified:
   trunk/tools/dn_cn2mail/dn_cn2mail.py
   trunk/tools/dn_cn2mail/logging/__init__.pyc
Log:
Finished tool to update from dn: cn=.. to dn: mail=..
Tested and works.
Renames entries and updates references.



Modified: trunk/tools/dn_cn2mail/dn_cn2mail.py
===================================================================
--- trunk/tools/dn_cn2mail/dn_cn2mail.py	2007-01-05 08:59:47 UTC (rev 50)
+++ trunk/tools/dn_cn2mail/dn_cn2mail.py	2007-01-06 00:00:46 UTC (rev 51)
@@ -46,7 +46,7 @@
 parser.add_option("--dry",action="store_true",default=False,help="Print actions, don't do them")
 parser.add_option("--log", metavar="PATH",default="dn_cn2mail.log",type="string",help="The path to the log file.")
 parser.add_option("--uid_filter", metavar=".*",default=re.compile(r"^.*$"),type="string",nargs=1,action="callback",callback=compile_filter,help="Only process users that match the python regular expression. 'http://docs.python.org/lib/re-syntax.html'")
-url = "ldap://localhost:389/dc=domain,dc=com?*?sub?(objectClass=kolabInetOrgPerson)?bindname=cn=manager%2ccn=internal%2cdc=domain%2cdc=com,X-BINDPW=password" 
+url = "ldap://localt:389/dc=domain,dc=com?mail?one?(objectClass=*)?bindname=cn=manager%2ccn=internal%2cdc=domain%2cdc=com,X-BINDPW=secret"
 parser.add_option("--target_ldap", metavar="URI",type="string",nargs=1,action="callback",callback=parse_ldap_url,default=ldapurl.LDAPUrl(url),help="""The URI for connecting to the target ldap server.
 Example:
 %(url)s
@@ -115,7 +115,8 @@
 # Given connection and connection info, find users with dn: cn=..
 # The user is an object that at least contains a mail entry.
 def get_ldap_users(ldap_connection,x_ldap):
-    msgid = ldap_connection.search(x_ldap.dn,x_ldap.scope, x_ldap.filterstr % vars())
+    filterstr = '(objectClass=kolabInetOrgPerson)'
+    msgid = ldap_connection.search(x_ldap.dn,x_ldap.scope, filterstr)
     try:
 	(result_type,result_data) = ldap_connection.result(msgid=msgid,timeout=60)
     except:
@@ -127,8 +128,8 @@
     return result_data
 
 # Find all ldap objects that references a particular user
-def get_ldap_user_references(ldap_connection,x_ldap,dn_old,dn_new):
-    filterstr = r"(member=%(dn_old)s" % vars()
+def get_ldap_user_references(ldap_connection,x_ldap,dn_old):
+    filterstr = r"(&(objectClass=groupOfNames)(member=%(dn_old)s))" % vars()
     msgid = ldap_connection.search(x_ldap.dn,x_ldap.scope,filterstr)
     try:
 	(result_type,result_data) = ldap_connection.result(msgid=msgid,timeout=60)
@@ -178,37 +179,36 @@
         log("BEGIN dn_cn2mail")
         # Find each user to rename
         for (dn,attrs) in do_ldap(options.target_ldap,get_ldap_users):
-            if not options.uid_filter.match(user['mail'][0]):
-                log("Filtering out %(uid)s" % user)
+            if not options.uid_filter.match(attrs['mail'][0]):
+                log("Filtering out %(uid)s" % attrs['uid'])
                 continue
             # Rename user
             dn_old = dn  
             dn_parts = ldap.functions.explode_dn(dn_old)
+            if dn_parts[0].startswith("mail="):
+                continue
             rdn_new = "mail="+attrs['mail'][0]
-            dn_new = rdn_new+","+dn_parts[1:] 
-            log("Renaming %(dn_old)s to %(dn_new)s." % user )
-            do_ldap(options.target_ldap,ldap_rename,dn_old,dn_new)
-            
+            dn_new = rdn_new+","+','.join(dn_parts[1:])
+            log("Renaming %(dn_old)s to %(dn_new)s." % vars() )
+            do_ldap(options.target_ldap,ldap_rename,dn_old,rdn_new)
             # For each reference, update reference
             for (dn,attrs) in do_ldap(options.target_ldap,get_ldap_user_references,dn_old):
+                new_attrs = dict(attrs)
                 # Update reference to user
-
-            dn = 'mail='+user['mail'][0]+','+options.target_ldap.dn
-            modifications = {}
-            for key in user.keys():
-                if type(user[key]) == type([]):
-                    # Lists are used directly
-                    modifications[key] = user[key]
-                elif (type(user[key]) == type(None)) or (type(user[key]) != type("")):
-                    continue
-                elif len(user[key]) == 0:
-                    # Skip zero-length strings
-                    continue
-                else:
-                    # Singled value attributes must be presented as lists
-                    modifications[key] = [user[key]]
-            modifications = ldap.modlist.addModlist(modifications)
-            do_ldap(options.target_ldap,ldap_add,dn,modifications)
+                members = attrs['member'][:]
+                for i in range(0,len(members)):
+                    if members[i] == dn_old:
+                        members[i] = dn_new
+                new_attrs['member'] = members
+                modifications = ldap.modlist.modifyModlist(attrs,new_attrs)
+                try:
+                    do_ldap(options.target_ldap,ldap_modify,dn,modifications) 
+                except:
+                    errormsg = error2string(sys.exc_info()) 
+                    error(errormsg)
+                    logfile = options.log
+                    raise "Serious LDAP error, check the logfile %(logfile)s" % vars()
+                log("Updated %(dn)s references to %(dn_old)s updated to %(dn_new)s." % vars())
         log("END dn_cn2mail")
     except (ldap.SERVER_DOWN, ldap.INVALID_CREDENTIALS), e:
         error(str(e))

Modified: trunk/tools/dn_cn2mail/logging/__init__.pyc
===================================================================
(Binary files differ)



More information about the Limacute-commit mailing list