author | Tero Marttila <tero.marttila@aalto.fi> |
Fri, 27 Feb 2015 14:06:03 +0200 | |
changeset 639 | cc27c830a911 |
parent 635 | 7bde9e5ce40f |
child 640 | 620d5a3beec4 |
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 |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
9 |
import ipaddr |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
import logging |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
11 |
import math |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
12 |
import os.path |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
13 |
import pvl.dns.labels |
247
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 |
log = logging.getLogger('pvl.dns.zone') |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
class ZoneError (Exception) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
pass |
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 |
class ZoneLineError (ZoneError) : |
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 |
ZoneLine-related error |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
def __init__ (self, line, msg, *args, **kwargs) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
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
|
27 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
28 |
def zone_quote (field): |
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
|
29 |
""" |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
30 |
Quote a value for inclusion into TXT record. |
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
|
31 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
32 |
>>> print zone_quote("foo") |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
33 |
"foo" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
34 |
>>> print zone_quote("foo\\bar") |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
35 |
"foo\\bar" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
36 |
>>> print zone_quote("foo \"bar\" quux") |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
37 |
"foo \"bar\" quux" |
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
|
38 |
""" |
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 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
40 |
return u'"' + field.replace('\\', '\\\\').replace('"', '\\"') + u'"' |
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
|
41 |
|
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 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
class ZoneLine (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
45 |
A line parsed from a zonefile. |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
48 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
49 |
def load (cls, 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
|
50 |
""" |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
51 |
Load (ZoneDirective or ZoneRecord) items from the given zonefile. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
52 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
53 |
Tracks $ORIGIN and $TTL state for ZoneRecords/ZoneDirectives. |
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
|
54 |
""" |
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
|
55 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
56 |
for line in cls.parse(file) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
57 |
if line.parts[0].startswith('$'): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
58 |
# control directive |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
59 |
line_type = ZoneDirective |
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
|
60 |
|
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
|
61 |
else : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
62 |
# normal record |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
63 |
line_type = ZoneRecord |
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
|
64 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
65 |
yield line_type.parse(line.parts, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
66 |
line = line, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
67 |
comment = line.comment, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
68 |
) |
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
|
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 |
@classmethod |
635
7bde9e5ce40f
pvl.dns.zone: remove ZoneLine.timestamp support
Tero Marttila <tero.marttila@aalto.fi>
parents:
456
diff
changeset
|
71 |
def parse (cls, file, filename=None): |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
72 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
73 |
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
|
74 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
75 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
76 |
if not filename : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
77 |
filename = file.name |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
78 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
79 |
multiline_start = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
80 |
multiline_parts = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
81 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
82 |
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
|
83 |
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
|
84 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
85 |
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
|
86 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
87 |
# capture indent from raw line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
88 |
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
|
89 |
line = raw_line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
90 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
91 |
if not line: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
92 |
# empty line |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
93 |
continue |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
94 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
95 |
# parse comment |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
96 |
if ';' in line: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
97 |
line, comment = line.split(';', 1) |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
98 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
99 |
line = line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
100 |
comment = comment.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
101 |
else : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
102 |
comment = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
103 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
104 |
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
|
105 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
106 |
# split (quoted) fields |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
107 |
if indent and not multiline_start: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
108 |
parts = [''] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
109 |
else: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
110 |
parts = [] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
111 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
112 |
if '"' in line : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
113 |
pre, data, post = line.split('"', 2) |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
114 |
parts.extend(pre.split() + [data] + post.split()) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
115 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
116 |
else : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
117 |
parts.extend(line.split()) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
118 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
119 |
# handle multi-line statements... |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
120 |
if '(' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
121 |
assert not multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
122 |
|
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
|
123 |
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
|
124 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
125 |
multiline_start = (lineno, comment) |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
126 |
multiline_line = raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
127 |
multiline_parts = [] |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
128 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
129 |
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
|
130 |
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
|
131 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
132 |
# 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
|
133 |
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
|
134 |
multiline_line += raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
135 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
136 |
if ')' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
137 |
assert multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
138 |
|
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
|
139 |
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
|
140 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
141 |
lineno, comment = multiline_start |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
142 |
raw_line = multiline_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
143 |
parts = multiline_parts |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
144 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
145 |
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
|
146 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
147 |
# parse |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
148 |
if multiline_start: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
149 |
pass |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
150 |
else: |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
151 |
yield ZoneLine(parts, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
152 |
file = filename, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
153 |
lineno = lineno, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
154 |
line = raw_line, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
155 |
comment = comment, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
156 |
) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
157 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
158 |
def __init__ (self, parts, file=None, lineno=None, line=None, comment=None) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
159 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
160 |
parts : [str] - list of parsed (quoted) fields |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
161 |
if the line has a leading indent, the first field should be an empty string |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
162 |
""" |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
163 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
164 |
self.parts = parts |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
165 |
|
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
166 |
# source |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
167 |
self.file = file |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
168 |
self.lineno = lineno |
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
169 |
self.line = line |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
170 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
171 |
# meta |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
172 |
self.comment = comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
173 |
|
316
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
174 |
def __unicode__ (self) : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
175 |
return u"{parts}{comment}".format( |
316
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
176 |
parts = u'\t'.join(self.parts), |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
177 |
comment = u'\t; ' + self.comment if self.comment is not None else '', |
316
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
178 |
) |
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
179 |
|
41bd6688b142
pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
180 |
def __repr__ (self) : |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
181 |
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
|
182 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
183 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
184 |
class ZoneDirective (object) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
185 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
186 |
An $DIRECTIVE in a zonefile. |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
187 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
188 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
189 |
# context |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
190 |
line = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
191 |
origin = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
192 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
193 |
# fields |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
194 |
directive = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
195 |
arguments = None |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
196 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
197 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
198 |
def parse (cls, parts, **opts) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
199 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
200 |
Parse from ZoneLine.parts |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
201 |
""" |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
202 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
203 |
directive = parts[0][1:].upper() |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
204 |
arguments = parts[1:] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
205 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
206 |
return cls(directive, arguments, **opts) |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
207 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
208 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
209 |
def build (cls, directive, *arguments, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
210 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
211 |
Build directive from optional parts |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
212 |
""" |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
213 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
214 |
return cls(directive, arguments, **opts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
215 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
216 |
def __init__ (self, directive, arguments, comment=None, line=None, origin=None): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
217 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
218 |
directive - uppercase directive name, withtout leading $ |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
219 |
arguments [str] - list of directive arguments |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
220 |
comment - optional trailing comment |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
221 |
line - optional associated ZoneLine |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
222 |
origin - context origin |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
223 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
224 |
|
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
225 |
self.directive = directive |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
226 |
self.arguments = arguments |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
227 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
228 |
self.comment = comment |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
229 |
self.line = line |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
230 |
self.origin = origin |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
231 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
232 |
def __unicode__ (self): |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
233 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
234 |
Construct a zonefile-format line... |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
235 |
""" |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
236 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
237 |
if self.comment: |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
238 |
comment = '\t; ' + self.comment |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
239 |
else : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
240 |
comment = '' |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
241 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
242 |
return u"${directive}\t{arguments}{comment}".format( |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
243 |
directive = self.directive, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
244 |
arguments = '\t'.join(self.arguments), |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
245 |
comment = comment, |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
246 |
) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
247 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
248 |
def __repr__ (self) : |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
249 |
return '%s(%s)' % (self.__class__.__name__, ', '.join(repr(arg) for arg in ( |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
250 |
(self.directive, ) + tuple(self.arguments) |
323
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
251 |
))) |
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
252 |
|
9b3cbd8687eb
pvl.dns.zone: add ZoneDirective type
Tero Marttila <terom@paivola.fi>
parents:
316
diff
changeset
|
253 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
254 |
def process_generate (line, range, parts, **opts) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
255 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
256 |
Parse a |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
257 |
$GENERATE <start>-<stop>[/<step>] lhs [ttl] [class] type rhs [comment] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
258 |
directive and yield expanded ZoneRecords. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
259 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
260 |
Raises ZoneLineError |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
261 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
262 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
263 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
264 |
try: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
265 |
range = pvl.dns.generate.parse_generate_range(range) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
266 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
267 |
lhs_func = pvl.dns.generate.parse_generate_field(parts[0], line=line) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
268 |
body = parts[1:-1] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
269 |
rhs_func = pvl.dns.generate.parse_generate_field(parts[-1], line=line) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
270 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
271 |
except ValueError as error: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
272 |
raise ZoneLineError(line, "{error}", error=error) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
273 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
274 |
log.info("%s: generate %s: %s ... %s", line, range, lhs_func, rhs_func) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
275 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
276 |
for i in range : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
277 |
# build |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
278 |
parts = [lhs_func(i)] + body + [rhs_func(i)] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
279 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
280 |
log.debug(" %03d: %r", i, parts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
281 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
282 |
yield ZoneRecord.parse(parts, line=line, **opts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
283 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
284 |
def process_include (line, origin, include_filename, include_origin=None, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
285 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
286 |
Parse a |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
287 |
$INCLUDE filename [ origin ] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
288 |
directive and yield expanded ZoneRecords. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
289 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
290 |
Raises ZoneLineError. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
291 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
292 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
293 |
path = os.path.join(os.path.dirname(file.name), include_include) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
294 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
295 |
if include_origin: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
296 |
origin = pvl.dns.labels.join(include_origin, origin) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
297 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
298 |
for record in ZoneRecord.load(open(path), origin, **opts) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
299 |
yield line, record |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
300 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
301 |
class ZoneRecord (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
302 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
303 |
A record from a zonefile. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
304 |
""" |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
305 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
306 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
307 |
def load (cls, file, origin, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
308 |
ttl=None, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
309 |
): |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
310 |
""" |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
311 |
Yield ZoneRecords from a file. Processes any ZoneDirectives. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
312 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
313 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
314 |
name = None |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
315 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
316 |
for line in ZoneLine.parse(file): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
317 |
if line.parts[0].startswith('$'): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
318 |
directive = ZoneDirective.parse(line.parts, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
319 |
origin = origin, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
320 |
line = line, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
321 |
comment = line.comment, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
322 |
) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
323 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
324 |
log.debug("%s: %s", line, directive) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
325 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
326 |
if directive.directive == 'ORIGIN': |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
327 |
directive_origin, = directive.arguments |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
328 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
329 |
log.info("%s: $ORIGIN %s -> %s", file, origin, directive_origin) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
330 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
331 |
origin = pvl.dns.labels.join(origin, directive_origin) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
332 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
333 |
elif directive.directive == 'TTL' : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
334 |
directive_ttl, = directive.arguments |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
335 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
336 |
log.info("%s: $TTL %d -> %s", file, ttl, directive_ttl) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
337 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
338 |
ttl = int(directive_ttl) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
339 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
340 |
elif directive.directive == 'GENERATE' : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
341 |
for record in process_generate(line, directive.arguments, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
342 |
name = name, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
343 |
ttl = ttl, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
344 |
origin = origin, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
345 |
) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
346 |
yield record |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
347 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
348 |
elif directive.directive == 'INCLUDE' : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
349 |
for record in process_include(line, origin, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
350 |
ttl = ttl, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
351 |
*directive.arguments |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
352 |
): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
353 |
yield record |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
354 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
355 |
else : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
356 |
log.warn("%s: skip unknown control record: %r", line, directive) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
357 |
yield line, None |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
358 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
359 |
else: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
360 |
record = ZoneRecord.parse(line.parts, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
361 |
name = name, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
362 |
ttl = ttl, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
363 |
comment = line.comment, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
364 |
line = line, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
365 |
origin = origin, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
366 |
) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
367 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
368 |
log.debug("%s: %s", line, record) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
369 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
370 |
# keep name across lines |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
371 |
name = record.name |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
372 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
373 |
yield record |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
374 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
375 |
@classmethod |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
376 |
def parse (cls, parts, name=None, ttl=None, line=None, **opts) : |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
377 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
378 |
Build a ZoneRecord from ZoneLine.parts. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
379 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
380 |
name - context for name, if continuing previous line |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
381 |
ttl - context for ttl, if using $TTL |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
382 |
|
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
383 |
Return: (name, ZoneRecord) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
384 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
385 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
386 |
parts = list(parts) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
387 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
388 |
# first field is either name or leading whitespace |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
389 |
leading = parts.pop(0) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
390 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
391 |
if leading: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
392 |
name = leading |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
393 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
394 |
if len(parts) < 2 : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
395 |
raise ZoneLineError(line, "Too few parts to parse: {parts!r}", parts=parts) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
396 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
397 |
# parse ttl/cls/type |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
398 |
_cls = None |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
399 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
400 |
if parts and parts[0][0].isdigit() : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
401 |
ttl = int(parts.pop(0)) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
402 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
403 |
if parts and parts[0].upper() in ('IN', 'CH') : |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
404 |
_cls = parts.pop(0).upper() |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
405 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
406 |
# always have type |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
407 |
type = parts.pop(0).upper() |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
408 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
409 |
# remaining parts are data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
410 |
data = parts |
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 |
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
|
413 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
414 |
return cls(name, ttl, _cls, type, data, line=line, **opts) |
252 | 415 |
|
416 |
@classmethod |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
417 |
def build (_cls, name, type, *data, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
418 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
419 |
Simple interface to build ZoneRecord from required parts. All optional fields must be given as keyword arguments. |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
420 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
421 |
Normalizes all fields to strs. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
422 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
423 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
424 |
# keyword-only arguments |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
425 |
ttl = opts.pop('ttl', None) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
426 |
cls = opts.pop('cls', None) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
300
diff
changeset
|
427 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
428 |
if name: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
429 |
name = str(name) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
430 |
else: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
431 |
name = None |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
432 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
433 |
if ttl or ttl == 0: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
434 |
ttl = int(ttl) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
435 |
else: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
436 |
ttl = None |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
437 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
438 |
if cls: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
439 |
cls = cls.upper() |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
440 |
else: |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
441 |
cls = None |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
442 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
443 |
type = type.upper() |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
444 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
445 |
data = [unicode(item) for item in data] |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
446 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
447 |
return _cls(name, ttl, cls, type, data, **opts) |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
448 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
449 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
450 |
def A (_cls, name, ip4, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
451 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
452 |
Build from ipaddr.IPv4Address. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
453 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
454 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
455 |
return _cls.build(name, 'A', ipaddr.IPv4Address(ip4), **opts) |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
456 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
457 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
458 |
def AAAA (_cls, name, ip6, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
459 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
460 |
Build from ipaddr.IPv6Address. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
461 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
462 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
463 |
return _cls.build(name, 'AAAA', ipaddr.IPv6Address(ip6), **opts) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
464 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
465 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
466 |
def CNAME (_cls, name, alias, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
467 |
return _cls.build(name, 'CNAME', alias, **opts) |
247
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 |
@classmethod |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
470 |
def TXT (_cls, name, text, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
471 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
472 |
Build from quoted (unicode) value. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
473 |
""" |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
474 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
475 |
return _cls.build(name, 'TXT', zone_quote(unicode(text)), **opts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
476 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
477 |
@classmethod |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
478 |
def PTR (_cls, name, ptr, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
479 |
return _cls.build(name, 'PTR', ptr, **opts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
480 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
481 |
@classmethod |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
482 |
def MX (_cls, name, priority, mx, **opts): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
483 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
484 |
priority : int |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
485 |
mx : str - hostname |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
486 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
487 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
488 |
return _cls.build(name, 'MX', int(priority), str(mx), **opts) |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
489 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
490 |
def __init__ (self, name, ttl, cls, type, data, comment=None, origin=None, line=None): |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
491 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
492 |
Using strict field ordering. |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
493 |
|
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
494 |
name - local label with respect to $ORIGIN |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
495 |
may also be @ to refer to $ORIGIN |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
496 |
ttl - int TTL for record, default to implict $TTL |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
497 |
cls - uppercase class for record, default to IN |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
498 |
type - uppercase type for record, required |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
499 |
data [...] - list of data fields, interpretation varies by type |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
500 |
comment - optional comment to include in zone |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
501 |
origin - track implicit $ORIGIN or XXX: previous record state |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
502 |
line - associated ZoneLine |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
503 |
""" |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
504 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
505 |
self.name = name |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
506 |
self.ttl = ttl |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
507 |
self.cls = cls |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
508 |
self.type = type |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
509 |
self.data = data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
510 |
|
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
511 |
self.comment = comment |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
512 |
self.origin = origin |
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
|
513 |
self.line = line |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
514 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
515 |
def __unicode__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
516 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
517 |
Construct a zonefile-format line..." |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
518 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
519 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
520 |
if self.comment : |
378
3fed153a1fe6
pvl.dns.zone: typofix self.comment
Tero Marttila <terom@fixme.fi>
parents:
323
diff
changeset
|
521 |
comment = '\t; ' + self.comment |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
522 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
523 |
comment = '' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
524 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
525 |
return u"{name:25} {ttl:4} {cls:2} {type:5} {data}{comment}".format( |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
526 |
name = '' if self.name is None else self.name, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
527 |
ttl = '' if self.ttl is None else self.ttl, |
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
528 |
cls = '' if self.cls is None else self.cls, |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
529 |
type = self.type, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
530 |
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
|
531 |
comment = comment, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
532 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
533 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
534 |
def __repr__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
535 |
return '%s(%s)' % (self.__class__.__name__, ', '.join(repr(arg) for arg in ( |
639
cc27c830a911
pvl.dns.zone: refactor and test; breaking change
Tero Marttila <tero.marttila@aalto.fi>
parents:
635
diff
changeset
|
536 |
self.name, self.ttl, self.cls, self.type, self.data |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
537 |
))) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
538 |
|
252 | 539 |
class SOA (ZoneRecord) : |
540 |
@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
|
541 |
def build (cls, line, name, ttl, _cls, type, data, **opts) : |
252 | 542 |
assert name == '@' |
543 |
||
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
|
544 |
return cls(*data, |
252 | 545 |
ttl = ttl, |
546 |
cls = cls, |
|
547 |
line = line, |
|
548 |
**opts |
|
549 |
) |
|
550 |
||
551 |
def __init__ (self, master, contact, serial, refresh, retry, expire, nxttl, **opts) : |
|
552 |
super(SOA, self).__init__('@', 'SOA', |
|
553 |
[master, contact, serial, refresh, retry, expire, nxttl], |
|
554 |
**opts |
|
555 |
) |
|
556 |
||
557 |
self.master = master |
|
558 |
self.contact = contact |
|
559 |
self.serial = serial |
|
560 |
self.refresh = refresh |
|
561 |
self.retry = retry |
|
562 |
self.expire = expire |
|
563 |
self.nxttl = nxttl |
|
564 |