Add support for DNS zone files that take precedence over the database
[invirt/packages/invirt-dns.git] / invirt-dns
index 3d95965..13e00d4 100755 (executable)
@@ -3,6 +3,7 @@ from twisted.internet import reactor
 from twisted.names import server
 from twisted.names import dns
 from twisted.names import common
+from twisted.names import authority
 from twisted.internet import defer
 from twisted.python import failure
 
@@ -57,19 +58,6 @@ 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='18.181.0.221', ttl=3600), auth=True)
-            return defer.succeed(([], [authority], [additional]))
-
         if name in self.domains:
             domain = name
         else:
@@ -132,10 +120,22 @@ class DatabaseAuthority(common.ResolverBase):
             return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name)))
 
 if '__main__' == __name__:
-    resolver = DatabaseAuthority()
+    resolvers = []
+    for zone in config.dns.zone_files:
+        for origin in config.dns.domains:
+            r = authority.BindAuthority(zone)
+            # This sucks, but if I want a generic zone file, I have to
+            # reload the information by hand
+            r.origin = origin
+            lines = open(zone).readlines()
+            lines = r.collapseContinuations(r.stripComments(lines))
+            r.parseLines(lines)
+            
+            resolvers.append(r)
+    resolvers.append(DatabaseAuthority())
 
     verbosity = 0
-    f = server.DNSServerFactory(authorities=[resolver], verbose=verbosity)
+    f = server.DNSServerFactory(authorities=resolvers, verbose=verbosity)
     p = dns.DNSDatagramProtocol(f)
     f.noisy = p.noisy = verbosity