[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