author | Tero Marttila <tero.marttila@aalto.fi> |
Thu, 26 Feb 2015 18:54:15 +0200 | |
changeset 515 | 996ccf5356b8 |
parent 456 | 602838dfb6e7 |
child 635 | 7bde9e5ce40f |
permissions | -rw-r--r-- |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
Process zonefiles. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
import codecs |
253
8f59ee92583d
pvl.dns.zone: tweak datetime import
Tero Marttila <terom@paivola.fi>
parents:
252
diff
changeset
|
8 |
import datetime |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
import logging |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
10 |
import math |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
11 |
import os.path |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
log = logging.getLogger('pvl.dns.zone') |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
class ZoneError (Exception) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
pass |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
class ZoneLineError (ZoneError) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
ZoneLine-related error |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
def __init__ (self, line, msg, *args, **kwargs) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
super(ZoneLineError, self).__init__("%s: %s" % (line, msg.format(*args, **kwargs))) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
|
456
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
26 |
def process_generate (line, origin, parts) : |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
27 |
""" |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
28 |
Process a |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
29 |
$GENERATE <start>-<stop>[/<step>] lhs [ttl] [class] type rhs [comment] |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
30 |
directive into a series of ZoneResource's. |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
31 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
32 |
Raises ZoneLineError |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
33 |
""" |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
34 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
35 |
parts = list(parts) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
36 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
37 |
try: |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
38 |
range = parse_generate_range(parts.pop(0)) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
39 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
40 |
lhs_func = parse_generate_field(parts.pop(0), line=line) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
41 |
rhs_func = parse_generate_field(parts.pop(-1), line=line) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
42 |
except ValueError as error: |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
43 |
raise ZoneLineError(line, "{error}", error=error) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
44 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
45 |
body = parts |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
46 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
47 |
for i in range : |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
48 |
# build |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
49 |
parts = [lhs_func(i)] + body + [rhs_func(i)] |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
50 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
51 |
log.debug(" %03d: %r", i, parts) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
52 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
53 |
# parse |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
54 |
yield ZoneRecord.parse(line, parts=parts, origin=origin) |
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
55 |
|
602838dfb6e7
pvl.dns: split up modules and import partial-prefix parsing from pvl.hosts-dns
Tero Marttila <tero.marttila@aalto.fi>
parents:
378
diff
changeset
|
56 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
class ZoneLine (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
59 |
A line parsed from a zonefile. |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
62 |
@classmethod |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
63 |
def load (cls, file, ttl=None, origin=None, expand_generate=False, expand_include=False, **opts) : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
64 |
""" |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
65 |
Parse ZoneLine, ZoneRecord items from the given zonefile. |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
66 |
""" |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
67 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
68 |
name = None |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
69 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
70 |
for line in cls.parse(file, **opts) : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
71 |
if not line.parts : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
72 |
log.debug("%s: skip empty line", line) |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
73 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
74 |
elif line.line.startswith('$') : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
75 |
# control record |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
76 |
directive = ZoneDirective.parse(line, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
77 |
origin = origin, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
78 |
comment = line.comment, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
79 |
) |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
80 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
81 |
if directive.directive == 'ORIGIN' : |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
82 |
# update |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
83 |
origin, = directive.arguments |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
84 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
85 |
log.info("%s: origin: %s", line, origin) |
300
a720bcf96007
pvl.dns.zone: passthrough ORIGIN/TTL lines, better warn on unparsed lines
Tero Marttila <terom@paivola.fi>
parents:
298
diff
changeset
|
86 |
|
a720bcf96007
pvl.dns.zone: passthrough ORIGIN/TTL lines, better warn on unparsed lines
Tero Marttila <terom@paivola.fi>
parents:
298
diff
changeset
|
87 |
yield line, None |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
88 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
89 |
elif directive.directive == 'TTL' : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
90 |
ttl, = directive.arguments |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
91 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
92 |
log.info("%s: ttl: %s", line, ttl) |
300
a720bcf96007
pvl.dns.zone: passthrough ORIGIN/TTL lines, better warn on unparsed lines
Tero Marttila <terom@paivola.fi>
parents:
298
diff
changeset
|
93 |
|
a720bcf96007
pvl.dns.zone: passthrough ORIGIN/TTL lines, better warn on unparsed lines
Tero Marttila <terom@paivola.fi>
parents:
298
diff
changeset
|
94 |
yield line, None |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
95 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
96 |
elif directive.directive == 'GENERATE' : |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
97 |
if expand_generate : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
98 |
# process... |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
99 |
log.info("%s: generate: %s", line, directive.arguments) |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
100 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
101 |
for record in process_generate(line, origin, directive.arguments) : |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
102 |
yield line, record |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
103 |
else : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
104 |
yield line, None |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
105 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
106 |
elif directive.directive == 'INCLUDE' : |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
107 |
if expand_include : |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
108 |
include, = directive.arguments |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
109 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
110 |
path = os.path.join(os.path.dirname(file.name), include) |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
111 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
112 |
log.info("%s: include: %s: %s", line, include, path) |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
113 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
114 |
for record in cls.load(open(path)) : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
115 |
yield line, record |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
116 |
else : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
117 |
yield line, None |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
118 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
119 |
else : |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
120 |
log.warn("%s: skip unknown control record: %r", line, directive) |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
121 |
yield line, None |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
122 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
123 |
else : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
124 |
# normal record? |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
125 |
record = ZoneRecord.parse(line, |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
126 |
name = name, |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
127 |
origin = origin, |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
128 |
ttl = ttl, |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
129 |
comment = line.comment, |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
130 |
) |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
131 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
132 |
if record : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
133 |
yield line, record |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
134 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
135 |
# keep name across lines |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
136 |
name = record.name |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
137 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
138 |
else : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
139 |
# unknown |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
140 |
log.warning("%s: skip unknown line: %s", line, line.line) |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
141 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
142 |
yield line, None |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
143 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
144 |
|
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
145 |
@classmethod |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
146 |
def parse (cls, file, filename=None, line_timestamp_prefix=None) : |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
147 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
148 |
Yield ZoneLines lexed from a file. |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
149 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
150 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
151 |
if not filename : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
152 |
filename = file.name |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
153 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
154 |
multiline_start = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
155 |
multiline_parts = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
156 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
157 |
for lineno, raw_line in enumerate(file) : |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
158 |
raw_line = raw_line.rstrip('\n') |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
159 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
160 |
# possible mtime prefix for line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
161 |
timestamp = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
162 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
163 |
if line_timestamp_prefix : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
164 |
if ': ' not in raw_line : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
165 |
raise ZoneError("%s:%d: Missing timestamp prefix: %s" % (filename, lineno, raw_line)) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
166 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
167 |
# split prefix |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
168 |
prefix, raw_line = raw_line.split(': ', 1) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
169 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
170 |
# parse it out |
253
8f59ee92583d
pvl.dns.zone: tweak datetime import
Tero Marttila <terom@paivola.fi>
parents:
252
diff
changeset
|
171 |
timestamp = datetime.datetime.strptime(prefix, cls.PARSE_DATETIME_FORMAT) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
172 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
173 |
log.debug("%s:%d: ts=%r", filename, lineno, ts) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
174 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
175 |
log.debug("%s:%d: %s", filename, lineno, raw_line) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
176 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
177 |
# capture indent from raw line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
178 |
indent = raw_line.startswith(' ') or raw_line.startswith('\t') |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
179 |
line = raw_line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
180 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
181 |
# parse comment |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
182 |
if ';' in line: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
183 |
line, comment = line.split(';', 1) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
184 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
185 |
line = line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
186 |
comment = comment.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
187 |
else : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
188 |
comment = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
189 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
190 |
log.debug("%s:%d: indent=%r, line=%r, comment=%r", filename, lineno, indent, line, comment) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
191 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
192 |
# split (quoted) fields |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
193 |
if '"' in line : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
194 |
pre, data, post = line.split('"', 2) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
195 |
parts = pre.split() + [data] + post.split() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
196 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
197 |
else : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
198 |
parts = line.split() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
199 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
200 |
# handle multi-line statements... |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
201 |
if '(' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
202 |
assert not multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
203 |
|
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
204 |
log.debug("%s:%d: Start of multi-line statement: %s", filename, lineno, line) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
205 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
206 |
multiline_start = (lineno, timestamp, indent, comment) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
207 |
multiline_line = raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
208 |
multiline_parts = [] |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
209 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
210 |
if multiline_start: |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
211 |
log.debug("%s:%d: Multi-line statement: %s", filename, lineno, line) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
212 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
213 |
# XXX: some better way to do this |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
214 |
multiline_parts.extend([part for part in parts if part not in set('()')]) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
215 |
multiline_line += raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
216 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
217 |
if ')' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
218 |
assert multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
219 |
|
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
220 |
log.debug("%s:%d: End of multi-line statement: %s", filename, lineno, line) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
221 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
222 |
lineno, timestamp, indent, comment = multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
223 |
raw_line = multiline_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
224 |
parts = multiline_parts |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
225 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
226 |
multiline_start = multiline_line = multiline_parts = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
227 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
228 |
# parse |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
229 |
if multiline_start: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
230 |
pass |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
231 |
else: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
232 |
yield ZoneLine(filename, lineno, raw_line, indent, parts, comment, timestamp=timestamp) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
233 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
234 |
file = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
235 |
lineno = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
236 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
237 |
# data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
238 |
indent = None # was the line indented? |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
239 |
parts = None # split line fields |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
240 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
241 |
# optional |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
242 |
timestamp = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
243 |
comment = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
244 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
245 |
PARSE_DATETIME_FORMAT = '%Y-%m-%d' |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
246 |
|
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
247 |
def __init__ (self, file, lineno, line, indent, parts, comment=None, timestamp=None) : |
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
248 |
# source |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
249 |
self.file = file |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
250 |
self.lineno = lineno |
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
251 |
self.line = line |
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
252 |
|
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
253 |
# parse data |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
254 |
self.indent = indent |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
255 |
self.parts = parts |
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
256 |
|
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
257 |
# metadata |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
258 |
self.timestamp = timestamp |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
259 |
self.comment = comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
260 |
|
316
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
261 |
def __unicode__ (self) : |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
262 |
return u"{indent}{parts}".format( |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
263 |
indent = u"\t" if self.indent else '', |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
264 |
parts = u'\t'.join(self.parts), |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
265 |
) |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
266 |
|
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
267 |
def __repr__ (self) : |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
268 |
return "{file}:{lineno}".format(file=self.file, lineno=self.lineno) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
269 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
270 |
class ZoneDirective (object) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
271 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
272 |
An $DIRECTIVE in a zonefile. |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
273 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
274 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
275 |
# context |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
276 |
line = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
277 |
origin = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
278 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
279 |
# fields |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
280 |
directive = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
281 |
arguments = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
282 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
283 |
@classmethod |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
284 |
def parse (cls, line, **opts) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
285 |
# control record |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
286 |
args = list(line.parts) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
287 |
directive = args[0][1:] |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
288 |
arguments = args[1:] |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
289 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
290 |
return cls.build(line, directive, *arguments, **opts) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
291 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
292 |
@classmethod |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
293 |
def build (cls, line, directive, *arguments, **opts) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
294 |
return cls(directive, arguments, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
295 |
line = line, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
296 |
**opts |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
297 |
) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
298 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
299 |
def __init__ (self, directive, arguments, line=None, origin=None, comment=None) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
300 |
self.directive = directive |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
301 |
self.arguments = arguments |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
302 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
303 |
self.line = line |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
304 |
self.origin = origin |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
305 |
self.comment = comment |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
306 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
307 |
def __unicode__ (self) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
308 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
309 |
Construct a zonefile-format line... |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
310 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
311 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
312 |
if self.comment : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
313 |
comment = '\t; ' + self.comment |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
314 |
else : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
315 |
comment = '' |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
316 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
317 |
return u"${directive}\t{arguments}{comment}".format( |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
318 |
directive = self.directive, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
319 |
arguments = '\t'.join(self.arguments), |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
320 |
comment = comment, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
321 |
) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
322 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
323 |
def __repr__ (self) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
324 |
return '%s(%s)' % (self.__class__.__name__, ', '.join(repr(arg) for arg in ( |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
325 |
(self.directive) + tuple(self.arguments) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
326 |
))) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
327 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
328 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
329 |
class ZoneRecord (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
330 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
331 |
A record from a zonefile. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
332 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
333 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
334 |
# context |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
335 |
line = None # the underlying line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
336 |
origin = None # possible $ORIGIN context |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
337 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
338 |
# record fields |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
339 |
name = None |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
340 |
ttl = None # optional |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
341 |
cls = None # optional |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
342 |
type = None |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
343 |
data = None # list of data fields |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
344 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
345 |
@classmethod |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
346 |
def load (cls, file, **opts) : |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
347 |
""" |
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
348 |
Yield ZoneRecords from a file. |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
349 |
""" |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
350 |
|
292
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
351 |
for line, record in ZoneLine.load(file, **opts) : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
352 |
if record : |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
353 |
yield record |
cc4a4a2f2b76
pvl.dns.zone: implement ZoneLines.load to yield ZoneLine, ZoneRecord pairs for zone passthrough; change default to not evaluate INCLUDE/GENERATE
Tero Marttila <terom@paivola.fi>
parents:
286
diff
changeset
|
354 |
else : |
300
a720bcf96007
pvl.dns.zone: passthrough ORIGIN/TTL lines, better warn on unparsed lines
Tero Marttila <terom@paivola.fi>
parents:
298
diff
changeset
|
355 |
log.warn("%s: unparsed line: %s", file.name, line) |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
356 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
357 |
@classmethod |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
358 |
def parse (cls, line, name=None, parts=None, ttl=None, **opts) : |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
359 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
360 |
Build a ZoneRecord from a ZoneLine. |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
361 |
|
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
362 |
name - default for name, if continuing previous line |
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
363 |
|
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
364 |
Return: (name, ZoneRecord) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
365 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
366 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
367 |
if parts is None : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
368 |
parts = list(line.parts) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
369 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
370 |
if not parts : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
371 |
# skip |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
372 |
return |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
373 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
374 |
if line.indent : |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
375 |
# indented lines keep name from previous record |
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
376 |
pass |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
377 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
378 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
379 |
name = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
380 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
381 |
if len(parts) < 2 : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
382 |
raise ZoneLineError(line, "Too few parts to parse: {0!r}", line.data) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
383 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
384 |
# parse ttl/cls/type |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
385 |
_cls = None |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
386 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
387 |
if parts and parts[0][0].isdigit() : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
388 |
ttl = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
389 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
390 |
if parts and parts[0].upper() in ('IN', 'CH') : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
391 |
_cls = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
392 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
393 |
# always have type |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
394 |
type = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
395 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
396 |
# remaining parts are data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
397 |
data = parts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
398 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
399 |
log.debug(" ttl=%r, cls=%r, type=%r, data=%r", ttl, _cls, type, data) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
400 |
|
252 | 401 |
return cls.build(line, name, ttl, _cls, type, data, **opts) |
402 |
||
403 |
@classmethod |
|
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
404 |
def build (cls, line, name, ttl, _cls, type, data, **opts) : |
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
405 |
return cls(name, type, data, |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
406 |
ttl = ttl, |
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
407 |
cls = _cls, |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
408 |
line = line, |
252 | 409 |
**opts |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
410 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
411 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
412 |
@classmethod |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
413 |
def A (cls, name, ip4, **opts) : |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
414 |
return cls(str(name), 'A', [str(ip4)], **opts) |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
415 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
416 |
@classmethod |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
417 |
def AAAA (cls, name, ip6, **opts) : |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
418 |
return cls(str(name), 'AAAA', [str(ip6)], **opts) |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
419 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
420 |
@classmethod |
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
421 |
def CNAME (cls, name, host, **opts) : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
422 |
return cls(str(name), 'CNAME', [str(host)], **opts) |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
423 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
424 |
@classmethod |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
425 |
def TXT (cls, name, text, **opts) : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
426 |
return cls(str(name), 'TXT', |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
427 |
[u'"{0}"'.format(text.replace('"', '\\"'))], |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
428 |
**opts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
429 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
430 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
431 |
@classmethod |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
432 |
def PTR (cls, name, ptr, **opts) : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
433 |
return cls(str(name), 'PTR', [str(ptr)], **opts) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
434 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
435 |
@classmethod |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
436 |
def MX (cls, name, priority, mx, **opts) : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
437 |
return cls(str(name), 'MX', [int(priority), str(mx)], **opts) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
438 |
|
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
439 |
def __init__ (self, name, type, data, ttl=None, cls=None, line=None, origin=None, comment=None) : |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
440 |
self.name = name |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
441 |
self.type = type |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
442 |
self.data = data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
443 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
444 |
self.ttl = ttl |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
445 |
self.cls = cls |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
446 |
|
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
447 |
self.line = line |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
448 |
self.origin = origin |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
449 |
self.comment = comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
450 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
451 |
def __unicode__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
452 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
453 |
Construct a zonefile-format line..." |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
454 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
455 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
456 |
if self.comment : |
378
3fed153a1fe6
pvl.dns.zone: typofix self.comment
Tero Marttila <terom@fixme.fi>
parents:
323
diff
changeset
|
457 |
comment = '\t; ' + self.comment |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
458 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
459 |
comment = '' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
460 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
461 |
return u"{name:25} {ttl:4} {cls:2} {type:5} {data}{comment}".format( |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
462 |
name = self.name or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
463 |
ttl = self.ttl or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
464 |
cls = self.cls or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
465 |
type = self.type, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
466 |
data = ' '.join(unicode(data) for data in self.data), |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
467 |
comment = comment, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
468 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
469 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
470 |
def __repr__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
471 |
return '%s(%s)' % (self.__class__.__name__, ', '.join(repr(arg) for arg in ( |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
472 |
self.name, self.type, self.data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
473 |
))) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
474 |
|
252 | 475 |
class SOA (ZoneRecord) : |
476 |
@classmethod |
|
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
477 |
def build (cls, line, name, ttl, _cls, type, data, **opts) : |
252 | 478 |
assert name == '@' |
479 |
||
294
29720bbc5379
pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents:
292
diff
changeset
|
480 |
return cls(*data, |
252 | 481 |
ttl = ttl, |
482 |
cls = cls, |
|
483 |
line = line, |
|
484 |
**opts |
|
485 |
) |
|
486 |
||
487 |
def __init__ (self, master, contact, serial, refresh, retry, expire, nxttl, **opts) : |
|
488 |
super(SOA, self).__init__('@', 'SOA', |
|
489 |
[master, contact, serial, refresh, retry, expire, nxttl], |
|
490 |
**opts |
|
491 |
) |
|
492 |
||
493 |
self.master = master |
|
494 |
self.contact = contact |
|
495 |
self.serial = serial |
|
496 |
self.refresh = refresh |
|
497 |
self.retry = retry |
|
498 |
self.expire = expire |
|
499 |
self.nxttl = nxttl |
|
500 |