mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

matthew_swift
26.21.2007 5ceb2e9601d2501d021d0c61188ec913076555a0
opends/tests/functional-tests/shared/python/replication.py
@@ -1,432 +1,432 @@
#!/usr/bin/python
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE
# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
# add the following below this CDDL HEADER, with the fields enclosed
# information:
#      Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
#      Portions Copyright 2007 Sun Microsystems, Inc.
# Global variable containing the list of servers ("Server" class instances) deployed
_topologyServerList = []
# Define ChangelogServer class
class ChangelogServer:
  def __init__(self, port, id):
    self.port = port
    self.id = id
    self.changelogServerList = []
  def addChangelogServer(self, hostname, port):
    self.changelogServerList.append('%s:%s' % (hostname, port))
  def getPort(self):
    return self.port
  def getId(self):
    return self.id
  def getChangelogServerList(self):
    return self.changelogServerList
# Define SynchronizedSuffix class:
class SynchronizedSuffix:
  def __init__(self, suffixDn, id):
    self.suffixDn = suffixDn
    self.id = id
    self.changelogServerList = []
  def addChangelogServer(self, hostname, port):
    self.changelogServerList.append('%s:%s' % (hostname, port))
  def getSuffixDn(self):
    return self.suffixDn
  def getId(self):
    return self.id
  def getChangelogServerList(self):
    return self.changelogServerList
# Define Server class
class Server:
  def __init__(self, hostname, dir, port, sslPort, jmxPort, rootDn, rootPwd, baseDn):
    self.hostname = hostname
    self.dir = dir
    self.port = port
    self.sslPort = sslPort
    self.jmxPort = jmxPort
    self.rootDn = rootDn
    self.rootPwd = rootPwd
    self.baseDn = baseDn
    self.changelogServer = None
    self.synchronizedSuffixList = []
  def __repr__(self):
    return "Server: hostname=%s, directory=%s" % (self.hostanme, self.dir)
  def addChangelogServer(self, changelogServer):
    self.changelogServer = changelogServer
  def addSynchronizedSuffix(self, synchronizedSuffix):
    self.synchronizedSuffixList.append(synchronizedSuffix)
  def getHostname(self):
    return self.hostname
  def getDir(self):
    return self.dir
  def getPort(self):
    return self.port
  def getSslPort(self):
    return self.sslPort
  def getJmxPort(self):
    return self.jmxPort
  def getRootDn(self):
    return self.rootDn
  def getRootPwd(self):
    return self.rootPwd
  def getBaseDn(self):
    return self.baseDn
  def getChangelogServer(self):
    return self.changelogServer
  def getSynchronizedSuffixList(self):
    return self.synchronizedSuffixList
  def requiresSynchronization(self):
    return (self.changelogServer is not None) or (len(self.synchronizedSuffixList) > 0)
