author | Tero Marttila <terom@paivola.fi> |
Tue, 17 Dec 2013 01:01:10 +0200 | |
changeset 297 | 63bce6f67916 |
parent 295 | 8c6d4565576f |
child 298 | fa1ab8cda47e |
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 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
class ZoneLine (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
28 |
A line parsed from a zonefile. |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
31 |
@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
|
32 |
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
|
33 |
""" |
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
|
34 |
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
|
35 |
""" |
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
|
36 |
|
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
|
37 |
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
|
38 |
|
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
|
39 |
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
|
40 |
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
|
41 |
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
|
42 |
|
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
|
43 |
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
|
44 |
# control 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
|
45 |
args = list(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
|
46 |
directive = args.pop(0)[1:] |
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
|
47 |
|
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
|
48 |
if directive == '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
|
49 |
# update |
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 |
origin, = args |
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
|
51 |
|
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
|
52 |
log.info("%s: origin: %s", line, 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
|
53 |
|
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 |
elif directive == '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
|
55 |
ttl, = args |
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
|
56 |
|
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
|
57 |
log.info("%s: ttl: %s", line, 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
|
58 |
|
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
|
59 |
elif directive == '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
|
60 |
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
|
61 |
# process... |
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
|
62 |
log.info("%s: generate: %s", line, args) |
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 |
|
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 |
for record in process_generate(line, origin, args) : |
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 |
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
|
66 |
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
|
67 |
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
|
68 |
|
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 |
elif directive == '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
|
70 |
if expand_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
|
71 |
include, = args |
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 |
|
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 |
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
|
74 |
|
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 |
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
|
76 |
|
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
|
77 |
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
|
78 |
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
|
79 |
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
|
80 |
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
|
81 |
|
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 |
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
|
83 |
log.warn("%s: skip unknown control record: %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
|
84 |
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
|
85 |
|
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
|
86 |
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
|
87 |
# 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
|
88 |
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
|
89 |
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
|
90 |
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
|
91 |
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
|
92 |
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
|
93 |
) |
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
|
94 |
|
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 |
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
|
96 |
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
|
97 |
|
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 |
# 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
|
99 |
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
|
100 |
|
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
|
101 |
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
|
102 |
# 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
|
103 |
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
|
104 |
|
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 |
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
|
106 |
|
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 |
|
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
|
108 |
@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
|
109 |
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
|
110 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
111 |
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
|
112 |
""" |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
113 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
114 |
if not filename : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
115 |
filename = file.name |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
116 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
117 |
multiline_start = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
118 |
multiline_parts = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
119 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
120 |
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
|
121 |
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
|
122 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
123 |
# possible mtime prefix for line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
124 |
timestamp = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
125 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
126 |
if line_timestamp_prefix : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
127 |
if ': ' not in raw_line : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
128 |
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
|
129 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
130 |
# split prefix |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
131 |
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
|
132 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
133 |
# parse it out |
253
8f59ee92583d
pvl.dns.zone: tweak datetime import
Tero Marttila <terom@paivola.fi>
parents:
252
diff
changeset
|
134 |
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
|
135 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
136 |
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
|
137 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
138 |
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
|
139 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
140 |
# capture indent from raw line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
141 |
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
|
142 |
line = raw_line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
143 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
144 |
# parse comment |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
145 |
if ';' in line: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
146 |
line, comment = line.split(';', 1) |
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 |
line = line.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
149 |
comment = comment.strip() |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
150 |
else : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
151 |
comment = None |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
152 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
153 |
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
|
154 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
155 |
# split (quoted) fields |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
156 |
if '"' in line : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
157 |
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
|
158 |
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
|
159 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
160 |
else : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
161 |
parts = line.split() |
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 |
# handle multi-line statements... |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
164 |
if '(' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
165 |
assert not multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
166 |
|
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
|
167 |
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
|
168 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
169 |
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
|
170 |
multiline_line = raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
171 |
multiline_parts = [] |
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 |
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
|
174 |
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
|
175 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
176 |
# 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
|
177 |
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
|
178 |
multiline_line += raw_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
179 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
180 |
if ')' in parts : |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
181 |
assert multiline_start |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
182 |
|
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
|
183 |
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
|
184 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
185 |
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
|
186 |
raw_line = multiline_line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
187 |
parts = multiline_parts |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
188 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
189 |
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
|
190 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
191 |
# parse |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
192 |
if multiline_start: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
193 |
pass |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
194 |
else: |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
195 |
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
|
196 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
197 |
file = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
198 |
lineno = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
200 |
# data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
201 |
indent = None # was the line indented? |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
parts = None # split line fields |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
203 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
204 |
# optional |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
205 |
timestamp = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
206 |
comment = None |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
207 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
208 |
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
|
209 |
|
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
210 |
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
|
211 |
# source |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
212 |
self.file = file |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
213 |
self.lineno = lineno |
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
214 |
self.line = line |
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
215 |
|
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
216 |
# parse data |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
217 |
self.indent = indent |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
218 |
self.parts = parts |
248
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
219 |
|
cce9cf4933ca
pvl.dns.zone: more multi-line support in the parser..
Tero Marttila <terom@paivola.fi>
parents:
247
diff
changeset
|
220 |
# metadata |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
221 |
self.timestamp = timestamp |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
222 |
self.comment = comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
223 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
224 |
def __str__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
225 |
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
|
226 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
227 |
class ZoneRecord (object) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
228 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
229 |
A record from a zonefile. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
230 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
231 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
232 |
# context |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
233 |
line = None # the underlying line |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
234 |
origin = None # possible $ORIGIN context |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
235 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
236 |
# record fields |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
237 |
name = None |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
238 |
ttl = None # optional |
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
239 |
cls = None # optional |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
240 |
type = None |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
241 |
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
|
242 |
|
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
243 |
@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
|
244 |
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
|
245 |
""" |
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
|
246 |
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
|
247 |
""" |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
248 |
|
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
|
249 |
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
|
250 |
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
|
251 |
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
|
252 |
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
|
253 |
log.warn("%s: %s", file, line) |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
254 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
255 |
@classmethod |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
256 |
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
|
257 |
""" |
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
258 |
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
|
259 |
|
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
260 |
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
|
261 |
|
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
262 |
Return: (name, ZoneRecord) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
263 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
264 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
265 |
if parts is None : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
266 |
parts = list(line.parts) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
267 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
268 |
if not parts : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
269 |
# skip |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
270 |
return |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
271 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
272 |
if line.indent : |
274
81af20dd142d
pvl.dns.zone: fix runon name handling; typofix $ORIGIN
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
273 |
# 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
|
274 |
pass |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
275 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
276 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
277 |
name = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
278 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
279 |
if len(parts) < 2 : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
280 |
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
|
281 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
282 |
# parse ttl/cls/type |
254
358b6e91659d
ZoneRecord.parse: support $TTL, and very crudde $INCLUDE
Tero Marttila <terom@paivola.fi>
parents:
253
diff
changeset
|
283 |
_cls = None |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
284 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
285 |
if parts and parts[0][0].isdigit() : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
286 |
ttl = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
287 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
288 |
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
|
289 |
_cls = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
290 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
291 |
# always have type |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
292 |
type = parts.pop(0) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
293 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
294 |
# remaining parts are data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
295 |
data = parts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
296 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
297 |
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
|
298 |
|
252 | 299 |
return cls.build(line, name, ttl, _cls, type, data, **opts) |
300 |
||
301 |
@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
|
302 |
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
|
303 |
return cls(name, type, data, |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
304 |
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
|
305 |
cls = _cls, |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
306 |
line = line, |
252 | 307 |
**opts |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
308 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
309 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
310 |
@classmethod |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
311 |
def A (cls, name, ip, **opts) : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
312 |
return cls(str(name), 'A', [str(ip)], **opts) |
267
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
313 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
314 |
@classmethod |
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
315 |
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
|
316 |
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
|
317 |
|
8c0c1b6e6aff
pvl.dns.zone: ZoneRecord.A/CNAME
Tero Marttila <terom@paivola.fi>
parents:
257
diff
changeset
|
318 |
@classmethod |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
319 |
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
|
320 |
return cls(str(name), 'TXT', |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
321 |
[u'"{0}"'.format(text.replace('"', '\\"'))], |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
322 |
**opts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
323 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
324 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
325 |
@classmethod |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
326 |
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
|
327 |
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
|
328 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
329 |
@classmethod |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
330 |
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
|
331 |
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
|
332 |
|
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
|
333 |
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
|
334 |
self.name = name |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
335 |
self.type = type |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
336 |
self.data = data |
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 |
self.ttl = ttl |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
339 |
self.cls = cls |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
340 |
|
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
|
341 |
self.line = line |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
342 |
self.origin = origin |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
343 |
self.comment = comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
344 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
345 |
def __unicode__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
346 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
347 |
Construct a zonefile-format line..." |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
348 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
349 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
350 |
if self.comment : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
351 |
comment = '\t; ' + self._comment |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
352 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
353 |
comment = '' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
354 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
355 |
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
|
356 |
name = self.name or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
357 |
ttl = self.ttl or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
358 |
cls = self.cls or '', |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
359 |
type = self.type, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
360 |
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
|
361 |
comment = comment, |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
362 |
) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
363 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
364 |
def __repr__ (self) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
365 |
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
|
366 |
self.name, self.type, self.data |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
367 |
))) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
368 |
|
252 | 369 |
class SOA (ZoneRecord) : |
370 |
@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
|
371 |
def build (cls, line, name, ttl, _cls, type, data, **opts) : |
252 | 372 |
assert name == '@' |
373 |
||
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
|
374 |
return cls(*data, |
252 | 375 |
ttl = ttl, |
376 |
cls = cls, |
|
377 |
line = line, |
|
378 |
**opts |
|
379 |
) |
|
380 |
||
381 |
def __init__ (self, master, contact, serial, refresh, retry, expire, nxttl, **opts) : |
|
382 |
super(SOA, self).__init__('@', 'SOA', |
|
383 |
[master, contact, serial, refresh, retry, expire, nxttl], |
|
384 |
**opts |
|
385 |
) |
|
386 |
||
387 |
self.master = master |
|
388 |
self.contact = contact |
|
389 |
self.serial = serial |
|
390 |
self.refresh = refresh |
|
391 |
self.retry = retry |
|
392 |
self.expire = expire |
|
393 |
self.nxttl = nxttl |
|
394 |
||
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
395 |
class OffsetValue (object) : |
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 |
Magic for $GENERATE offsets. |
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 |
>>> OffsetValue(0)[1] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
400 |
1 |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
401 |
>>> OffsetValue(10)[5] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
402 |
15 |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
403 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
404 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
405 |
def __init__ (self, base) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
406 |
self.base = base |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
407 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
408 |
def __getitem__ (self, offset) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
409 |
return self.base + offset |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
410 |
|
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
411 |
def parse_generate_field (field, line=None) : |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
412 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
413 |
Parse a $GENERATE lhs/rhs field: |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
414 |
$ |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
415 |
${<offset>[,<width>[,<base>]]} |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
416 |
\$ |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
417 |
$$ |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
418 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
419 |
Returns a wrapper that builds the field-value when called with the index. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
420 |
|
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
421 |
>>> parse_generate_field("foo")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
422 |
'foo' |
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
423 |
>>> parse_generate_field("foo-$")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
424 |
'foo-1' |
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
425 |
>>> parse_generate_field("foo-$$")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
426 |
'foo-$' |
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
427 |
>>> parse_generate_field("\$")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
428 |
'$' |
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
429 |
>>> parse_generate_field("10.0.0.${100}")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
430 |
'10.0.0.101' |
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
431 |
>>> parse_generate_field("foo-${0,2,d}")(1) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
432 |
'foo-01' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
433 |
|
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 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
436 |
input = field |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
437 |
expr = [] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
438 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
439 |
while '$' in field : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
440 |
# defaults |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
441 |
offset = 0 |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
442 |
width = 0 |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
443 |
base = 'd' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
444 |
escape = False |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
445 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
446 |
# different forms |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
447 |
if '${' in field : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
448 |
pre, body = field.split('${', 1) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
449 |
body, post = body.split('}', 1) |
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 |
# parse body |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
452 |
parts = body.split(',') |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
453 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
454 |
# offset |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
455 |
offset = int(parts.pop(0)) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
456 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
457 |
# width |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
458 |
if parts : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
459 |
width = int(parts.pop(0)) |
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 |
# base |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
462 |
if parts : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
463 |
base = parts.pop(0) |
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 |
if parts: |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
466 |
# fail |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
467 |
raise ZoneLineError(line, "extra data in ${...} body: {0!r}", parts) |
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 |
elif '$$' in field : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
470 |
pre, post = field.split('$$', 1) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
471 |
escape = True |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
472 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
473 |
elif '\\$' in field : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
474 |
pre, post = field.split('\\$', 1) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
475 |
escape = True |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
476 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
477 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
478 |
pre, post = field.split('$', 1) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
479 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
480 |
expr.append(pre) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
481 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
482 |
if escape : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
483 |
expr.append('$') |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
484 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
485 |
else : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
486 |
# meta-format |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
487 |
fmt = '{value[%d]:0%d%s}' % (offset, width, base) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
488 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
489 |
log.debug("field=%r -> pre=%r, fmt=%r, post=%r", field, expr, fmt, post) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
490 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
491 |
expr.append(fmt) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
492 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
493 |
field = post |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
494 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
495 |
# final |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
496 |
if field : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
497 |
expr.append(field) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
498 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
499 |
# combine |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
500 |
expr = ''.join(expr) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
501 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
502 |
log.debug("%s: %s", input, expr) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
503 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
504 |
# processed |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
505 |
def value_func (value) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
506 |
# magic wrapper to implement offsets |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
507 |
return expr.format(value=OffsetValue(value)) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
508 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
509 |
return value_func |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
510 |
|
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
511 |
def parse_generate_range (field) : |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
512 |
""" |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
513 |
Parse a <start>-<stop>[/<step>] field |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
514 |
""" |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
515 |
|
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
516 |
if '/' in field : |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
517 |
field, step = field.split('/') |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
518 |
step = int(step) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
519 |
else : |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
520 |
step = 1 |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
521 |
|
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
522 |
start, stop = field.split('-') |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
523 |
start = int(start) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
524 |
stop = int(stop) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
525 |
|
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
526 |
log.debug(" range: start=%r, stop=%r, step=%r", start, stop, step) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
527 |
|
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
528 |
# inclusive |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
529 |
return range(start, stop + 1, step) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
530 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
531 |
def process_generate (line, origin, parts) : |
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 |
Process a |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
534 |
$GENERATE <start>-<stop>[/<step>] lhs [ttl] [class] type rhs [comment] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
535 |
directive into a series of ZoneResource's. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
536 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
537 |
|
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
538 |
range = parse_generate_range(parts.pop(0)) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
539 |
|
276
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
540 |
lhs_func = parse_generate_field(parts.pop(0), line=line) |
8db56588cefc
pvl.dns.zone: factor out parse_generate_range
Tero Marttila <terom@paivola.fi>
parents:
274
diff
changeset
|
541 |
rhs_func = parse_generate_field(parts.pop(-1), line=line) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
542 |
body = parts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
543 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
544 |
for i in range : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
545 |
# build |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
546 |
parts = [lhs_func(i)] + body + [rhs_func(i)] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
547 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
548 |
log.debug(" %03d: %r", i, parts) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
549 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
550 |
# parse |
252 | 551 |
yield ZoneRecord.parse(line, parts=parts, origin=origin) |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
552 |
|
250
65f0272ce458
pvl.dns.zone: move to ZoneLine/Record.load(file)
Tero Marttila <terom@paivola.fi>
parents:
248
diff
changeset
|
553 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
554 |
def reverse_ipv4 (ip) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
555 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
556 |
Return in-addr.arpa reverse for given IPv4 prefix. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
557 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
558 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
559 |
# parse |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
560 |
octets = tuple(int(part) for part in ip.split('.')) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
561 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
562 |
for octet in octets : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
563 |
assert 0 <= octet <= 255 |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
564 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
565 |
return '.'.join([str(octet) for octet in reversed(octets)] + ['in-addr', 'arpa']) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
566 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
567 |
def reverse_ipv6 (ip6) : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
568 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
569 |
Return ip6.arpa reverse for given IPv6 prefix. |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
570 |
""" |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
571 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
572 |
parts = [int(part, 16) for part in ip6.split(':')] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
573 |
parts = ['{0:04x}'.format(part) for part in parts] |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
574 |
parts = ''.join(parts) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
575 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
576 |
return '.'.join(tuple(reversed(parts)) + ( 'ip6', 'arpa')) |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
577 |
|
286 | 578 |
# TODO: support fqdns in parts |
579 |
def join (*parts) : |
|
580 |
""" |
|
581 |
Join a domain name from labels. |
|
582 |
""" |
|
583 |
||
584 |
return '.'.join(str(part) for part in parts) |
|
585 |
||
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
586 |
def fqdn (*parts) : |
286 | 587 |
""" |
588 |
Return an FQND from parts, ending in . |
|
589 |
""" |
|
590 |
||
295
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
591 |
fqdn = join(*parts) |
286 | 592 |
|
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
593 |
# we may be given an fqdn in parts |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
594 |
if not fqdn.endswith('.') : |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
595 |
fqdn += '.' |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
596 |
|
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
597 |
return fqdn |
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
598 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
599 |
def reverse_label (prefix, address) : |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
600 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
601 |
Determine the correct label for the given IP address within the reverse zone for the given prefix. |
247
08a63738f2d1
split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
602 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
603 |
This includes all suffix octets (partially) covered by the prefix. |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
604 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
605 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
606 |
assert prefix.version == address.version |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
607 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
608 |
hostbits = prefix.max_prefixlen - prefix.prefixlen |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
609 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
610 |
if prefix.version == 4 : |
295
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
611 |
# pack into octets |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
612 |
octets = [ord(x) for x in address.packed] |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
613 |
|
295
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
614 |
# take the suffix |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
615 |
octets = octets[-int(math.ceil(hostbits / 8.0)):] |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
616 |
|
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
617 |
# reverse in decimal |
297
63bce6f67916
pvl.dns.zone: fix ipv4 reverse_label()
Tero Marttila <terom@paivola.fi>
parents:
295
diff
changeset
|
618 |
return '.'.join(reversed(["{0:d}".format(x) for x in octets])) |
295
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
619 |
|
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
620 |
elif prefix.version == 6 : |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
621 |
# pack into nibbles |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
622 |
nibbles = [((ord(x) >> 4) & 0xf, ord(x) & 0xf) for x in address.packed] |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
623 |
nibbles = [nibble for nibblepair in nibbles for nibble in nibblepair] |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
624 |
|
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
625 |
# take the suffix |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
626 |
nibbles = nibbles[:-(hostbits / 4)] |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
627 |
|
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
628 |
# reverse in hex |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
629 |
return '.'.join(reversed(["{0:x}".format(x) for x in nibbles])) |
8c6d4565576f
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
Tero Marttila <terom@paivola.fi>
parents:
294
diff
changeset
|
630 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
631 |
else : |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
632 |
raise ValueError("unsupported address version: %s" % (prefix, )) |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
633 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
267
diff
changeset
|
634 |