--- 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)