Fix up new OpenLDAP MMR code.
[tprouty/samba.git] / source / scripting / python / samba / provision.py
index 13329e8b10469589946d5bb870ee8f1b704d3270..f48a49dcfa59fb1a46aee0a27f33b6e75ae2f53f 100644 (file)
@@ -53,7 +53,7 @@ class InvalidNetbiosName(Exception):
         super(InvalidNetbiosName, self).__init__("The name '%r' is not a valid NetBIOS name" % name)
 
 
-class ProvisionPaths:
+class ProvisionPaths(object):
     def __init__(self):
         self.shareconf = None
         self.hklm = None
@@ -76,8 +76,11 @@ class ProvisionPaths:
         self.memberofconf = None
         self.fedoradsinf = None
         self.fedoradspartitions = None
-class ProvisionNames:
+       self.olmmron = None
+       self.olmmrserveridsconf = None
+       self.olmmrsyncreplconf = None
+
+class ProvisionNames(object):
     def __init__(self):
         self.rootdn = None
         self.domaindn = None
@@ -92,7 +95,8 @@ class ProvisionNames:
         self.sitename = None
         self.smbconf = None
     
-class ProvisionResult:
+
+class ProvisionResult(object):
     def __init__(self):
         self.paths = None
         self.domaindn = None
@@ -239,9 +243,13 @@ def provision_paths_from_lp(lp, dnsdomain):
     paths.memberofconf = os.path.join(paths.ldapdir, 
                                       "memberof.conf")
     paths.fedoradsinf = os.path.join(paths.ldapdir, 
-                                   "fedorads.inf")
+                                     "fedorads.inf")
     paths.fedoradspartitions = os.path.join(paths.ldapdir, 
                                             "fedorads-partitions.ldif")
+    paths.olmmrserveridsconf = os.path.join(paths.ldapdir, 
+                                            "mmr_serverids.conf")
+    paths.olmmrsyncreplconf = os.path.join(paths.ldapdir, 
+                                           "mmr_syncrepl.conf")
     paths.hklm = "hklm.ldb"
     paths.hkcr = "hkcr.ldb"
     paths.hkcu = "hkcu.ldb"
@@ -329,7 +337,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, serverrole=
     names.hostname = hostname
     names.sitename = sitename
     names.serverdn = "CN=%s,CN=Servers,CN=%s,CN=Sites,%s" % (netbiosname, sitename, configdn)
-    
     return names
     
 
@@ -739,7 +747,8 @@ def setup_samdb(path, setup_path, session_info, credentials, lp,
         samdb.set_invocation_id(invocationid)
 
     load_schema(setup_path, samdb, names.schemadn, names.netbiosname, 
-                names.configdn, names.sitename)
+                names.configdn, names.sitename, names.serverdn,
+                names.hostname)
 
     samdb.transaction_start()
         
