pvl/dns/zone.py
changeset 254 358b6e91659d
parent 253 8f59ee92583d
child 257 a6964f9bda8b
--- a/pvl/dns/zone.py	Wed Sep 11 14:44:26 2013 +0300
+++ b/pvl/dns/zone.py	Wed Sep 11 14:45:08 2013 +0300
@@ -7,6 +7,7 @@
 import codecs
 import datetime
 import logging
+import os.path
 
 log = logging.getLogger('pvl.dns.zone')
 
@@ -160,30 +161,47 @@
     data = None # list of data fields
     
     @classmethod
-    def load (cls, file, origin=None, **opts) :
+    def load (cls, file, ttl=None, origin=None, **opts) :
         """
             Parse ZoneRecord items from the given zonefile, ignoring non-record lines.
         """
 
-        for line in ZoneLine.load(file, **opts):
+        for line in ZoneLine.load(file, **opts) :
             if not line.parts :
                 log.debug("%s: skip empty line", line)
 
             elif line.line.startswith('$') :
                 # control record
-                type = line.parts[0]
+                args = list(line.parts)
+                directive = args.pop(0)[1:]
 
-                if type == '$ORIGIN':
+                if directive == 'ORIGIN' :
                     # update
-                    origin = line.parts[1]
+                    origin, = args
                     
                     log.info("%s: origin: %s", line, origin)
+
+                if directive == 'TTL' :
+                    ttl, = args
+                    
+                    log.info("%s: ttl: %s", line, ttl)
                 
-                elif type == '$GENERATE':
+                elif directive == 'GENERATE' :
                     # process...
-                    log.info("%s: generate: %s", line, line.parts)
+                    log.info("%s: generate: %s", line, args)
 
-                    for record in process_generate(line, origin, line.parts[1:]) :
+                    for record in process_generate(line, origin, args) :
+                        yield record
+
+                elif directive == 'INCLUDE' :
+                    include, = args
+
+                    # XXX: this is probably not what we want...
+                    path = os.path.join(os.path.dirname(file.name), include)
+                    
+                    log.info("%s: include: %s: %s", line, include, path)
+
+                    for record in cls.load(open(path)) :
                         yield record
 
                 else :
@@ -191,7 +209,7 @@
                 
             else :
                 # normal record?
-                record = ZoneRecord.parse(line, origin=origin)
+                record = ZoneRecord.parse(line, origin=origin, ttl=ttl)
 
                 if record :
                     yield record
@@ -201,7 +219,7 @@
                     log.warning("%s: skip unknown line: %s", line, line.line)
      
     @classmethod
-    def parse (cls, line, parts=None, **opts) :
+    def parse (cls, line, parts=None, ttl=None, **opts) :
         """
             Build a ZoneRecord from a ZoneLine.
         """
@@ -224,7 +242,7 @@
             raise ZoneLineError(line, "Too few parts to parse: {0!r}", line.data)
 
         # parse ttl/cls/type
-        ttl = _cls = None
+        _cls = None
 
         if parts and parts[0][0].isdigit() :
             ttl = parts.pop(0)