author | Tero Marttila <terom@paivola.fi> |
Sun, 07 Sep 2014 14:21:56 +0300 | |
changeset 424 | e77e967d59b0 |
parent 421 | 585eadaed270 |
permissions | -rwxr-xr-x |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
import pvl.args |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
4 |
import pvl.hosts |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
import pvl.dns.zone |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
289
b316deddf746
pvl.hosts-dns: support wildcard --forward-zone
Tero Marttila <terom@paivola.fi>
parents:
283
diff
changeset
|
7 |
import fnmatch |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
import ipaddr |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
import logging; log = logging.getLogger('pvl.hosts-dns') |
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
10 |
import optparse |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
|
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
12 |
def process_hosts_alias (options, origin, host_domain, alias, host) : |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
""" |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
14 |
Resolve alias@domain within given zone. |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
15 |
""" |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
16 |
|
325
9be2b216e87c
change host alias to always be host-domain relative
Tero Marttila <terom@paivola.fi>
parents:
324
diff
changeset
|
17 |
if host_domain : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
18 |
alias = pvl.dns.join(alias, host_domain) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
19 |
else : |
325
9be2b216e87c
change host alias to always be host-domain relative
Tero Marttila <terom@paivola.fi>
parents:
324
diff
changeset
|
20 |
raise ValueError("no domain given for host %s alias %s" % (host, alias, )) |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
21 |
|
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
22 |
if alias.endswith('.' + origin) : |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
23 |
# strip |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
24 |
alias = alias[:(len(alias) - len(origin) - 1)] |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
25 |
else: |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
26 |
raise ValueError("alias domain outside of origin: %s / %s" % (alias, origin)) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
27 |
|
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
28 |
return pvl.dns.zone.ZoneRecord.CNAME(alias, host) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
29 |
|
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
30 |
def process_hosts_names (options, hosts, origin) : |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
31 |
""" |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
32 |
Yield ZoneRecords for hosts within the given zone. |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
""" |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
35 |
for host in hosts : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
36 |
# determine label within zone |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
37 |
if not origin : |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
38 |
label = pvl.dns.join(host, host.domain) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
39 |
elif host.domain == origin : |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
40 |
label = str(host) |
337
23b3c0661189
pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents:
335
diff
changeset
|
41 |
elif host.domain and host.domain.endswith('.' + origin) : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
42 |
fqdn = pvl.dns.join(host, host.domain) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
43 |
label = fqdn[:(len(fqdn) - len(origin) - 1)] |
337
23b3c0661189
pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents:
335
diff
changeset
|
44 |
elif host.domain : |
23b3c0661189
pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents:
335
diff
changeset
|
45 |
log.debug("%s: domain %s out of zone: %s", host, host.domain, origin) |
23b3c0661189
pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents:
335
diff
changeset
|
46 |
continue |
289
b316deddf746
pvl.hosts-dns: support wildcard --forward-zone
Tero Marttila <terom@paivola.fi>
parents:
283
diff
changeset
|
47 |
else : |
337
23b3c0661189
pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents:
335
diff
changeset
|
48 |
log.debug("%s: fqdn out of zone: %s", host, origin) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
49 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
50 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
51 |
if host.forward is None : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
52 |
pass |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
53 |
elif host.forward : |
343
ecdcfd1e7174
pvl.hosts: make host.forward/reverse just fqdns...
Tero Marttila <terom@paivola.fi>
parents:
341
diff
changeset
|
54 |
forward = pvl.dns.zone.fqdn(host.forward) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
55 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
56 |
log.info("%s: forward: %s", host, forward) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
57 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
58 |
yield pvl.dns.zone.ZoneRecord.CNAME(label, forward) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
59 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
60 |
else : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
61 |
log.info("%s: skip forward", host) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
continue |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
63 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
64 |
if host.ip : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
65 |
yield pvl.dns.zone.ZoneRecord.A(label, host.ip) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
67 |
if host.alias4 : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
68 |
yield pvl.dns.zone.ZoneRecord.A(host.ALIAS4_FMT.format(host=label), host.ip) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
69 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
70 |
if host.ip6 : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
71 |
yield pvl.dns.zone.ZoneRecord.AAAA(label, host.ip6) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
72 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
73 |
if host.alias6 : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
74 |
yield pvl.dns.zone.ZoneRecord.AAAA(label.ALIAS6_FMT.format(host=host), host.ip6) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
75 |
|
421
585eadaed270
pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents:
385
diff
changeset
|
76 |
if host.location and host.location_domain: |
585eadaed270
pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents:
385
diff
changeset
|
77 |
yield process_hosts_alias(options, origin, host.location_domain, host.location, label) |
585eadaed270
pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents:
385
diff
changeset
|
78 |
elif host.location: |
385
01d31fda75ab
pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents:
343
diff
changeset
|
79 |
yield process_hosts_alias(options, origin, host.domain, host.location, label) |
01d31fda75ab
pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents:
343
diff
changeset
|
80 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
81 |
for alias in host.alias : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
82 |
yield process_hosts_alias(options, origin, host.domain, alias, label) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
|
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
84 |
for alias4 in host.alias4 : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
85 |
yield process_hosts_alias(options, origin, host.domain, alias4, host.ALIAS4_FMT.format(host=label)) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
86 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
87 |
for alias6 in host.alias6 : |
385
01d31fda75ab
pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents:
343
diff
changeset
|
88 |
yield process_hosts_alias(options, origin, host.domain, alias6, host.ALIAS6_FMT.format(host=label)) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
89 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
90 |
def process_hosts_forward (options, hosts, origin) : |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
91 |
""" |
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
92 |
Generate DNS ZoneRecords for for hosts within the given zone origin. |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
93 |
""" |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
94 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
95 |
if options.add_origin : |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
96 |
yield pvl.dns.zone.ZoneDirective.build(None, 'ORIGIN', origin) |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
97 |
|
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
98 |
by_name = dict() |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
99 |
by_name_type = dict() |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
100 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
101 |
# list of types thare are allowed to be present for a host |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
102 |
MULTI_TYPES = ('A', 'AAAA') |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
103 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
104 |
for rr in process_hosts_names(options, hosts, origin) : |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
105 |
if (rr.name, rr.type) in by_name_type : |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
106 |
raise ValueError("%s: duplicate name/type: %s: %s" % (rr.name, rr, by_name_type[(rr.name, rr.type)])) |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
107 |
elif rr.type in MULTI_TYPES : |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
108 |
by_name_type[(rr.name, rr.type)] = rr |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
109 |
elif rr.name in by_name : |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
110 |
raise ValueError("%s: duplicate name: %s: %s" % (rr.name, rr, by_name[rr.name])) |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
111 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
112 |
# always check these |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
113 |
by_name[rr.name] = rr |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
114 |
|
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
115 |
# preserve ordering |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
116 |
yield rr |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
117 |
|
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
118 |
def split_ipv6_parts (prefix) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
119 |
for hextet in prefix.rstrip(':').split(':') : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
120 |
for nibble in hextet.rjust(4, '0') : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
121 |
yield nibble |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
122 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
123 |
def build_ipv6_parts (parts) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
124 |
for i in xrange(0, len(parts), 4) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
125 |
yield ''.join(parts[i:i+4]) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
126 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
127 |
# suffix :: |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
128 |
if len(parts) < 32 : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
129 |
yield '' |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
130 |
yield '' |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
131 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
132 |
def parse_prefix (prefix) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
133 |
""" |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
134 |
Return an ipaddr.IPNetwork from given IPv4/IPv6 prefix. |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
135 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
136 |
>>> parse_prefix('127.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
137 |
IPv4Network('127.0.0.0/8') |
341
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
138 |
>>> parse_prefix('192.0.2.128/26') |
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
139 |
IPv4Network('192.0.2.128/26') |
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
140 |
>>> parse_prefix('192.0.2.128-26') |
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
141 |
IPv4Network('192.0.2.128-26') |
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
142 |
>>> parse_prefix('127.') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
143 |
IPv4Network('127.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
144 |
>>> parse_prefix('10') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
145 |
IPv4Network('10.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
146 |
>>> parse_prefix('192.168') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
147 |
IPv4Network('192.168.0.0/16') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
148 |
>>> parse_prefix('fe80:') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
149 |
IPv6Network('fe80::/16') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
150 |
>>> parse_prefix('2001:db8::') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
151 |
IPv6Network('2001:db8::/32') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
152 |
>>> parse_prefix('2001:db8:1:2') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
153 |
IPv6Network('2001:db8:1:2::/64') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
154 |
""" |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
155 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
156 |
if '/' in prefix : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
157 |
return ipaddr.IPNetwork(prefix) |
341
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
158 |
|
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
159 |
elif '-' in prefix : |
82905d6bfb7a
pvl.hosts-dns: support X.Y.Z-C style reverse prefxies for rfc2317 style delegations
Tero Marttila <terom@paivola.fi>
parents:
337
diff
changeset
|
160 |
return ipaddr.IPNetwork(prefix.replace('-', '/')) |
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
161 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
162 |
elif '.' in prefix or prefix.isdigit() : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
163 |
parts = prefix.rstrip('.').split('.') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
164 |
prefixlen = len(parts) * 8 |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
165 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
166 |
return ipaddr.IPv4Network('{prefix}/{prefixlen}'.format( |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
167 |
prefix = '.'.join(parts + ['0' for i in xrange(4 - len(parts))]), |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
168 |
prefixlen = prefixlen, |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
169 |
)) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
170 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
171 |
elif ':' in prefix : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
172 |
parts = list(split_ipv6_parts(prefix)) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
173 |
prefixlen = len(parts) * 4 |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
174 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
175 |
return ipaddr.IPv6Network('{prefix}/{prefixlen}'.format( |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
176 |
prefix = ':'.join(build_ipv6_parts(parts)), |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
177 |
prefixlen = prefixlen, |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
178 |
)) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
179 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
180 |
else : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
181 |
raise ValueError("Unrecognized IP prefix string: %s" % (prefix, )) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
182 |
|
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
183 |
def process_hosts_ips (options, hosts, prefix) : |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
184 |
""" |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
185 |
Yield (ip, fqnd) for hosts within given prefix. |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
186 |
""" |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
187 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
188 |
for host in hosts : |
283
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
189 |
if prefix.version == 4 : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
190 |
ip = host.ip |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
191 |
elif prefix.version == 6 : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
192 |
ip = host.ip6 |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
193 |
else : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
194 |
raise ValueError("%s: unknown ip version: %s" % (prefix, prefix.version)) |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
195 |
|
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
196 |
if not ip : |
296
9dad6914cfe7
pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents:
289
diff
changeset
|
197 |
log.debug("%s: no ip%d", host, prefix.version) |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
198 |
continue |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
|
283
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
200 |
if ip not in prefix : |
296
9dad6914cfe7
pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents:
289
diff
changeset
|
201 |
log.debug("%s: %s out of prefix: %s", host, ip, prefix) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
continue |
296
9dad6914cfe7
pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents:
289
diff
changeset
|
203 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
204 |
label = pvl.dns.zone.reverse_label(prefix, ip) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
205 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
206 |
if host.reverse is None : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
207 |
fqdn = host.fqdn() |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
208 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
209 |
log.info("%s %s[%s]: PTR %s", host, prefix, ip, fqdn) |
296
9dad6914cfe7
pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents:
289
diff
changeset
|
210 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
211 |
yield host, ip, pvl.dns.zone.ZoneRecord.PTR(label, fqdn) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
212 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
213 |
elif host.reverse : |
343
ecdcfd1e7174
pvl.hosts: make host.forward/reverse just fqdns...
Tero Marttila <terom@paivola.fi>
parents:
341
diff
changeset
|
214 |
alias = pvl.dns.zone.fqdn(host.reverse) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
215 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
216 |
log.info("%s %s[%s]: CNAME %s", host, prefix, ip, alias) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
217 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
218 |
yield host, ip, pvl.dns.zone.ZoneRecord.CNAME(label, alias) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
219 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
220 |
else : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
221 |
log.info("%s %s[%s]: omit", host, prefix, ip) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
222 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
223 |
|
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
224 |
|
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
225 |
def process_hosts_reverse (options, hosts, prefix) : |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
226 |
""" |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
227 |
Generate DNS ZoneRecords within the given prefix's reverse-dns zone for hosts. |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
228 |
""" |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
229 |
|
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
230 |
# collect data for records |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
231 |
by_ip = dict() |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
232 |
for host, ip, rr in process_hosts_ips(options, hosts, prefix) : |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
233 |
if ip in by_ip : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
234 |
raise ValueError("%s: duplicate ip: %s: %s" % (host, ip, by_ip[ip])) |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
235 |
else : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
236 |
by_ip[ip] = rr |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
237 |
|
278
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
238 |
if options.unknown_host : |
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
239 |
# enumerate all of them |
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
240 |
iter_ips = prefix.iterhosts() |
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
241 |
else : |
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
242 |
iter_ips = sorted(by_ip) |
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
243 |
|
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
244 |
for ip in iter_ips : |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
245 |
if ip in by_ip : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
246 |
yield by_ip[ip] |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
247 |
elif options.unknown_host : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
248 |
label = pvl.dns.zone.reverse_label(prefix, ip) |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
249 |
fqdn = pvl.dns.zone.fqdn(options.unknown_host, options.hosts_domain) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
250 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
251 |
log.info("%s %s[%s]: unused PTR %s", options.unknown_host, ip, prefix, fqdn) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
252 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
253 |
yield pvl.dns.zone.ZoneRecord.PTR(label, fqdn) |
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
254 |
else : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
255 |
continue |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
256 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
257 |
def apply_zone (options, zone) : |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
258 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
259 |
Output given ZoneRecord's |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
260 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
261 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
262 |
for record in zone : |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
263 |
print unicode(record) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
264 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
265 |
def main (argv) : |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
266 |
""" |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
267 |
Generate bind zonefiles from host definitions. |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
268 |
""" |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
269 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
270 |
parser = optparse.OptionParser(main.__doc__) |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
271 |
parser.add_option_group(pvl.args.parser(parser)) |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
272 |
parser.add_option_group(pvl.hosts.optparser(parser)) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
273 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
274 |
parser.add_option('--add-origin', action='store_true', |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
275 |
help="Include $ORIGIN directive in zone") |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
276 |
|
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
277 |
parser.add_option('--forward-zone', metavar='DOMAIN', |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
278 |
help="Generate forward zone for domain") |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
279 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
280 |
parser.add_option('--reverse-zone', metavar='PREFIX', |
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
281 |
help="Generate reverse zone for prefix") |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
282 |
|
272
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
283 |
parser.add_option('--unknown-host', metavar='NAME', |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
284 |
help="Generate records for unused IPs") |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
285 |
|
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
286 |
options, args = parser.parse_args(argv[1:]) |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
287 |
pvl.args.apply(options) |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
288 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
289 |
# input |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
290 |
hosts = pvl.hosts.apply(options, args) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
291 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
292 |
# process |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
293 |
if options.forward_zone : |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
294 |
apply_zone(options, |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
295 |
process_hosts_forward(options, hosts, options.forward_zone), |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
296 |
) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
297 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
298 |
if options.reverse_zone : |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
299 |
apply_zone(options, |
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
300 |
process_hosts_reverse(options, hosts, parse_prefix(options.reverse_zone)), |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
301 |
) |
269
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
302 |
|
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
303 |
if __name__ == '__main__': |
713d0495288e
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235.0/24
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
304 |
pvl.args.main(main) |