From 56cffcd902204e35cc28915efb27eea559a6618d Mon Sep 17 00:00:00 2001 From: Greg Price Date: Fri, 27 Feb 2009 04:38:33 -0500 Subject: [PATCH] pull out dns.IN, comment the structure of the DNS logic svn path=/trunk/packages/invirt-dns/; revision=2209 --- invirt-dns | 114 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 54 deletions(-) diff --git a/invirt-dns b/invirt-dns index 1744ac8..d5fa021 100755 --- a/invirt-dns +++ b/invirt-dns @@ -81,65 +81,71 @@ class DatabaseAuthority(common.ResolverBase): authority.append(dns.RRHeader(domain, dns.NS, dns.IN, 3600, self.ns, auth=True)) - if cls == dns.IN: - if name.endswith(".in-addr.arpa"): - if type in (dns.PTR, dns.ALL_RECORDS): - ip = '.'.join(reversed(name.split('.')[:-2])) - value = invirt.database.NIC.query.filter_by(ip=ip).first() - if value and value.hostname: - hostname = value.hostname - if '.' not in hostname: - hostname = hostname + "." + config.dns.domains[0] - record = dns.Record_PTR(hostname, ttl) - results.append(dns.RRHeader(name, dns.PTR, dns.IN, - ttl, record, auth=True)) - else: # IP address doesn't point to an active host - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) - elif type == dns.SOA: - results.append(dns.RRHeader(domain, dns.SOA, dns.IN, - ttl, self.soa, auth=True)) - # FIXME: Should only return success with no records if the name actually exists - elif name == domain or name == '.'+domain: - if type in (dns.A, dns.ALL_RECORDS): - record = dns.Record_A(config.dns.nameservers[0].ip, ttl) - results.append(dns.RRHeader(name, dns.A, dns.IN, - ttl, record, auth=True)) - elif type == dns.NS: - results.append(dns.RRHeader(domain, dns.NS, dns.IN, - ttl, self.ns, auth=True)) - authority = [] - elif type == dns.SOA: - results.append(dns.RRHeader(domain, dns.SOA, dns.IN, - ttl, self.soa, auth=True)) - else: - host = name[:-len(domain)-1] - value = invirt.database.NIC.query.filter_by(hostname=host).first() - if value: - ip = value.ip - else: - value = invirt.database.Machine.query().filter_by(name=host).first() - if value: - ip = value.nics[0].ip - else: - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + # The order of logic: + # - What class? + # - What domain: in-addr.arpa, domain root, or subdomain? + # - What query type: A, PTR, NS, ...? - if ip is None: - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + if cls != dns.IN: + # Hahaha. No. + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) - if type in (dns.A, dns.ALL_RECORDS): - record = dns.Record_A(ip, ttl) - results.append(dns.RRHeader(name, dns.A, dns.IN, + if name.endswith(".in-addr.arpa"): + if type in (dns.PTR, dns.ALL_RECORDS): + ip = '.'.join(reversed(name.split('.')[:-2])) + value = invirt.database.NIC.query.filter_by(ip=ip).first() + if value and value.hostname: + hostname = value.hostname + if '.' not in hostname: + hostname = hostname + "." + config.dns.domains[0] + record = dns.Record_PTR(hostname, ttl) + results.append(dns.RRHeader(name, dns.PTR, dns.IN, ttl, record, auth=True)) - elif type == dns.SOA: - results.append(dns.RRHeader(domain, dns.SOA, dns.IN, - ttl, self.soa, auth=True)) - if len(results) == 0: + else: # IP address doesn't point to an active host + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + elif type == dns.SOA: + results.append(dns.RRHeader(domain, dns.SOA, dns.IN, + ttl, self.soa, auth=True)) + # FIXME: Should only return success with no records if the name actually exists + + elif name == domain or name == '.'+domain: + if type in (dns.A, dns.ALL_RECORDS): + record = dns.Record_A(config.dns.nameservers[0].ip, ttl) + results.append(dns.RRHeader(name, dns.A, dns.IN, + ttl, record, auth=True)) + elif type == dns.NS: + results.append(dns.RRHeader(domain, dns.NS, dns.IN, + ttl, self.ns, auth=True)) authority = [] - additional = [] - return defer.succeed((results, authority, additional)) + elif type == dns.SOA: + results.append(dns.RRHeader(domain, dns.SOA, dns.IN, + ttl, self.soa, auth=True)) + else: - #Doesn't exist - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + host = name[:-len(domain)-1] + value = invirt.database.NIC.query.filter_by(hostname=host).first() + if value: + ip = value.ip + else: + value = invirt.database.Machine.query().filter_by(name=host).first() + if value: + ip = value.nics[0].ip + else: + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + if ip is None: + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + if type in (dns.A, dns.ALL_RECORDS): + record = dns.Record_A(ip, ttl) + results.append(dns.RRHeader(name, dns.A, dns.IN, + ttl, record, auth=True)) + elif type == dns.SOA: + results.append(dns.RRHeader(domain, dns.SOA, dns.IN, + ttl, self.soa, auth=True)) + + if len(results) == 0: + authority = [] + additional = [] + return defer.succeed((results, authority, additional)) class QuotingBindAuthority(authority.BindAuthority): """ -- 1.7.9.5