samba-tool: make provision check for bind version
authorGarming Sam <garming@catalyst.net.nz>
Thu, 19 Dec 2013 02:06:51 +0000 (15:06 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 9 Mar 2014 01:52:49 +0000 (02:52 +0100)
(small corrections and TODO added following Jelmer's review by abartlet)
Signed-off-by: Garming Sam <garming@catalyst.net.nz>
Change-Id: Iba9a709641dad9f2ae05df0b26ac4cd2ebfc84f0
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Jelmer Vernooij <jelmer@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Sun Mar  9 02:52:50 CET 2014 on sn-devel-104

python/samba/provision/sambadns.py
source4/scripting/bin/samba_upgradedns
source4/setup/named.conf.dlz

index 5fd3805786f5232c8abef45e87b39106d5a7a152..13e03aba5a588256f5198bf30895c725ac6dfe4c 100644 (file)
@@ -26,6 +26,7 @@ import shutil
 import time
 import ldb
 from base64 import b64encode
+import subprocess
 import samba
 from samba.tdb_util import tdb_copy
 from samba.ndr import ndr_pack, ndr_unpack
@@ -870,7 +871,7 @@ def create_dns_update_list(lp, logger, paths):
     setup_file(setup_path("spn_update_list"), paths.spn_update_list, None)
 
 
-def create_named_conf(paths, realm, dnsdomain, dns_backend):
+def create_named_conf(paths, realm, dnsdomain, dns_backend, logger):
     """Write out a file containing zone statements suitable for inclusion in a
     named.conf file (including GSS-TSIG configuration).
 
@@ -879,8 +880,16 @@ def create_named_conf(paths, realm, dnsdomain, dns_backend):
     :param dnsdomain: DNS Domain name
     :param dns_backend: DNS backend type
     :param keytab_name: File name of DNS keytab file
+    :param logger: Logger object
     """
 
+    # TODO: This really should have been done as a top level import.
+    # It is done here to avoid a depencency loop.  That is, we move
+    # ProvisioningError to another file, and have all the provision
+    # scripts import it from there.
+
+    from samba.provision import ProvisioningError
+
     if dns_backend == "BIND9_FLATFILE":
         setup_file(setup_path("named.conf"), paths.namedconf, {
                     "DNSDOMAIN": dnsdomain,
@@ -894,9 +903,25 @@ def create_named_conf(paths, realm, dnsdomain, dns_backend):
         setup_file(setup_path("named.conf.update"), paths.namedconf_update)
 
     elif dns_backend == "BIND9_DLZ":
+        bind_info = subprocess.Popen(['named -V'], shell=True,
+                                     stdout=subprocess.PIPE,
+                                     stderr=subprocess.STDOUT,
+                                     cwd='.').communicate()[0]
+        bind98 = '#'
+        bind99 = '#'
+        if bind_info.upper().find('BIND 9.8') != -1:
+            bind98 = ''
+        elif bind_info.upper().find('BIND 9.9') != -1:
+            bind99 = ''
+        elif bind_info.upper().find('BIND 9.7') != -1:
+            raise ProvisioningError("DLZ option incompatible with BIND 9.7.")
+        else:
+            logger.warning("BIND version unknown, please modify %s manually." % paths.namedconf)
         setup_file(setup_path("named.conf.dlz"), paths.namedconf, {
                     "NAMED_CONF": paths.namedconf,
                     "MODULESDIR" : samba.param.modules_dir(),
+                    "BIND98" : bind98,
+                    "BIND99" : bind99
                     })
 
 
@@ -1151,7 +1176,8 @@ def setup_bind9_dns(samdb, secretsdb, domainsid, names, paths, lp, logger,
         create_samdb_copy(samdb, logger, paths, names, domainsid, domainguid)
 
     create_named_conf(paths, realm=names.realm,
-                      dnsdomain=names.dnsdomain, dns_backend=dns_backend)
+                      dnsdomain=names.dnsdomain, dns_backend=dns_backend,
+                      logger=logger)
 
     create_named_txt(paths.namedtxt,
                      realm=names.realm, dnsdomain=names.dnsdomain,
index c4f21449699c8ef3ab24d80d44de6a1a630f2b2a..4d497704936f086b57ec422cf31af37e5d666eae 100755 (executable)
@@ -463,7 +463,7 @@ if __name__ == '__main__':
         create_samdb_copy(ldbs.sam, logger, paths, names, domainsid,
                           domainguid)
 
-        create_named_conf(paths, names.realm, dnsdomain, opts.dns_backend)
+        create_named_conf(paths, names.realm, dnsdomain, opts.dns_backend, logger)
 
         create_named_txt(paths.namedtxt, names.realm, dnsdomain, dnsname,
                          paths.private_dir, paths.dns_keytab)
index be20a57a6387c46ed84cf522dacb98a6527f524b..d91a020f911596cc066ed3d8d3c6cfba243b9310 100644 (file)
@@ -11,9 +11,9 @@
 #
 dlz "AD DNS Zone" {
     # For BIND 9.8.0
-    database "dlopen ${MODULESDIR}/bind9/dlz_bind9.so";
+    ${BIND98} database "dlopen ${MODULESDIR}/bind9/dlz_bind9.so";
 
     # For BIND 9.9.0
-    # database "dlopen ${MODULESDIR}/bind9/dlz_bind9_9.so";
+    ${BIND99} database "dlopen ${MODULESDIR}/bind9/dlz_bind9_9.so";
 };