author | Tero Marttila <terom@paivola.fi> |
Sun, 22 Dec 2013 18:20:45 +0200 | |
changeset 335 | 77fb4019d4e0 |
parent 331 | 9dda6a0e9826 |
child 337 | 23b3c0661189 |
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) |
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
41 |
elif host.domain.endswith('.' + origin) : |
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)] |
289
b316deddf746
pvl.hosts-dns: support wildcard --forward-zone
Tero Marttila <terom@paivola.fi>
parents:
283
diff
changeset
|
44 |
else : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
45 |
log.debug("%s: domain %s out of zone: %s", host, host.domain, origin) |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
46 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
47 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
48 |
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
|
49 |
pass |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
50 |
elif host.forward : |
335
77fb4019d4e0
pvl.hosts-dns: generate forward/reverse cnames as FQDNs
Tero Marttila <terom@paivola.fi>
parents:
331
diff
changeset
|
51 |
forward = pvl.dns.zone.fqdn(host, host.forward, host.domain) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
52 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
53 |
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
|
54 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
55 |
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
|
56 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
57 |
else : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
58 |
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
|
59 |
continue |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
60 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
61 |
if host.ip : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
62 |
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
|
63 |
|
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
64 |
if host.alias4 : |
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(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
|
66 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
67 |
if host.ip6 : |
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.AAAA(label, host.ip6) |
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.alias6 : |
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.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
|
72 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
73 |
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
|
74 |
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
|
75 |
|
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
76 |
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
|
77 |
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
|
78 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
79 |
for alias6 in host.alias6 : |
310
eb1829893317
pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents:
308
diff
changeset
|
80 |
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
|
81 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
82 |
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
|
83 |
""" |
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
84 |
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
|
85 |
""" |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
86 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
87 |
if options.add_origin : |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
88 |
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
|
89 |
|
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
90 |
by_name = dict() |
308
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
91 |
by_name_type = dict() |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
92 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
93 |
# 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
|
94 |
MULTI_TYPES = ('A', 'AAAA') |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
95 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
96 |
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
|
97 |
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
|
98 |
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
|
99 |
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
|
100 |
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
|
101 |
elif rr.name in by_name : |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
102 |
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
|
103 |
|
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
104 |
# always check these |
08176bed21e3
pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents:
299
diff
changeset
|
105 |
by_name[rr.name] = rr |
273
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
106 |
|
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
107 |
# preserve ordering |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
108 |
yield rr |
c8deaa9a2746
pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
272
diff
changeset
|
109 |
|
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
110 |
def split_ipv6_parts (prefix) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
111 |
for hextet in prefix.rstrip(':').split(':') : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
112 |
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
|
113 |
yield nibble |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
114 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
115 |
def build_ipv6_parts (parts) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
116 |
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
|
117 |
yield ''.join(parts[i:i+4]) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
118 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
119 |
# suffix :: |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
120 |
if len(parts) < 32 : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
121 |
yield '' |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
122 |
yield '' |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
123 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
124 |
def parse_prefix (prefix) : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
125 |
""" |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
126 |
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
|
127 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
128 |
>>> 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
|
129 |
IPv4Network('127.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
130 |
>>> parse_prefix('127.') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
131 |
IPv4Network('127.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
132 |
>>> parse_prefix('10') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
133 |
IPv4Network('10.0.0.0/8') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
134 |
>>> parse_prefix('192.168') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
135 |
IPv4Network('192.168.0.0/16') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
136 |
>>> parse_prefix('fe80:') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
137 |
IPv6Network('fe80::/16') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
138 |
>>> parse_prefix('2001:db8::') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
139 |
IPv6Network('2001:db8::/32') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
140 |
>>> parse_prefix('2001:db8:1:2') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
141 |
IPv6Network('2001:db8:1:2::/64') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
142 |
""" |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
143 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
144 |
if '/' in prefix : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
145 |
return ipaddr.IPNetwork(prefix) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
146 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
147 |
elif '.' in prefix or prefix.isdigit() : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
148 |
parts = prefix.rstrip('.').split('.') |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
149 |
prefixlen = len(parts) * 8 |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
150 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
151 |
return ipaddr.IPv4Network('{prefix}/{prefixlen}'.format( |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
152 |
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
|
153 |
prefixlen = prefixlen, |
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 |
elif ':' in prefix : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
157 |
parts = list(split_ipv6_parts(prefix)) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
158 |
prefixlen = len(parts) * 4 |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
159 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
160 |
return ipaddr.IPv6Network('{prefix}/{prefixlen}'.format( |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
161 |
prefix = ':'.join(build_ipv6_parts(parts)), |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
162 |
prefixlen = prefixlen, |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
163 |
)) |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
164 |
|
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
165 |
else : |
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
166 |
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
|
167 |
|
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
|
168 |
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
|
169 |
""" |
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
|
170 |
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
|
171 |
""" |
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
|
172 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
173 |
for host in hosts : |
283
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
174 |
if prefix.version == 4 : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
175 |
ip = host.ip |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
176 |
elif prefix.version == 6 : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
177 |
ip = host.ip6 |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
178 |
else : |
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
179 |
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
|
180 |
|
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
181 |
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
|
182 |
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
|
183 |
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
|
184 |
|
283
951e4b70bad4
pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents:
278
diff
changeset
|
185 |
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
|
186 |
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
|
187 |
continue |
296
9dad6914cfe7
pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents:
289
diff
changeset
|
188 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
189 |
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
|
190 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
191 |
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
|
192 |
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
|
193 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
194 |
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
|
195 |
|
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
196 |
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
|
197 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
198 |
elif host.reverse : |
335
77fb4019d4e0
pvl.hosts-dns: generate forward/reverse cnames as FQDNs
Tero Marttila <terom@paivola.fi>
parents:
331
diff
changeset
|
199 |
alias = pvl.dns.zone.fqdn(label, host.reverse, host.domain) |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
200 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
201 |
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
|
202 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
203 |
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
|
204 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
205 |
else : |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
206 |
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
|
207 |
continue |
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
208 |
|
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
|
209 |
|
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
210 |
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
|
211 |
""" |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
212 |
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
|
213 |
""" |
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
214 |
|
5755f9c54135
pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents:
270
diff
changeset
|
215 |
# 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
|
216 |
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
|
217 |
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
|
218 |
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
|
219 |
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
|
220 |
else : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
221 |
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
|
222 |
|
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
|
223 |
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
|
224 |
# 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
|
225 |
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
|
226 |
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
|
227 |
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
|
228 |
|
2db1a5323f92
pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents:
273
diff
changeset
|
229 |
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
|
230 |
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
|
231 |
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
|
232 |
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
|
233 |
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
|
234 |
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
|
235 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
236 |
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
|
237 |
|
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
238 |
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
|
239 |
else : |
331
9dda6a0e9826
pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents:
325
diff
changeset
|
240 |
continue |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
241 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
242 |
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
|
243 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
244 |
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
|
245 |
""" |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
246 |
|
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
247 |
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
|
248 |
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
|
249 |
|
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
|
250 |
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
|
251 |
""" |
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
|
252 |
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
|
253 |
""" |
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
|
254 |
|
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
|
255 |
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
|
256 |
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
|
257 |
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
|
258 |
|
324
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
259 |
parser.add_option('--add-origin', action='store_true', |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
260 |
help="Include $ORIGIN directive in zone") |
9b9c662f36b2
pvl.hosts-dns: implement --add-origin
Tero Marttila <terom@paivola.fi>
parents:
312
diff
changeset
|
261 |
|
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
|
262 |
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
|
263 |
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
|
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 |
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
|
266 |
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
|
267 |
|
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
|
268 |
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
|
269 |
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
|
270 |
|
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
|
271 |
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
|
272 |
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
|
273 |
|
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
|
274 |
# input |
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
275 |
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
|
276 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
277 |
# 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
|
278 |
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
|
279 |
apply_zone(options, |
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
280 |
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
|
281 |
) |
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 |
|
270
bafcda3a3c0d
pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents:
269
diff
changeset
|
283 |
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
|
284 |
apply_zone(options, |
312
b814f87ed40d
pvl.hosts-dns: support short-form --reverse-host=...
Tero Marttila <terom@paivola.fi>
parents:
310
diff
changeset
|
285 |
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
|
286 |
) |
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
|
287 |
|
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 |
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
|
289 |
pvl.args.main(main) |