bin/pvl.dns-zone
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 332 bb8a18cffe8a
permissions -rwxr-xr-x
hgignore: use glob; ignore snmp mibs
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 pvl.args
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    10
import pvl.dns.zone
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    11
from pvl.dns import __version__
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    12
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
    13
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    14
import optparse
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    15
import os.path
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
332
bb8a18cffe8a pvl.dns-zone: drop -c for --input-charset to not confict with pvl.args --config
Tero Marttila <terom@paivola.fi>
parents: 316
diff changeset
    38
    parser.add_option('--input-charset',        metavar='CHARSET',  default='utf-8', 
233
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
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    85
    parser.add_option('--include-path',         metavar='PATH',
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    86
            help="Rewrite includes to given absolute path")
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    87
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    # defaults
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    parser.set_defaults(
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        # XXX: combine
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        check_exempt        = [],
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        meta_ignore         = [],
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    )
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
    
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    # parse
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    options, args = parser.parse_args(argv[1:])
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    98
    # apply
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    99
    pvl.args.apply(options, prog)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    return options, args
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   103
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
   104
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   105
        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
   106
    """
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 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
   109
        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
   110
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   111
        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
   112
                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
   113
        ) :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   114
            yield line, record
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   115
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   116
# 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
   117
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
   118
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        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
   120
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        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
   122
    """
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
    by_name = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    by_ip = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
    fail = None
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    last_name = None
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   131
    for l, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   132
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   133
            name = r.name or last_name
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   135
            name = (r.origin, name)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   137
            # name
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   138
            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
   139
                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
   140
                    by_name[name] = 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
                elif r.name in whitelist :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   143
                    log.debug("Duplicate whitelist entry: %s", r)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   145
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   146
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   147
                    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
   148
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   149
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   150
            # ip
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   151
            if r.type == 'A' :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   152
                ip, = r.data
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
                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
   155
                    by_ip[ip] = r
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   156
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   157
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   158
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   159
                    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
   160
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   161
    
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   162
    if fail :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   163
        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
   164
        sys.exit(2)
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   165
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   166
    yield l, r
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   167
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   168
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
   169
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   170
        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
   171
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   172
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   173
    for line, rr in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   174
        if rr and rr.type == 'SOA' :
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   175
            # 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
   176
            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
   177
                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
   178
            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
   179
                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
   180
                sys.exit(2)
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   181
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   182
            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
   183
                    soa.master, soa.contact,
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   184
                    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
   185
            )
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   186
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   187
            yield line, rr
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   188
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
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
   190
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        Process zone data -> forward zone data.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
    """
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
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   195
        yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   197
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
            if txt :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
                # comment?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
                comment = r.line.comment
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
                if comment :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   203
                    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
   204
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
           
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
            # XXX: RP, do we need it?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
            if mx :
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   209
                # 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
   210
                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
   211
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
def process_zone_meta (zone, ignore=None) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
        Process zone metadata -> output.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
    
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   217
    TIMESTAMP_FORMAT = '%Y/%m/%d'
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
    
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   219
    for line, r in zone :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
        if ignore and r.name in ignore :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
            # skip
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
            log.debug("Ignore record: %s", r)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
        # for hosts..
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        if r.type == 'A' :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
            # timestamp?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
            timestamp = r.line.timestamp
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
            if timestamp :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   231
                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
   232
     
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
def process_zone_reverse (zone, origin, domain) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
        Process zone data -> reverse zone data.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   238
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   239
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
            ptr = reverse_ipv4(ip)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   243
        elif r and r.type == 'AAAA' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
            ptr = reverse_ipv6(ip)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
            
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   248
            yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
        # verify
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
        if zone and ptr.endswith(origin) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
            ptr = ptr[:-(len(origin) + 1)]
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
            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
   257
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        # domain to use
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
        host_domain = r.origin or domain
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
        host_fqdn = fqdn(name, host_domain)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   263
        yield line, ZoneRecord.PTR(ptr, host_fqdn)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   265
def process_zone_includes (options, zone, path) :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   266
    """
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   267
        Rewrite include paths in zones.
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   268
    """
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   269
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   270
    for line, rr in zone :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   271
        if line.parts[0] == '$INCLUDE' :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   272
            _, include = line.parts
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   273
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   274
            yield pvl.dns.zone.ZoneLine(
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   275
                    line.file,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   276
                    line.lineno, 
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   277
                    line.line,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   278
                    line.indent,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   279
                    ['$INCLUDE', '"{path}"'.format(path=os.path.join(path, include))],
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   280
            ), rr
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   281
        else :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   282
            yield line, rr
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   283
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   284
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   285
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
   286
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   287
        Write out the resulting zonefile.
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   288
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   289
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   290
    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
   291
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   292
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   293
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   294
            file.write(unicode(r))
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   295
        else :
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   296
            file.write(unicode(line))
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   297
        file.write('\n')
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
def main (argv) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
    options, args = parse_options(argv)
258
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
   301
    
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   302
    # input
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   303
    zone = apply_zone_input(options, args)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
   
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
    if options.check_hosts :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
        whitelist = set(options.check_exempt)
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
        log.info("Checking hosts: whitelist=%r", whitelist)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   310
        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
   311
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   312
    if options.serial :
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   313
        log.info("Set zone serial: %s", options.serial)
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   314
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   315
        zone = list(process_zone_serial(zone, serial=options.serial))
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   316
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
    if options.forward_zone :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   318
        log.info("Generate forward zone...")
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
        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
   321
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   322
    if options.meta_zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   323
        log.info("Generate metadata zone...")
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
        if not options.input_line_date :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
            log.error("--meta-zone requires --input-line-date")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
            return 1
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
        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
   330
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   331
    if options.reverse_zone :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
        if ':' in options.reverse_zone :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
            # IPv6
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
            origin = reverse_ipv6(options.reverse_zone)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
            # IPv4
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
            origin = reverse_ipv4(options.reverse_zone)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
        domain = options.reverse_domain
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
        if not domain :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
            log.error("--reverse-zone requires --reverse-domain")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
            return 1
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
        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
   347
    
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   348
    if options.include_path :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   349
        zone = list(process_zone_includes(options, zone, options.include_path))
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   350
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   351
    # output
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   352
    apply_zone_output(options, zone)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
    return 0
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
if __name__ == '__main__':
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
    import sys
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358
    sys.exit(main(sys.argv))