From 838840b229a38f55338358c174c35b3cd8c9ce41 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Mon, 25 Aug 2008 01:27:07 -0400 Subject: [PATCH] * Search for longest-matching domain name instead of first-matching. * ns1.prod.xvm.mit.edu (0.0.0.0) is the primary nameserver for the prod zone. svn path=/trunk/packages/sipb-xen-dns/; revision=922 --- code/dnsserver.py | 44 +++++++++++++++++++++++++++++++------------- debian/changelog | 14 ++++++++++++++ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/code/dnsserver.py b/code/dnsserver.py index ee18cca..3036092 100755 --- a/code/dnsserver.py +++ b/code/dnsserver.py @@ -56,23 +56,41 @@ class DatabaseAuthority(common.ResolverBase): ttl = 900 name = name.lower() + + # XXX hack for the transition to two separate dev/prod clusters + if 'dev.xvm.mit.edu' in self.domains and name.endswith('prod.xvm.mit.edu'): + # import time, sys + # print time.localtime(), 'handling prod request', name + # sys.stdout.flush() + + # Point the client in the right direction for prod requests. + authority = dns.RRHeader('prod.xvm.mit.edu', dns.NS, dns.IN, 3600, + dns.Record_NS(name='ns1.prod.xvm.mit.edu', ttl=3600), auth=True) + additional = dns.RRHeader('ns1.prod.xvm.mit.edu', dns.A, dns.IN, 3600, + dns.Record_A(address='0.0.0.0', ttl=3600), auth=True) + return defer.succeed(([], [authority], [additional])) + if name in self.domains: domain = name else: - # This works because domain will remain bound after breaking out of the loop + # Look for the longest-matching domain. (This works because domain + # will remain bound after breaking out of the loop.) + best_domain = '' for domain in self.domains: - if name.endswith('.'+domain): - break - else: #Not us + if name.endswith('.'+domain) and len(domain) > len(best_domain): + best_domain = domain + if best_domain == '': return defer.fail(failure.Failure(dns.DomainError(name))) + domain = best_domain results = [] authority = [] additional = [self.ns1] authority.append(dns.RRHeader(domain, dns.NS, dns.IN, 3600, self.ns, auth=True)) + if cls == dns.IN: host = name[:-len(domain)-1] - if not host: + if not host: # Request for the domain itself. 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, @@ -84,20 +102,20 @@ class DatabaseAuthority(common.ResolverBase): elif type == dns.SOA: results.append(dns.RRHeader(domain, dns.SOA, dns.IN, ttl, self.soa, auth=True)) - else: + else: # Request for a subdomain. if 'passup' in dir(config.dns) and host in config.dns.passup: record = dns.Record_CNAME('%s.%s' % (host, config.dns.parent), ttl) return defer.succeed(( [dns.RRHeader(name, dns.CNAME, dns.IN, ttl, record, auth=True)], [], [])) - if host: - value = invirt.database.Machine.get_by(name=host) - if value is None or not value.nics: - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) - ip = value.nics[0].ip - if ip is None: #Deactivated? - return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + value = invirt.database.Machine.get_by(name=host) + if value is None or not value.nics: + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + ip = value.nics[0].ip + if ip is None: #Deactivated? + 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, diff --git a/debian/changelog b/debian/changelog index 4fbaf62..7580116 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,17 @@ +sipb-xen-dns (1.04) unstable; urgency=low + + * Search for longest-matching domain name instead of first-matching. + * ns1.prod.xvm.mit.edu (0.0.0.0) is the primary nameserver for the prod + zone. + + -- Yang Zhang Mon, 25 Aug 2008 01:01:17 -0400 + +sipb-xen-dns (1.03) unstable; urgency=low + + * debian/ + + -- Yang Zhang Sun, 24 Aug 2008 16:37:16 -0400 + sipb-xen-dns (1.02) unstable; urgency=low * sipb_xen_database -> invirt.database -- 1.7.9.5