bin/pvl.dns-zone
author Tero Marttila <tero.marttila@aalto.fi>
Fri, 27 Feb 2015 11:53:25 +0200
changeset 636 d21df33dd1d4
parent 630 18939b861476
child 637 6674b18f6829
permissions -rwxr-xr-x
pvl.dns-zone: remove zone meta support
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
630
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
     9
import logging; log = logging.getLogger('pvl.dns-zone')
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    10
import optparse
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    11
import os.path
630
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
    12
import pvl.args
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
    13
import pvl.dns
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
    14
import pvl.dns.zone
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
    15
18939b861476 quickfix pvl.dns-zone
Tero Marttila <tero.marttila@aalto.fi>
parents: 332
diff changeset
    16
from pvl.hosts import __version__
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
    # forward stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    parser.add_option('--forward-zone',         action='store_true', 
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            help="Generate forward zone")
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('--forward-txt',          action='store_true',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            help="Generate TXT records for forward zone")
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('--forward-mx',           metavar='MX',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
            help="Generate MX records for forward zone")
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
    # reverse stage
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    parser.add_option('--reverse-domain',       metavar='DOMAIN',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
            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
    67
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    parser.add_option('--reverse-zone',         metavar='NET',
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
            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
    70
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    71
    # other
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    72
    parser.add_option('--serial',               metavar='YYMMDDXX',
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    73
            help="Set serial for SOA record")
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
    74
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    75
    parser.add_option('--include-path',         metavar='PATH',
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    76
            help="Rewrite includes to given absolute path")
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
    77
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    # defaults
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    parser.set_defaults(
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        # XXX: combine
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        check_exempt        = [],
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    )
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    # parse
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    options, args = parser.parse_args(argv[1:])
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    87
    # apply
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
    88
    pvl.args.apply(options, prog)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    return options, args
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
    92
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
    93
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
    94
        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
    95
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
    96
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
    97
    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
    98
        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
    99
636
d21df33dd1d4 pvl.dns-zone: remove zone meta support
Tero Marttila <tero.marttila@aalto.fi>
parents: 630
diff changeset
   100
        for line, record in pvl.dns.zone.ZoneLine.load(file):
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   101
            yield line, record
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   102
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   103
# 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
   104
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
   105
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        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
   107
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        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
   109
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
    by_name = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    by_ip = {}
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
    fail = None
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
    last_name = None
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   118
    for l, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   119
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   120
            name = r.name or last_name
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   122
            name = (r.origin, name)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   124
            # name
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   125
            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
   126
                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
   127
                    by_name[name] = r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   129
                elif r.name in whitelist :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   130
                    log.debug("Duplicate whitelist entry: %s", r)
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
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   133
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   134
                    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
   135
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   136
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   137
            # ip
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   138
            if r.type == 'A' :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   139
                ip, = r.data
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   140
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   141
                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
   142
                    by_ip[ip] = r
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   143
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   144
                else :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   145
                    # fail!
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   146
                    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
   147
                    fail = True
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   148
    
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   149
    if fail :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   150
        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
   151
        sys.exit(2)
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   152
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   153
    yield l, r
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   154
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   155
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
   156
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   157
        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
   158
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   159
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   160
    for line, rr in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   161
        if rr and rr.type == 'SOA' :
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   162
            # 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
   163
            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
   164
                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
   165
            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
   166
                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
   167
                sys.exit(2)
293
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
            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
   170
                    soa.master, soa.contact,
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   171
                    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
   172
            )
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   173
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   174
            yield line, rr
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   175
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
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
   177
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
        Process zone data -> forward zone data.
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   181
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   182
        yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   184
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
            if txt :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
                # comment?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
                comment = r.line.comment
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
                if comment :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   190
                    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
   191
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
            # XXX: RP, do we need it?
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
            if mx :
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   196
                # 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
   197
                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
   198
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
def process_zone_reverse (zone, origin, domain) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
    """
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        Process zone data -> reverse zone data.
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
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   204
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   205
        if r and r.type == 'A' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            ptr = reverse_ipv4(ip)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   209
        elif r and r.type == 'AAAA' :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
            ip, = r.data
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
            ptr = reverse_ipv6(ip)
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
        else :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   214
            yield line, r
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
            continue
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        # verify
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        if zone and ptr.endswith(origin) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
            ptr = ptr[:-(len(origin) + 1)]
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
            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
   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
        # domain to use
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        host_domain = r.origin or domain
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
        host_fqdn = fqdn(name, host_domain)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   229
        yield line, ZoneRecord.PTR(ptr, host_fqdn)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   231
def process_zone_includes (options, zone, path) :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   232
    """
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   233
        Rewrite include paths in zones.
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   234
    """
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   235
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   236
    for line, rr in zone :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   237
        if line.parts[0] == '$INCLUDE' :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   238
            _, include = line.parts
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   239
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   240
            yield pvl.dns.zone.ZoneLine(
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   241
                    line.file,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   242
                    line.lineno, 
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   243
                    line.line,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   244
                    line.indent,
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   245
                    ['$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
   246
            ), rr
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   247
        else :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   248
            yield line, rr
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   249
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   250
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   251
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
   252
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   253
        Write out the resulting zonefile.
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   254
    """
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   255
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   256
    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
   257
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   258
    for line, r in zone :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   259
        if r :
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   260
            file.write(unicode(r))
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   261
        else :
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   262
            file.write(unicode(line))
247
08a63738f2d1 split pvl.dns-zone into pvl.dns.zone
Tero Marttila <terom@paivola.fi>
parents: 233
diff changeset
   263
        file.write('\n')
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
def main (argv) :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
    options, args = parse_options(argv)
258
1ad9cec4f556 pvl.dns-zone: use pvl.args.apply_files
Tero Marttila <terom@paivola.fi>
parents: 252
diff changeset
   267
    
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   268
    # input
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   269
    zone = apply_zone_input(options, args)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
   
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
    if options.check_hosts :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
        whitelist = set(options.check_exempt)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   274
        log.info("Checking hosts: whitelist=%r", whitelist)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   276
        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
   277
252
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   278
    if options.serial :
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   279
        log.info("Set zone serial: %s", options.serial)
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   280
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   281
        zone = list(process_zone_serial(zone, serial=options.serial))
0ea4450fdd40 pvl.dns-zone: --serial
Tero Marttila <terom@paivola.fi>
parents: 251
diff changeset
   282
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
    if options.forward_zone :
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   284
        log.info("Generate forward zone...")
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
        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
   287
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   288
    if options.reverse_zone :
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
        if ':' in options.reverse_zone :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
            # IPv6
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
            origin = reverse_ipv6(options.reverse_zone)
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
        else :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
            # IPv4
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
            origin = reverse_ipv4(options.reverse_zone)
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
        domain = options.reverse_domain
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
        if not domain :
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
            log.error("--reverse-zone requires --reverse-domain")
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
            return 1
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
        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
   304
    
316
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   305
    if options.include_path :
41bd6688b142 pvl.dns.zone: implement --include-path
Tero Marttila <terom@paivola.fi>
parents: 294
diff changeset
   306
        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
   307
293
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   308
    # output
6351acf3eb3b pvl.dns-zone: use ZoneLine.load to passthrough zonefiles
Tero Marttila <terom@paivola.fi>
parents: 258
diff changeset
   309
    apply_zone_output(options, zone)
233
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
    return 0
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
if __name__ == '__main__':
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
    import sys
c4941645464c import pvl.dns-* scripts from pvl-dns
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
    sys.exit(main(sys.argv))