provision: Add support for IPv6 (bz #4593).
authorAndrew Kroeger <andrew@sprocks.gotdns.com>
Wed, 2 Apr 2008 00:51:24 +0000 (19:51 -0500)
committerAndrew Kroeger <andrew@sprocks.gotdns.com>
Wed, 2 Apr 2008 00:51:24 +0000 (19:51 -0500)
(This used to be commit 8585a3c77d5dfe97bca3f08716fc06ac2819f578)

source4/scripting/python/samba/provision.py
source4/setup/provision
source4/setup/provision.zone

index b03457e57bbd3b97e12663f56bcad9861ee0a560..870f64ecc91427de70f6f4f56c1307ed5134beaf 100644 (file)
@@ -28,7 +28,7 @@ import pwd
 import grp
 import time
 import uuid, misc
-from socket import gethostname, gethostbyname
+import socket
 import param
 import registry
 import samba
@@ -267,7 +267,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, serverrole=
               rootdn=None, domaindn=None, configdn=None, schemadn=None, sitename=None):
 
     if hostname is None:
-        hostname = gethostname().split(".")[0].lower()
+        hostname = socket.gethostname().split(".")[0].lower()
 
     netbiosname = hostname.upper()
     if not valid_netbios_name(netbiosname):
@@ -348,7 +348,7 @@ def load_or_make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrol
 
     if not os.path.exists(smbconf):
         if hostname is None:
-            hostname = gethostname().split(".")[0].lower()
+            hostname = socket.gethostname().split(".")[0].lower()
 
         if serverrole is None:
             serverrole = "standalone"