# Define the function that writes a ldif file with the replication configuration
# corresponding to the given server.
def write_replication_conf_ldif_file(path, server):
  ldifLines = []
  # write the main replication configuration entry
  ldifLines.append('')
  ldifLines.append('dn: cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
  ldifLines.append('objectClass: top')
  ldifLines.append('objectClass: ds-cfg-synchronization-provider')
  ldifLines.append('objectClass: ds-cfg-multimaster-synchronization-provider')
  ldifLines.append('cn: Multimaster Synchronization')
  ldifLines.append('ds-cfg-synchronization-provider-enabled: true')
  ldifLines.append('ds-cfg-synchronization-provider-class: org.opends.server.replication.plugin.MultimasterReplication')
  # if server is a changelog server, write its corresponding configuration
  changelogServer = server.getChangelogServer()
  if changelogServer is not None :
    port = changelogServer.getPort()
    id = changelogServer.getId()
    list = changelogServer.getChangelogServerList()
    ldifLines.append('')
    ldifLines.append('dn: cn=Replication Server,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
    ldifLines.append('objectClass: top')
    ldifLines.append('objectClass: ds-cfg-replication-server-config')
    ldifLines.append('cn: Replication Server')
    ldifLines.append('ds-cfg-replication-server-port: %s' % port)
    for chglgServer in list:
      ldifLines.append('ds-cfg-replication-server: %s' % chglgServer)
    ldifLines.append('ds-cfg-replication-server-id: %s' % id)
  # write the domains replication configuration entry
  ldifLines.append('')
  ldifLines.append('dn: cn=domains,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
  ldifLines.append('objectClass: top')
  ldifLines.append('objectClass: ds-cfg-branch')
  ldifLines.append('cn: domains')
  # write the configuration for the synchronized suffixes, if any
  synchronizedSuffixList = server.getSynchronizedSuffixList()
  for i in range( len(synchronizedSuffixList) ):
    suffix = synchronizedSuffixList[i]
    dn = suffix.getSuffixDn()
    id = suffix.getId()
    list = suffix.getChangelogServerList()
    name = 'SUFFIX-%s' % i
    ldifLines.append('')
    ldifLines.append('dn: cn=%s,cn=domains,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config' % name)
    ldifLines.append('objectClass: top')
    ldifLines.append('objectClass: ds-cfg-replication-domain-config')
    ldifLines.append('cn: %s' % name)
    ldifLines.append('ds-cfg-replication-dn: %s' % dn)
    for chglgServer in list:
      ldifLines.append('ds-cfg-replication-server: %s' % chglgServer)
    ldifLines.append('ds-cfg-directory-server-id: %s' % id)
    ldifLines.append('ds-cfg-receive-status: true')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the root suffix entry to add
# for a given suffix.
def write_replication_add_root_suffix_ldif_file(path, suffix):
  ldifLines = []
  equalChar = suffix.find('=')
  commaChar = suffix.find(',')
  if commaChar == -1:
    commaChar = len(suffix)
  rdnType = suffix[:equalChar].strip()
  rdnValue = suffix[equalChar + 1 : commaChar].strip()
  if rdnType == 'o':
    objclass = 'organization'
  elif rdnType == 'ou':
    objclass = 'organizationalunit'
  elif rdnType == 'dc':
    objclass = 'domain'
  else:
    objclass = 'unknown'
  ldifLines.append('dn: %s' % suffix)
  ldifLines.append('%s: %s' % (rdnType,rdnValue))
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: %s' % objclass)
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with an entry to add
# under a given suffix.
def write_replication_add_single_ldif_file(path, suffix):
  ldifLines = []
  ldifLines.append('dn: uid=scarter,%s' % suffix)
  ldifLines.append('cn: Sam Carter')
  ldifLines.append('sn: Carter')
  ldifLines.append('givenname: Sam')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: person')
  ldifLines.append('objectclass: organizationalPerson')
  ldifLines.append('objectclass: inetOrgPerson')
  ldifLines.append('ou: Accounting')
  ldifLines.append('ou: People')
  ldifLines.append('l: Sunnyvale')
  ldifLines.append('uid: scarter')
  ldifLines.append('mail: scarter@example.com')
  ldifLines.append('telephonenumber: +1 408 555 4798')
  ldifLines.append('facsimiletelephonenumber: +1 408 555 9751')
  ldifLines.append('roomnumber: 4612')
  ldifLines.append('userpassword: sprain')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the entries to add
# under a given suffix.
def write_replication_add_multiple_ldif_file(path, suffix):
  ldifLines = []
  ldifLines.append('dn: o=replication tests,%s' % suffix)
  ldifLines.append('o: replication tests')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organization')
  ldifLines.append('')
  ldifLines.append('dn: ou=People,o=replication tests,%s' % suffix)
  ldifLines.append('ou: People')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalunit')
  ldifLines.append('')
  ldifLines.append('dn: ou=Groups, o=replication tests,%s' % suffix)
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalunit')
  ldifLines.append('ou: Groups')
  ldifLines.append('')
  ldifLines.append('dn: cn=Directory Administrators, ou=Groups, o=replication tests,%s' % suffix)
  ldifLines.append('cn: Directory Administrators')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: groupofuniquenames')
  ldifLines.append('ou: Groups')
  ldifLines.append('uniquemember: uid=kvaughan, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('uniquemember: uid=rdaugherty, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('uniquemember: uid=hmiller, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('')
  ldifLines.append('dn: ou=Special Users,o=replication tests,%s' % suffix)
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalUnit')
  ldifLines.append('ou: Special Users')
  ldifLines.append('description: Special Administrative Accounts')
  ldifLines.append('')
  ldifLines.append('dn: uid=scarter,ou=People,o=replication tests,%s' % suffix)
  ldifLines.append('cn: Sam Carter')
  ldifLines.append('sn: Carter')
  ldifLines.append('givenname: Sam')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: person')
  ldifLines.append('objectclass: organizationalPerson')
  ldifLines.append('objectclass: inetOrgPerson')
  ldifLines.append('ou: Accounting')
  ldifLines.append('ou: People')
  ldifLines.append('l: Sunnyvale')
  ldifLines.append('uid: scarter')
  ldifLines.append('mail: scarter@example.com')
  ldifLines.append('telephonenumber: +1 408 555 4798')
  ldifLines.append('facsimiletelephonenumber: +1 408 555 9751')
  ldifLines.append('roomnumber: 4612')
  ldifLines.append('userpassword: sprain')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modify to operate
# on an entry in a given suffix.
def write_replication_mod_ldif_file(path, dn, mod_type, attr_type, attr_value):
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: modify')
  ldifLines.append('%s: %s' % (mod_type,attr_type))
  if attr_value != None :
    ldifLines.append('%s: %s' % (attr_type,attr_value))
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modify to operate
# on an entry in a given suffix.
def write_replication_mod_binary_ldif_file(path, dn, mod_type, attr_type, binary_value_path):
  # open file and read the binary value (which is encoded in base64)
  binaryValueFile = open(binary_value_path, "r")
  binaryValue = binaryValueFile.read()
  binaryValueFile.close()
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: modify')
  ldifLines.append('%s: %s' % (mod_type,attr_type))
  ldifLines.append('%s:: %s' % (attr_type,binaryValue))
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modDN to operate
# on an entry in a given suffix.
def write_replication_moddn_ldif_file(path, dn, newrdn, newsuperior, deleteoldrdn):
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: moddn')
  ldifLines.append('newRDN: %s' % newrdn)
  ldifLines.append('deleteOldRDN: %s' % deleteoldrdn)
  if newsuperior != None:
    ldifLines.append('newSuperior: %s' % newsuperior)
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
#!/usr/bin/python
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE
# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at
# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
# add the following below this CDDL HEADER, with the fields enclosed
# information:
#      Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
#      Portions Copyright 2007 Sun Microsystems, Inc.
# Global variable containing the list of servers ("Server" class instances) deployed
_topologyServerList = []
# Define ChangelogServer class
class ChangelogServer:
  def __init__(self, port, id):
    self.port = port
    self.id = id
    self.changelogServerList = []
  def addChangelogServer(self, hostname, port):
    self.changelogServerList.append('%s:%s' % (hostname, port))
  def getPort(self):
    return self.port
  def getId(self):
    return self.id
  def getChangelogServerList(self):
    return self.changelogServerList
# Define SynchronizedSuffix class:
class SynchronizedSuffix:
  def __init__(self, suffixDn, id):
    self.suffixDn = suffixDn
    self.id = id
    self.changelogServerList = []
  def addChangelogServer(self, hostname, port):
    self.changelogServerList.append('%s:%s' % (hostname, port))
  def getSuffixDn(self):
    return self.suffixDn
  def getId(self):
    return self.id
  def getChangelogServerList(self):
    return self.changelogServerList
# Define Server class
class Server:
  def __init__(self, hostname, dir, port, sslPort, jmxPort, rootDn, rootPwd, baseDn):
    self.hostname = hostname
    self.dir = dir
    self.port = port
    self.sslPort = sslPort
    self.jmxPort = jmxPort
    self.rootDn = rootDn
    self.rootPwd = rootPwd
    self.baseDn = baseDn
    self.changelogServer = None
    self.synchronizedSuffixList = []
  def __repr__(self):
    return "Server: hostname=%s, directory=%s" % (self.hostanme, self.dir)
  def addChangelogServer(self, changelogServer):
    self.changelogServer = changelogServer
  def addSynchronizedSuffix(self, synchronizedSuffix):
    self.synchronizedSuffixList.append(synchronizedSuffix)
  def getHostname(self):
    return self.hostname
  def getDir(self):
    return self.dir
  def getPort(self):
    return self.port
  def getSslPort(self):
    return self.sslPort
  def getJmxPort(self):
    return self.jmxPort
  def getRootDn(self):
    return self.rootDn
  def getRootPwd(self):
    return self.rootPwd
  def getBaseDn(self):
    return self.baseDn
  def getChangelogServer(self):
    return self.changelogServer
  def getSynchronizedSuffixList(self):
    return self.synchronizedSuffixList
  def requiresSynchronization(self):
    return (self.changelogServer is not None) or (len(self.synchronizedSuffixList) > 0)
# Define the function that writes a ldif file with the replication configuration
# corresponding to the given server.
def write_replication_conf_ldif_file(path, server):
  ldifLines = []
  # write the main replication configuration entry
  ldifLines.append('')
  ldifLines.append('dn: cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
  ldifLines.append('objectClass: top')
  ldifLines.append('objectClass: ds-cfg-synchronization-provider')
  ldifLines.append('objectClass: ds-cfg-replication-synchronization-provider')
  ldifLines.append('cn: Multimaster Synchronization')
  ldifLines.append('ds-cfg-enabled: true')
  ldifLines.append('ds-cfg-java-class: org.opends.server.replication.plugin.MultimasterReplication')
  # if server is a changelog server, write its corresponding configuration
  changelogServer = server.getChangelogServer()
  if changelogServer is not None :
    port = changelogServer.getPort()
    id = changelogServer.getId()
    list = changelogServer.getChangelogServerList()
    ldifLines.append('')
    ldifLines.append('dn: cn=Replication Server,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
    ldifLines.append('objectClass: top')
    ldifLines.append('objectClass: ds-cfg-replication-server')
    ldifLines.append('cn: Replication Server')
    ldifLines.append('ds-cfg-replication-port: %s' % port)
    for chglgServer in list:
      ldifLines.append('ds-cfg-replication-server: %s' % chglgServer)
    ldifLines.append('ds-cfg-replication-server-id: %s' % id)
  # write the domains replication configuration entry
  ldifLines.append('')
  ldifLines.append('dn: cn=domains,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config')
  ldifLines.append('objectClass: top')
  ldifLines.append('objectClass: ds-cfg-branch')
  ldifLines.append('cn: domains')
  # write the configuration for the synchronized suffixes, if any
  synchronizedSuffixList = server.getSynchronizedSuffixList()
  for i in range( len(synchronizedSuffixList) ):
    suffix = synchronizedSuffixList[i]
    dn = suffix.getSuffixDn()
    id = suffix.getId()
    list = suffix.getChangelogServerList()
    name = 'SUFFIX-%s' % i
    ldifLines.append('')
    ldifLines.append('dn: cn=%s,cn=domains,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config' % name)
    ldifLines.append('objectClass: top')
    ldifLines.append('objectClass: ds-cfg-replication-domain')
    ldifLines.append('cn: %s' % name)
    ldifLines.append('ds-cfg-base-dn: %s' % dn)
    for chglgServer in list:
      ldifLines.append('ds-cfg-replication-server: %s' % chglgServer)
    ldifLines.append('ds-cfg-server-id: %s' % id)
    ldifLines.append('ds-cfg-receive-status: true')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the root suffix entry to add
# for a given suffix.
def write_replication_add_root_suffix_ldif_file(path, suffix):
  ldifLines = []
  equalChar = suffix.find('=')
  commaChar = suffix.find(',')
  if commaChar == -1:
    commaChar = len(suffix)
  rdnType = suffix[:equalChar].strip()
  rdnValue = suffix[equalChar + 1 : commaChar].strip()
  if rdnType == 'o':
    objclass = 'organization'
  elif rdnType == 'ou':
    objclass = 'organizationalunit'
  elif rdnType == 'dc':
    objclass = 'domain'
  else:
    objclass = 'unknown'
  ldifLines.append('dn: %s' % suffix)
  ldifLines.append('%s: %s' % (rdnType,rdnValue))
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: %s' % objclass)
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with an entry to add
# under a given suffix.
def write_replication_add_single_ldif_file(path, suffix):
  ldifLines = []
  ldifLines.append('dn: uid=scarter,%s' % suffix)
  ldifLines.append('cn: Sam Carter')
  ldifLines.append('sn: Carter')
  ldifLines.append('givenname: Sam')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: person')
  ldifLines.append('objectclass: organizationalPerson')
  ldifLines.append('objectclass: inetOrgPerson')
  ldifLines.append('ou: Accounting')
  ldifLines.append('ou: People')
  ldifLines.append('l: Sunnyvale')
  ldifLines.append('uid: scarter')
  ldifLines.append('mail: scarter@example.com')
  ldifLines.append('telephonenumber: +1 408 555 4798')
  ldifLines.append('facsimiletelephonenumber: +1 408 555 9751')
  ldifLines.append('roomnumber: 4612')
  ldifLines.append('userpassword: sprain')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the entries to add
# under a given suffix.
def write_replication_add_multiple_ldif_file(path, suffix):
  ldifLines = []
  ldifLines.append('dn: o=replication tests,%s' % suffix)
  ldifLines.append('o: replication tests')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organization')
  ldifLines.append('')
  ldifLines.append('dn: ou=People,o=replication tests,%s' % suffix)
  ldifLines.append('ou: People')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalunit')
  ldifLines.append('')
  ldifLines.append('dn: ou=Groups, o=replication tests,%s' % suffix)
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalunit')
  ldifLines.append('ou: Groups')
  ldifLines.append('')
  ldifLines.append('dn: cn=Directory Administrators, ou=Groups, o=replication tests,%s' % suffix)
  ldifLines.append('cn: Directory Administrators')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: groupofuniquenames')
  ldifLines.append('ou: Groups')
  ldifLines.append('uniquemember: uid=kvaughan, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('uniquemember: uid=rdaugherty, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('uniquemember: uid=hmiller, ou=People, o=replication tests,%s' % suffix)
  ldifLines.append('')
  ldifLines.append('dn: ou=Special Users,o=replication tests,%s' % suffix)
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: organizationalUnit')
  ldifLines.append('ou: Special Users')
  ldifLines.append('description: Special Administrative Accounts')
  ldifLines.append('')
  ldifLines.append('dn: uid=scarter,ou=People,o=replication tests,%s' % suffix)
  ldifLines.append('cn: Sam Carter')
  ldifLines.append('sn: Carter')
  ldifLines.append('givenname: Sam')
  ldifLines.append('objectclass: top')
  ldifLines.append('objectclass: person')
  ldifLines.append('objectclass: organizationalPerson')
  ldifLines.append('objectclass: inetOrgPerson')
  ldifLines.append('ou: Accounting')
  ldifLines.append('ou: People')
  ldifLines.append('l: Sunnyvale')
  ldifLines.append('uid: scarter')
  ldifLines.append('mail: scarter@example.com')
  ldifLines.append('telephonenumber: +1 408 555 4798')
  ldifLines.append('facsimiletelephonenumber: +1 408 555 9751')
  ldifLines.append('roomnumber: 4612')
  ldifLines.append('userpassword: sprain')
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modify to operate
# on an entry in a given suffix.
def write_replication_mod_ldif_file(path, dn, mod_type, attr_type, attr_value):
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: modify')
  ldifLines.append('%s: %s' % (mod_type,attr_type))
  if attr_value != None :
    ldifLines.append('%s: %s' % (attr_type,attr_value))
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modify to operate
# on an entry in a given suffix.
def write_replication_mod_binary_ldif_file(path, dn, mod_type, attr_type, binary_value_path):
  # open file and read the binary value (which is encoded in base64)
  binaryValueFile = open(binary_value_path, "r")
  binaryValue = binaryValueFile.read()
  binaryValueFile.close()
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: modify')
  ldifLines.append('%s: %s' % (mod_type,attr_type))
  ldifLines.append('%s:: %s' % (attr_type,binaryValue))
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()
# Define the function that writes a ldif file with the modDN to operate
# on an entry in a given suffix.
def write_replication_moddn_ldif_file(path, dn, newrdn, newsuperior, deleteoldrdn):
  ldifLines = []
  ldifLines.append('dn: %s' % dn)
  ldifLines.append('changetype: moddn')
  ldifLines.append('newRDN: %s' % newrdn)
  ldifLines.append('deleteOldRDN: %s' % deleteoldrdn)
  if newsuperior != None:
    ldifLines.append('newSuperior: %s' % newsuperior)
  # write out the ldif file
  outfile = open(path,"w")
  for line in ldifLines:
    outfile.write("%s\n" % line)
  outfile.close()