s4-provision: freeze the DNS zone before creating the zone file
[ira/wip.git] / source4 / scripting / python / samba / provision.py
index b127d6cc549d865c539867d92a511ee68708f5d1..1e1bf480f53259e9273a4c8cc1d8a51cbfd4c9cd 100644 (file)
@@ -1375,7 +1375,7 @@ def provision(setup_dir, message, session_info,
 
             # Only make a zone file on the first DC, it should be replicated
             # with DNS replication
 
             # Only make a zone file on the first DC, it should be replicated
             # with DNS replication
-            create_zone_file(message, paths, setup_path, dnsdomain=names.dnsdomain,
+            create_zone_file(lp, message, paths, targetdir, setup_path, dnsdomain=names.dnsdomain,
                              hostip=hostip,
                              hostip6=hostip6, hostname=names.hostname,
                              realm=names.realm,
                              hostip=hostip,
                              hostip6=hostip6, hostname=names.hostname,
                              realm=names.realm,
@@ -1486,7 +1486,7 @@ def create_phpldapadmin_config(path, setup_path, ldapi_uri):
             {"S4_LDAPI_URI": ldapi_uri})
 
 
             {"S4_LDAPI_URI": ldapi_uri})
 
 
-def create_zone_file(message, paths, setup_path, dnsdomain,
+def create_zone_file(lp, message, paths, targetdir, setup_path, dnsdomain,
                      hostip, hostip6, hostname, realm, domainguid,
                      ntdsguid):
     """Write out a DNS zone file, from the info in the current database.
                      hostip, hostip6, hostname, realm, domainguid,
                      ntdsguid):
     """Write out a DNS zone file, from the info in the current database.
@@ -1527,6 +1527,11 @@ def create_zone_file(message, paths, setup_path, dnsdomain,
 
     os.mkdir(dns_dir, 0775)
 
 
     os.mkdir(dns_dir, 0775)
 
+    # we need to freeze the zone while we update the contents
+    if targetdir is None:
+        rndc = lp.get("rndc command")
+        os.system(rndc + " freeze " + lp.get("realm"))
+
     setup_file(setup_path("provision.zone"), paths.dns, {
             "HOSTNAME": hostname,
             "DNSDOMAIN": dnsdomain,
     setup_file(setup_path("provision.zone"), paths.dns, {
             "HOSTNAME": hostname,
             "DNSDOMAIN": dnsdomain,
@@ -1551,6 +1556,9 @@ def create_zone_file(message, paths, setup_path, dnsdomain,
         except OSError:
             message("Failed to chown %s to bind gid %u" % (dns_dir, paths.bind_gid))
 
         except OSError:
             message("Failed to chown %s to bind gid %u" % (dns_dir, paths.bind_gid))
 
+    if targetdir is None:
+        os.system(rndc + " unfreeze " + lp.get("realm"))
+
 
 def create_named_conf(paths, setup_path, realm, dnsdomain,
                       private_dir):
 
 def create_named_conf(paths, setup_path, realm, dnsdomain,
                       private_dir):