@@ -901,7 +901,7 @@ FILL_DRS = "DRS"
 def provision(setup_dir, message, session_info, 
               credentials, smbconf=None, targetdir=None, samdb_fill=FILL_FULL, realm=None, 
               rootdn=None, domaindn=None, schemadn=None, configdn=None,
-              domain=None, hostname=None, hostip=None, domainsid=None, 
+              domain=None, hostname=None, hostip=None, hostip6=None, domainsid=None, 
               hostguid=None, adminpass=None, krbtgtpass=None, domainguid=None, 
               policyguid=None, invocationid=None, machinepass=None, 
               dnspass=None, root=None, nobody=None, nogroup=None, users=None, 
@@ -955,7 +955,12 @@ def provision(setup_dir, message, session_info,
     paths = provision_paths_from_lp(lp, names.dnsdomain)
 
     if hostip is None:
-        hostip = gethostbyname(names.hostname)
+        hostip = socket.getaddrinfo(names.hostname, None, socket.AF_INET, socket.AI_CANONNAME, socket.IPPROTO_IP)[0][-1][0]
+
+    if hostip6 is None:
+        try:
+            hostip6 = socket.getaddrinfo(names.hostname, None, socket.AF_INET6, socket.AI_CANONNAME, socket.IPPROTO_IP)[0][-1][0]
+        except socket.gaierror: pass
 
     if serverrole is None:
         serverrole = lp.get("server role")
@@ -1048,7 +1053,8 @@ def provision(setup_dir, message, session_info,
             assert isinstance(hostguid, str)
             
             create_zone_file(paths.dns, setup_path, samdb, 
-                             hostname=names.hostname, hostip=hostip, dnsdomain=names.dnsdomain,
+                             hostname=names.hostname, hostip=hostip,
+                             hostip6=hostip6, dnsdomain=names.dnsdomain,
                              domaindn=names.domaindn, dnspass=dnspass, realm=names.realm, 
                              domainguid=domainguid, hostguid=hostguid)
             message("Please install the zone located in %s into your DNS server" % paths.dns)
@@ -1114,7 +1120,7 @@ def provision_backend(setup_dir=None, message=None,
         return os.path.join(setup_dir, file)
 
     if hostname is None:
-        hostname = gethostname().split(".")[0].lower()
+        hostname = socket.gethostname().split(".")[0].lower()
 
     if root is None:
         root = findnss(pwd.getpwnam, ["root"])[0]
@@ -1247,7 +1253,7 @@ def create_phpldapadmin_config(path, setup_path, ldapi_uri):
 
 
 def create_zone_file(path, setup_path, samdb, dnsdomain, domaindn, 
-                  hostip, hostname, dnspass, realm, domainguid, hostguid):
+                  hostip, hostip6, hostname, dnspass, realm, domainguid, hostguid):
     """Write out a DNS zone file, from the info in the current database.
     
     :param path: Path of the new file.
@@ -1255,7 +1261,8 @@ def create_zone_file(path, setup_path, samdb, dnsdomain, domaindn,
     :param samdb: SamDB object
     :param dnsdomain: DNS Domain name
     :param domaindn: DN of the Domain
-    :param hostip: Local IP
+    :param hostip: Local IPv4 IP
+    :param hostip6: Local IPv6 IP
     :param hostname: Local hostname
     :param dnspass: Password for DNS
     :param realm: Realm name
@@ -1264,6 +1271,13 @@ def create_zone_file(path, setup_path, samdb, dnsdomain, domaindn,
     """
     assert isinstance(domainguid, str)
 
+    hostip6_base_line = ""
+    hostip6_host_line = ""
+
+    if hostip6 is not None:
+        hostip6_base_line = "                  IN AAAA " + hostip6
+        hostip6_host_line = hostname + "               IN AAAA " + hostip6
+
     setup_file(setup_path("provision.zone"), path, {
             "DNSPASS_B64": b64encode(dnspass),
             "HOSTNAME": hostname,
@@ -1274,6 +1288,8 @@ def create_zone_file(path, setup_path, samdb, dnsdomain, domaindn,
             "DATESTRING": time.strftime("%Y%m%d%H"),
             "DEFAULTSITE": DEFAULTSITE,
             "HOSTGUID": hostguid,
+            "HOSTIP6_BASE_LINE": hostip6_base_line,
+            "HOSTIP6_HOST_LINE": hostip6_host_line,
         })
 
 def load_schema(setup_path, samdb, schemadn, netbiosname, configdn, sitename):
index e354f4d0bbcc5ea360566319c8cd522991eb1443..f940b30744e9fb4dfd279be708a4df8e303825d2 100755 (executable)
@@ -55,7 +55,9 @@ parser.add_option("--policy-guid", type="string", metavar="GUID",
 parser.add_option("--host-name", type="string", metavar="HOSTNAME", 
                help="set hostname")
 parser.add_option("--host-ip", type="string", metavar="IPADDRESS", 
-               help="set ipaddress")
+               help="set IPv4 ipaddress")
+parser.add_option("--host-ip6", type="string", metavar="IP6ADDRESS", 
+               help="set IPv6 ipaddress")
 parser.add_option("--host-guid", type="string", metavar="GUID", 
                help="set hostguid (otherwise random)")
 parser.add_option("--invocationid", type="string", metavar="GUID", 
@@ -141,7 +143,7 @@ provision(setup_dir, message,
           samdb_fill=samdb_fill, realm=opts.realm, domain=opts.domain,
           domainguid=opts.domain_guid, domainsid=opts.domain_sid,
           policyguid=opts.policy_guid, hostname=opts.host_name,
-          hostip=opts.host_ip, hostguid=opts.host_guid, 
+          hostip=opts.host_ip, hostip6=opts.host_ip6, hostguid=opts.host_guid, 
           invocationid=opts.invocationid, adminpass=opts.adminpass,
           krbtgtpass=opts.krbtgtpass, machinepass=opts.machinepass,
           dnspass=opts.dnspass, root=opts.root, nobody=opts.nobody,
index 371dfd9e7243acdf6ca6c6ac09855f272210b7bb..28c1c2976219e5fc67dfefcd25883c7f90abe03d 100644 (file)
@@ -9,8 +9,10 @@ $TTL 1W
                                 6W              ; expiry
                                 1W )            ; minimum
                        IN NS   ${HOSTNAME}
+${HOSTIP6_BASE_LINE}
                        IN A    ${HOSTIP}
 ;
+${HOSTIP6_HOST_LINE}
 ${HOSTNAME}            IN A    ${HOSTIP}
 ${HOSTGUID}._msdcs     IN CNAME ${HOSTNAME}
 ;