bin/pvl.hosts-dns
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 421 585eadaed270
permissions -rwxr-xr-x
hgignore: use glob; ignore snmp mibs
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)