bin/pvl.dns-zone
author Tero Marttila <terom@paivola.fi>
Tue, 17 Dec 2013 17:31:41 +0200
changeset 306 a1bdb4499c7a
parent 294 29720bbc5379
child 316 41bd6688b142
permissions -rwxr-xr-x
pvl.hots: fix Host.build Unknown host field error
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
     4
    Process bind zonefiles.
258
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
     5
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
     6
    Takes a zonefile as input, and gives a zonefile as output.
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
"""
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
     9
import optparse
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    11
import pvl.args
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    12
import pvl.dns.zone
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    13
from pvl.dns import __version__
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    14
from pvl.dns.zone import ZoneRecord, reverse_ipv4, reverse_ipv6, fqdn
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    16
import logging; log = logging.getLogger('main')
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
def parse_options (argv) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        Parse command-line arguments.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    prog = argv[0]
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    parser = optparse.OptionParser(
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
            prog        = prog,
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            usage       = '%prog: [options]',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            version     = __version__,
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            # module docstring
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            description = __doc__,
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    )
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    # logging
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    35
    parser.add_option_group(pvl.args.parser(parser))
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    # input/output
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    parser.add_option('-c', '--input-charset',  metavar='CHARSET',  default='utf-8', 
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
            help="Encoding used for input files")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
258
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
    41
    parser.add_option('-o', '--output',         metavar='FILE',     default=None,
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            help="Write to output file; default stdout")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    parser.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
            help="Encoding used for output files")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
    # check stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    parser.add_option('--check-hosts',          action='store_true',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            help="Check that host/IPs are unique. Use --quiet to silence warnings, and test exit status")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    parser.add_option('--check-exempt',         metavar='HOST', action='append',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
            help="Allow given names to have multiple records")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    # meta stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    parser.add_option('--meta-zone',            action='store_true',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            help="Generate host metadata zone; requires --input-line-date")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    parser.add_option('--meta-ignore',          metavar='HOST', action='append',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            help="Ignore given hostnames in metadata output")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    parser.add_option('--input-line-date',      action='store_true',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
            help="Parse timestamp prefix from each input line (e.g. `hg blame | ...`)")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    # forward stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    parser.add_option('--forward-zone',         action='store_true', 
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
            help="Generate forward zone")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    parser.add_option('--forward-txt',          action='store_true',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
            help="Generate TXT records for forward zone")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    parser.add_option('--forward-mx',           metavar='MX',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
            help="Generate MX records for forward zone")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    # reverse stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
    parser.add_option('--reverse-domain',       metavar='DOMAIN',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
            help="Domain to use for hosts in reverse zone")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    parser.add_option('--reverse-zone',         metavar='NET',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
            help="Generate forward zone for given subnet (x.z.y | a:b:c:d)")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    81
    # other
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    82
    parser.add_option('--serial',               metavar='YYMMDDXX',
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    83
            help="Set serial for SOA record")
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    84
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    # defaults
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    parser.set_defaults(
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        # XXX: combine
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        check_exempt        = [],
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        meta_ignore         = [],
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    )
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
    
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    # parse
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    options, args = parser.parse_args(argv[1:])
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    95
    # apply
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    96
    pvl.args.apply(options, prog)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    return options, args
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   100
def apply_zone_input (options, args) :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   101
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   102
        Yield ZoneLine, ZoneRecord pairs from files.
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   103
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   104
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   105
    for file in pvl.args.apply_files(args, 'r', options.input_charset) :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   106
        log.info("Reading zone: %s", file)
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   107
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   108
        for line, record in pvl.dns.zone.ZoneLine.load(file, 
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   109
                line_timestamp_prefix   = options.input_line_date,
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   110
        ) :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   111
            yield line, record
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   112
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   113
# TODO: --check-types to limit this to A/AAAA/CNAME etc
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
def check_zone_hosts (zone, whitelist=None, whitelist_types=set(['TXT'])) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        Parse host/IP pairs from the zone, and verify that they are unique.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        As an exception, names listed in the given whitelist may have multiple IPs.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
    by_name = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
    by_ip = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
    fail = None
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    last_name = None
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   128
    for l, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   129
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   130
            name = r.name or last_name
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   132
            name = (r.origin, name)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   134
            # name
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   135
            if r.type not in whitelist_types :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   136
                if name not in by_name :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   137
                    by_name[name] = r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   139
                elif r.name in whitelist :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   140
                    log.debug("Duplicate whitelist entry: %s", r)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   142
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   143
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   144
                    log.warn("%s: Duplicate name: %s <-> %s", r.line, r, by_name[name])
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   145
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   146
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   147
            # ip
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   148
            if r.type == 'A' :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   149
                ip, = r.data
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   150
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   151
                if ip not in by_ip :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   152
                    by_ip[ip] = r
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   153
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   154
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   155
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   156
                    log.warn("%s: Duplicate IP: %s <-> %s", r.line, r, by_ip[ip])
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   157
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   158
    
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   159
    if fail :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   160
        log.error("Check failed, see warnings")
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   161
        sys.exit(2)
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   162
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   163
    yield l, r
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   164
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   165
def process_zone_serial (zone, serial) :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   166
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   167
        Update the serial in the SOA record.
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   168
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   169
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   170
    for line, rr in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   171
        if rr and rr.type == 'SOA' :
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   172
            # XXX: as SOA record..
294
29720bbc5379 pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents: 293
diff changeset
   173
            try :
29720bbc5379 pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents: 293
diff changeset
   174
                soa = pvl.dns.zone.SOA.parse(line)
29720bbc5379 pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents: 293
diff changeset
   175
            except TypeError as error :
29720bbc5379 pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents: 293
diff changeset
   176
                log.exception("%s: unable to parse SOA: %s", rr.name, rr)
29720bbc5379 pvl.dns.zone: better warnings for pvl.dns.zone.SOA.parse with missing parameters
Tero Marttila <terom@paivola.fi>
parents: 293
diff changeset
   177
                sys.exit(2)
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   178
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   179
            yield line, pvl.dns.zone.SOA(
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   180
                    soa.master, soa.contact,
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   181
                    serial, soa.refresh, soa.retry, soa.expire, soa.nxttl
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   182
            )
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   183
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   184
            yield line, rr
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   185
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
def process_zone_forwards (zone, txt=False, mx=False) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        Process zone data -> forward zone data.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   191
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   192
        yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   194
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
            if txt :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
                # comment?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
                comment = r.line.comment
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
                if comment :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   200
                    yield line, ZoneRecord.TXT(None, comment, ttl=r.ttl)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
           
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            # XXX: RP, do we need it?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
            if mx :
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   206
                # XXX: is this even a good idea?
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   207
                yield line, ZoneRecord.MX(None, 10, mx, ttl=r.ttl)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
def process_zone_meta (zone, ignore=None) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
        Process zone metadata -> output.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   214
    TIMESTAMP_FORMAT = '%Y/%m/%d'
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   216
    for line, r in zone :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        if ignore and r.name in ignore :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
            # skip
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
            log.debug("Ignore record: %s", r)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
        # for hosts..
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
        if r.type == 'A' :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
            # timestamp?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
            timestamp = r.line.timestamp
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
            if timestamp :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   228
                yield line, ZoneRecord.TXT(r.name, timestamp.strftime(TIMESTAMP_FORMAT), ttl=r.ttl)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
     
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
def process_zone_reverse (zone, origin, domain) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
        Process zone data -> reverse zone data.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   235
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   236
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
            ptr = reverse_ipv4(ip)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   240
        elif r and r.type == 'AAAA' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
            ptr = reverse_ipv6(ip)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
            
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   245
            yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
        # verify
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
        if zone and ptr.endswith(origin) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
            ptr = ptr[:-(len(origin) + 1)]
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
            log.warning("Reverse does not match zone origin, skipping: (%s) -> %s <-> %s", ip, ptr, origin)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
        # domain to use
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
        host_domain = r.origin or domain
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
        host_fqdn = fqdn(name, host_domain)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   260
        yield line, ZoneRecord.PTR(ptr, host_fqdn)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   262
def apply_zone_output (options, zone) :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   263
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   264
        Write out the resulting zonefile.
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   265
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   266
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   267
    file = pvl.args.apply_file(options.output, 'w', options.output_charset)
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   268
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   269
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   270
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   271
            file.write(unicode(r))
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   272
        else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   273
            file.write(line.line)
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   274
        file.write('\n')
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
def main (argv) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
    options, args = parse_options(argv)
258
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
   278
    
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   279
    # input
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   280
    zone = apply_zone_input(options, args)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
   
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
    if options.check_hosts :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
        whitelist = set(options.check_exempt)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   285
        log.info("Checking hosts: whitelist=%r", whitelist)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   287
        zone = list(check_zone_hosts(zone, whitelist=whitelist))
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   289
    if options.serial :
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   290
        log.info("Set zone serial: %s", options.serial)
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   291
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   292
        zone = list(process_zone_serial(zone, serial=options.serial))
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   293
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
    if options.forward_zone :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   295
        log.info("Generate forward zone...")
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
        zone = list(process_zone_forwards(zone, txt=options.forward_txt, mx=options.forward_mx))
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   299
    if options.meta_zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   300
        log.info("Generate metadata zone...")
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
        if not options.input_line_date :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
            log.error("--meta-zone requires --input-line-date")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
            return 1
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
        zone = list(process_zone_meta(zone, ignore=set(options.meta_ignore)))
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   308
    if options.reverse_zone :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
        if ':' in options.reverse_zone :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
            # IPv6
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
            origin = reverse_ipv6(options.reverse_zone)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
            # IPv4
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
            origin = reverse_ipv4(options.reverse_zone)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
        domain = options.reverse_domain
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
        if not domain :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
            log.error("--reverse-zone requires --reverse-domain")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
            return 1
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
        zone = list(process_zone_reverse(zone, origin=origin, domain=domain))
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   324
    
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   325
    # output
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   326
    apply_zone_output(options, zone)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
    return 0
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
if __name__ == '__main__':
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
    import sys
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
    sys.exit(main(sys.argv))