bin/pvl.hosts-dns
author Tero Marttila <terom@paivola.fi>
Wed, 18 Dec 2013 23:22:02 +0200
changeset 310 eb1829893317
parent 308 08176bed21e3
child 312 b814f87ed40d
permissions -rwxr-xr-x
pvl.hosts-dns: handle cross-domain aliases, within origin
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')
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
    10
import optparse
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
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    17
    if '.' in alias :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    18
        pass
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    19
    elif host_domain :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    20
        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
    21
    else :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    22
        raise ValueError("no domain given for alias: %s / %s" % (alias, ))
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    23
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    24
    if alias.endswith('.' + origin) :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    25
        # strip
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    26
        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
    27
    else:
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    28
        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
    29
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    30
    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
    31
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    32
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
    33
    """
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    34
        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
    35
    """
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
    36
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
    37
    for host in hosts :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    38
        # determine label within zone
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    39
        if not origin :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    40
            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
    41
        elif host.domain == origin :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    42
            label = str(host)
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    43
        elif host.domain.endswith('.' + origin) :
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    44
            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
    45
            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
    46
        else :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    47
            log.debug("%s: %s out of zone: %s", host, host.domain, origin)
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
    48
            continue
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    49
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
    50
        if host.ip :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    51
            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
    52
        
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    53
        if host.alias4 :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    54
            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
    55
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    56
        if host.ip6 :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    57
            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
    58
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    59
        if host.alias6 :
310
eb1829893317 pvl.hosts-dns: handle cross-domain aliases, within origin
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    60
            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
    61
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
    62
        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
    63
            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
    64
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    65
        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
    66
            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
    67
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    68
        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
    69
            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
    70
273
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    71
def process_hosts_forward (options, hosts, domain) :
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    72
    """
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    73
        Generate DNS ZoneRecords for the given domain's zone for hosts.
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    74
    """
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    75
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    76
    by_name = dict()
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    77
    by_name_type = dict()
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
    # 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
    80
    MULTI_TYPES = ('A', 'AAAA')
273
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    81
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    82
    for rr in process_hosts_names(options, hosts, domain) :
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    83
        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
    84
            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
    85
        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
    86
            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
    87
        elif rr.name in by_name :
273
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    88
            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
    89
        
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    90
        # always check these
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    91
        by_name[rr.name] = rr
273
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    92
        
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    93
        # preserve ordering
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    94
        yield rr
c8deaa9a2746 pvl.hosts-dns: --forward--zone duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 272
diff changeset
    95
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
    96
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
    97
    """
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
    98
        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
    99
    """
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
   100
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   101
    for host in hosts :
283
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   102
        if prefix.version == 4 :
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   103
            ip = host.ip
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   104
        elif prefix.version == 6 :
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   105
            ip = host.ip6
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   106
        else :
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   107
            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
   108
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   109
        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
   110
            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
   111
            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
   112
283
951e4b70bad4 pvl.hosts-dns: ip6 support
Tero Marttila <terom@paivola.fi>
parents: 278
diff changeset
   113
        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
   114
            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
   115
            continue
296
9dad6914cfe7 pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 289
diff changeset
   116
        
299
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 298
diff changeset
   117
        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
   118
296
9dad6914cfe7 pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 289
diff changeset
   119
        log.debug("%s: ip=%s domain=%s: %s", host, ip, host.domain, fqdn)
9dad6914cfe7 pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 289
diff changeset
   120
9dad6914cfe7 pvl.hosts-dns: a little bit of logging for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 289
diff changeset
   121
        yield ip, 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
   122
 
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   123
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
   124
    """
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   125
        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
   126
    """
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   127
    
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   128
    # 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
   129
    by_ip = dict()
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   130
    for ip, fqdn in process_hosts_ips(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
   131
        if ip in by_ip :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   132
            raise ValueError("%s: duplicate ip: %s: %s" % (fqdn, ip, by_ip[ip]))
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   133
        else :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   134
            by_ip[ip] = fqdn
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   135
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
   136
    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
   137
        # 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
   138
        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
   139
    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
   140
        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
   141
2db1a5323f92 pvl.hosts-dns: do not enumerate the entire prefix space unless using --unknown-host
Tero Marttila <terom@paivola.fi>
parents: 273
diff changeset
   142
    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
   143
        if ip in by_ip :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   144
            fqdn = by_ip[ip]
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   145
        elif options.unknown_host :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   146
            fqdn = pvl.dns.zone.fqdn(options.unknown_host, options.hosts_domain)
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   147
        else :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   148
            fqdn = None
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
   149
        
298
fa1ab8cda47e pvl.dns.zone: fix ipv6 reverse_label()
Tero Marttila <terom@paivola.fi>
parents: 296
diff changeset
   150
        log.info("%s: %s", ip, fqdn)
fa1ab8cda47e pvl.dns.zone: fix ipv6 reverse_label()
Tero Marttila <terom@paivola.fi>
parents: 296
diff changeset
   151
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
   152
        if fqdn :
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   153
            # reverse against the reverse-dns zone origin
5755f9c54135 pvl.hosts-dns: enumerate --reverse-zone with support for --unknown-host and duplicate checking
Tero Marttila <terom@paivola.fi>
parents: 270
diff changeset
   154
            yield pvl.dns.zone.ZoneRecord.PTR(pvl.dns.zone.reverse_label(prefix, ip), fqdn)
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   155
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   156
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
   157
    """
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   158
        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
   159
    """
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   160
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   161
    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
   162
        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
   163
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
   164
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
   165
    """
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
   166
        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
   167
    """
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
   168
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
    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
   170
    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
   171
    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
   172
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
   173
    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
   174
            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
   175
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
   176
    parser.add_option('--reverse-zone',         metavar='PREFIX',
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
   177
            help="Generate reverse zone for prefx")
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
   178
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
   179
    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
   180
            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
   181
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
   182
    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
   183
    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
   184
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
   185
    # input
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   186
    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
   187
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   188
    # 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
   189
    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
   190
        apply_zone(options, 
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   191
                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
   192
        )
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
   193
    
270
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   194
    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
   195
        apply_zone(options, 
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   196
                process_hosts_reverse(options, hosts, ipaddr.IPNetwork(options.reverse_zone)),
bafcda3a3c0d pvl.hosts-dns: split to pvl.dns.host, using Host class
Tero Marttila <terom@paivola.fi>
parents: 269
diff changeset
   197
        )
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
   198
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
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
   200
    pvl.args.main(main)