@@ -779,7 +788,6 @@ def setup_samdb(path, setup_path, session_info, credentials, lp,
         setup_add_ldif(samdb, setup_path("provision_configuration_basedn.ldif"), {
             "CONFIGDN": names.configdn, 
             "ACI": aci,
-            "EXTENSIBLEOBJECT": "# no objectClass: extensibleObject for local ldb",
             })
         message("Modifying configuration container")
         setup_modify_ldif(samdb, setup_path("provision_configuration_basedn_modify.ldif"), {
@@ -791,7 +799,6 @@ def setup_samdb(path, setup_path, session_info, credentials, lp,
         setup_add_ldif(samdb, setup_path("provision_schema_basedn.ldif"), {
             "SCHEMADN": names.schemadn,
             "ACI": aci,
-            "EXTENSIBLEOBJECT": "# no objectClass: extensibleObject for local ldb"
             })
         message("Modifying schema container")
 
@@ -1140,7 +1147,8 @@ def provision_backend(setup_dir=None, message=None,
                       smbconf=None, targetdir=None, realm=None, 
                       rootdn=None, domaindn=None, schemadn=None, configdn=None,
                       domain=None, hostname=None, adminpass=None, root=None, serverrole=None, 
-                      ldap_backend_type=None, ldap_backend_port=None):
+                      ldap_backend_type=None, ldap_backend_port=None,
+                     ol_mmr_urls=None):
 
     def setup_path(file):
         return os.path.join(setup_dir, file)
@@ -1189,7 +1197,6 @@ def provision_backend(setup_dir=None, message=None,
     setup_add_ldif(schemadb, setup_path("provision_schema_basedn.ldif"), 
                    {"SCHEMADN": names.schemadn,
                     "ACI": "#",
-                    "EXTENSIBLEOBJECT": "# no objectClass: extensibleObject for local ldb"
                     })
     setup_modify_ldif(schemadb, 
                       setup_path("provision_schema_basedn_modify.ldif"), \
@@ -1255,7 +1262,51 @@ def provision_backend(setup_dir=None, message=None,
 
         refint_config = read_and_sub_file(setup_path("refint.conf"),
                                             { "LINK_ATTRS" : refint_attributes})
-    
+
+# generate serverids, ldap-urls and syncrepl-blocks for mmr hosts
+       mmr_on_config = ""
+       mmr_serverids_config = ""
+        mmr_syncrepl_schema_config = "" 
+       mmr_syncrepl_config_config = "" 
+       mmr_syncrepl_user_config = "" 
+       
+       if ol_mmr_urls is not None:
+               mmr_hosts=filter(None,ol_mmr_urls.split(' ')) 
+                if (len(mmr_hosts) == 1):
+                    mmr_hosts=filter(None,ol_mmr_urls.split(',')) 
+                     
+
+               mmr_on_config = "MirrorMode On"
+               
+               z=0
+               for i in mmr_hosts:
+                       z=z+1
+                       mmr_serverids_config += read_and_sub_file(setup_path("mmr_serverids.conf"),
+                                                                    { "SERVERID" : str(z),
+                                                                      "LDAPSERVER" : i })
+
+                       z=z+1
+                       mmr_syncrepl_schema_config += read_and_sub_file(setup_path("mmr_syncrepl.conf"),
+                                                                    {  "RID" : str(z),
+                                                                       "MMRDN": names.schemadn,
+                                                                       "LDAPSERVER" : i,
+                                                                        "MMR_PASSWORD": adminpass})
+
+                       z=z+1
+                       mmr_syncrepl_config_config += read_and_sub_file(setup_path("mmr_syncrepl.conf"),
+                                                                    {  "RID" : str(z),
+                                                                       "MMRDN": names.configdn,
+                                                                       "LDAPSERVER" : i,
+                                                                        "MMR_PASSWORD": adminpass})
+
+                       z=z+1
+                       mmr_syncrepl_user_config += read_and_sub_file(setup_path("mmr_syncrepl.conf"),
+                                                                    {  "RID" : str(z),
+                                                                       "MMRDN": names.domaindn,
+                                                                       "LDAPSERVER" : i,
+                                                                        "MMR_PASSWORD": adminpass })
+
+
         setup_file(setup_path("slapd.conf"), paths.slapdconf,
                    {"DNSDOMAIN": names.dnsdomain,
                     "LDAPDIR": paths.ldapdir,
@@ -1263,8 +1314,14 @@ def provision_backend(setup_dir=None, message=None,
                     "CONFIGDN": names.configdn,
                     "SCHEMADN": names.schemadn,
                     "MEMBEROF_CONFIG": memberof_config,
+                    "MIRRORMODE": mmr_on_config,
+                    "MMR_SERVERIDS_CONFIG": mmr_serverids_config,
+                    "MMR_SYNCREPL_SCHEMA_CONFIG": mmr_syncrepl_schema_config,
+                    "MMR_SYNCREPL_CONFIG_CONFIG": mmr_syncrepl_config_config,
+                    "MMR_SYNCREPL_USER_CONFIG": mmr_syncrepl_user_config,
+                    "MMR_PASSWORD": adminpass,
                     "REFINT_CONFIG": refint_config})
-        setup_file(setup_path("modules.conf"), paths.modulesconf,
+       setup_file(setup_path("modules.conf"), paths.modulesconf,
                    {"REALM": names.realm})
         
         setup_db_config(setup_path, os.path.join(paths.ldapdir, "db", "user"))
@@ -1426,7 +1483,8 @@ def create_krb5_conf(path, setup_path, dnsdomain, hostname, realm):
         })
 
 
-def load_schema(setup_path, samdb, schemadn, netbiosname, configdn, sitename):
+def load_schema(setup_path, samdb, schemadn, netbiosname, configdn, sitename,
+                serverdn, servername):
     """Load schema for the SamDB.
     
     :param samdb: Load a schema into a SamDB.
@@ -1434,10 +1492,13 @@ def load_schema(setup_path, samdb, schemadn, netbiosname, configdn, sitename):
     :param schemadn: DN of the schema
     :param netbiosname: NetBIOS name of the host.
     :param configdn: DN of the configuration
+    :param serverdn: DN of the server
+    :param servername: Host name of the server
     """
     schema_data = open(setup_path("schema.ldif"), 'r').read()
     schema_data += open(setup_path("schema_samba4.ldif"), 'r').read()
     schema_data = substitute_var(schema_data, {"SCHEMADN": schemadn})
+    check_all_substituted(schema_data)
     prefixmap = open(setup_path("prefixMap.txt"), 'r').read()
     prefixmap = b64encode(prefixmap)
 
@@ -1446,8 +1507,11 @@ def load_schema(setup_path, samdb, schemadn, netbiosname, configdn, sitename):
                     "SCHEMADN": schemadn,
                     "NETBIOSNAME": netbiosname,
                     "CONFIGDN": configdn,
-                    "DEFAULTSITE":sitename,
-                    "PREFIXMAP_B64":prefixmap
+                    "DEFAULTSITE": sitename,
+                    "PREFIXMAP_B64": prefixmap,
+                    "SERVERDN": serverdn,
+                    "SERVERNAME": servername,
     })
+    check_all_substituted(head_data)
     samdb.attach_schema_from_ldif(head_data, schema_data)