From 9b9fdeefb47f2657c9bb4c2f48318550da510209 Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 31 Jan 2012 15:33:54 +1100 Subject: s4-provision: dns: Refactor population of dns data code Code is split in 4 functions - create_dns_legacy - fill_dns_data_legacy - create_dns_partitions - fill_dns_data_partitions This is useful to upgrade dns provision from file based DNS backend to AD based DNS backend. --- .../scripting/python/samba/provision/sambadns.py | 154 +++++++++++++-------- 1 file changed, 98 insertions(+), 56 deletions(-) (limited to 'source4') diff --git a/source4/scripting/python/samba/provision/sambadns.py b/source4/scripting/python/samba/provision/sambadns.py index 4805294676..34bcf72c03 100644 --- a/source4/scripting/python/samba/provision/sambadns.py +++ b/source4/scripting/python/samba/provision/sambadns.py @@ -823,7 +823,6 @@ def create_named_conf(paths, realm, dnsdomain, dns_backend): }) - def create_named_txt(path, realm, dnsdomain, dnsname, private_dir, keytab_name): """Write out a file containing zone statements suitable for inclusion in a @@ -846,13 +845,89 @@ def create_named_txt(path, realm, dnsdomain, dnsname, private_dir, def is_valid_dns_backend(dns_backend): - return dns_backend in ("BIND9_FLATFILE", "BIND9_DLZ", "SAMBA_INTERNAL", "NONE") + return dns_backend in ("BIND9_FLATFILE", "BIND9_DLZ", "SAMBA_INTERNAL", "NONE") def is_valid_os_level(os_level): return DS_DOMAIN_FUNCTION_2000 <= os_level <= DS_DOMAIN_FUNCTION_2008_R2 +def create_dns_legacy(samdb, domainsid, forestdn, dnsadmins_sid): + # Set up MicrosoftDNS container + add_dns_container(samdb, forestdn, "CN=System", domainsid, dnsadmins_sid) + # Add root servers + add_rootservers(samdb, forestdn, "CN=System") + + +def fill_dns_data_legacy(samdb, domainsid, forestdn, dnsdomain, site, hostname, + hostip, hostip6): + # Add domain record + add_domain_record(samdb, forestdn, "CN=System", dnsdomain, domainsid, + dnsadmins_sid) + + # Add DNS records for a DC in domain + add_dc_domain_records(samdb, forestdn, "CN=System", site, dnsdomain, + hostname, hostip, hostip6) + + +def create_dns_partitions(samdb, domainsid, names, domaindn, forestdn, + dnsadmins_sid): + # Set up additional partitions (DomainDnsZones, ForstDnsZones) + setup_dns_partitions(samdb, domainsid, domaindn, forestdn, + names.configdn, names.serverdn) + + # Set up MicrosoftDNS containers + add_dns_container(samdb, domaindn, "DC=DomainDnsZones", domainsid, + dnsadmins_sid) + add_dns_container(samdb, forestdn, "DC=ForestDnsZones", domainsid, + dnsadmins_sid) + + +def fill_dns_data_partitions(samdb, domainsid, site, domaindn, forestdn, + dnsdomain, dnsforest, hostname, hostip, hostip6, + domainguid, ntdsguid, dnsadmins_sid, autofill=True): + """Fill data in various AD partitions + + :param samdb: LDB object connected to sam.ldb file + :param domainsid: Domain SID (as dom_sid object) + :param site: Site name to create hostnames in + :param domaindn: DN of the domain + :param forestdn: DN of the forest + :param dnsdomain: DNS name of the domain + :param dnsforest: DNS name of the forest + :param hostname: Host name of this DC + :param hostip: IPv4 addresses + :param hostip6: IPv6 addresses + :param domainguid: Domain GUID + :param ntdsguid: NTDS GUID + :param dnsadmins_sid: SID for DnsAdmins group + :param autofill: Create DNS records (using fixed template) + """ + + ##### Set up DC=DomainDnsZones, + # Add rootserver records + add_rootservers(samdb, domaindn, "DC=DomainDnsZones") + + # Add domain record + add_domain_record(samdb, domaindn, "DC=DomainDnsZones", dnsdomain, + domainsid, dnsadmins_sid) + + # Add DNS records for a DC in domain + if autofill: + add_dc_domain_records(samdb, domaindn, "DC=DomainDnsZones", site, + dnsdomain, hostname, hostip, hostip6) + + ##### Set up DC=ForestDnsZones, + # Add _msdcs record + add_msdcs_record(samdb, forestdn, "DC=ForestDnsZones", dnsforest) + + # Add DNS records for a DC in forest + if autofill: + add_dc_msdcs_records(samdb, forestdn, "DC=ForestDnsZones", site, + dnsforest, hostname, hostip, hostip6, + domainguid, ntdsguid) + + def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_backend, os_level, site, dnspass=None, hostip=None, hostip6=None, targetdir=None): @@ -860,6 +935,7 @@ def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_back :param samdb: LDB object connected to sam.ldb file :param secretsdb: LDB object connected to secrets.ldb file + :param domainsid: Domain SID (as dom_sid object) :param names: Names shortcut :param paths: Paths shortcut :param lp: Loadparm object @@ -883,6 +959,10 @@ def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_back logger.info("No DNS backend set, not configuring DNS") return + # Add dns accounts (DnsAdmins, DnsUpdateProxy) in domain + logger.info("Adding DNS accounts") + add_dns_accounts(samdb, names.domaindn) + # If dns_backend is BIND9_FLATFILE # Populate only CN=MicrosoftDNS,CN=System, # @@ -898,7 +978,6 @@ def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_back # Domain records are in CN=MicrosoftDNS,CN=System, # Domain records are in CN=MicrosoftDNS,DC=DomainDnsZones, # Forest records are in CN=MicrosoftDNS,DC=ForestDnsZones, - domaindn = names.domaindn forestdn = samdb.get_root_basedn().get_linearized() @@ -907,68 +986,33 @@ def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_back hostname = names.netbiosname.lower() + dnsadmins_sid = get_dnsadmins_sid(samdb, domaindn) domainguid = get_domainguid(samdb, domaindn) ntdsguid = get_ntdsguid(samdb, domaindn) - # Add dns accounts (DnsAdmins, DnsUpdateProxy) in domain - logger.info("Adding DNS accounts") - add_dns_accounts(samdb, domaindn) - dnsadmins_sid = get_dnsadmins_sid(samdb, domaindn) - - logger.info("Populating CN=MicrosoftDNS,CN=System,%s" % forestdn) - - # Set up MicrosoftDNS container - add_dns_container(samdb, forestdn, "CN=System", domainsid, dnsadmins_sid) - - # Add root servers - add_rootservers(samdb, forestdn, "CN=System") + # Create CN=System + logger.info("Creating CN=MicrosoftDNS,CN=System,%s" % forestdn) + create_dns_legacy(samdb, domainsid, forestdn, dnsadmins_sid) if os_level == DS_DOMAIN_FUNCTION_2000: - - # Add domain record - add_domain_record(samdb, forestdn, "CN=System", dnsdomain, domainsid, dnsadmins_sid) - - # Add DNS records for a DC in domain - add_dc_domain_records(samdb, forestdn, "CN=System", site, dnsdomain, - hostname, hostip, hostip6) + # Populating legacy dns + logger.info("Populating CN=MicrosoftDNS,CN=System,%s" % forestdn) + fill_dns_data_legacy(samdb, domainsid, forestdn, dnsdoman, site, + hostame, hostip, hostip6) elif dns_backend in ("SAMBA_INTERNAL", "BIND9_DLZ") and \ os_level >= DS_DOMAIN_FUNCTION_2003: - # Set up additional partitions (DomainDnsZones, ForstDnsZones) + # Create DNS partitions logger.info("Creating DomainDnsZones and ForestDnsZones partitions") - setup_dns_partitions(samdb, domainsid, domaindn, forestdn, - names.configdn, names.serverdn) - - ##### Set up DC=DomainDnsZones, - logger.info("Populating DomainDnsZones partition") - - # Set up MicrosoftDNS container - add_dns_container(samdb, domaindn, "DC=DomainDnsZones", domainsid, dnsadmins_sid) - - # Add rootserver records - add_rootservers(samdb, domaindn, "DC=DomainDnsZones") - - # Add domain record - add_domain_record(samdb, domaindn, "DC=DomainDnsZones", dnsdomain, domainsid, - dnsadmins_sid) - - # Add DNS records for a DC in domain - add_dc_domain_records(samdb, domaindn, "DC=DomainDnsZones", site, dnsdomain, - hostname, hostip, hostip6) - - ##### Set up DC=ForestDnsZones, - logger.info("Populating ForestDnsZones partition") - - # Set up MicrosoftDNS container - add_dns_container(samdb, forestdn, "DC=ForestDnsZones", domainsid, dnsadmins_sid) - - # Add _msdcs record - add_msdcs_record(samdb, forestdn, "DC=ForestDnsZones", dnsforest) + create_dns_partitions(samdb, domainsid, names, domaindn, forestdn, + dnsadmins_sid) - # Add DNS records for a DC in forest - add_dc_msdcs_records(samdb, forestdn, "DC=ForestDnsZones", site, dnsforest, - hostname, hostip, hostip6, domainguid, ntdsguid) + # Populating dns partitions + logger.info("Populating DomainDnsZones and ForestDnsZones partitions") + fill_dns_data_partitions(samdb, domainsid, site, domaindn, forestdn, + dnsdomain, dnsforest, hostname, hostip, hostip6, + domainguid, ntdsguid, dnsadmins_sid) if dns_backend.startswith("BIND9_"): secretsdb_setup_dns(secretsdb, names, @@ -978,8 +1022,6 @@ def setup_ad_dns(samdb, secretsdb, domainsid, names, paths, lp, logger, dns_back create_dns_dir(logger, paths) - # Only make a zone file on the first DC, it should be - # replicated with DNS replication if dns_backend == "BIND9_FLATFILE": create_zone_file(lp, logger, paths, targetdir, site=site, dnsdomain=names.dnsdomain, hostip=hostip, hostip6=hostip6, -- cgit