pvl/dns/process.py
author Tero Marttila <tero.marttila@aalto.fi>
Tue, 03 Mar 2015 12:14:22 +0200
changeset 716 4fecd0d1cf23
parent 648 8e3e6be9ac70
child 717 e37b0a857a5d
permissions -rw-r--r--
pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
641
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     1
import logging
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     2
import optparse
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     3
import os.path
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     4
import pvl.args
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     5
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     6
from pvl.dns import zone
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     7
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     8
log = logging.getLogger('pvl.dns.process')
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     9
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    10
def optparser (parser):
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    11
    group = optparse.OptionGroup(parser, "Hosts config files")
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    12
    group.add_option('--input-charset',        metavar='CHARSET',  default='utf-8', 
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    13
            help="Encoding used for input files")
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    14
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    15
    group.add_option('-o', '--output',         metavar='FILE',     default=None,
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    16
            help="Write to output file; default stdout")
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    17
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    18
    group.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    19
            help="Encoding used for output files")
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    20
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    21
    return group
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    22
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    23
def zone_serial (rrs, serial) :
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    24
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    25
        Update the serial in the SOA record.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    26
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    27
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    28
    for rr in rrs:
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    29
        if isinstance(rr, zone.ZoneRecordSOA) and rr.type == 'SOA':
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    30
            yield zone.ZoneRecordSOA.build(rr.name, rr.type,
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    31
                    rr.master, rr.contact,
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    32
                    serial, rr.refresh, rr.retry, rr.expire, rr.nxttl,
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    33
                    line=rr.line, origin=rr.origin, comment=rr.comment,
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    34
            )
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    35
        else:
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    36
            yield rr
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    37
716
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    38
def zone_includes (rrs, includes_path,
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    39
        include_trace=None,
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    40
):
641
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    41
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    42
        Rewrite include paths in zones.
716
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    43
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    44
            include_trace           - append included paths to given list
641
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    45
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    46
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    47
    for rr in rrs:
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    48
        if isinstance(rr, zone.ZoneDirective) and rr.directive == 'INCLUDE':
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    49
            include_path, = rr.arguments
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    50
716
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    51
            include = os.path.join(includes_path, include_path)
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    52
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    53
            if include_trace is not None:
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    54
                include_trace.append(include)
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    55
4fecd0d1cf23 pvl.dns.process: merge --include-trace into pvl.dns-process, replacing pvl.dns-includes
Tero Marttila <tero.marttila@aalto.fi>
parents: 648
diff changeset
    56
            yield zone.ZoneDirective.INCLUDE(include)
641
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    57
        else:
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    58
            yield rr
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    59
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    60
def apply_zone_output (options, zone):
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    61
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    62
        Output given ZoneDirective/ZoneRecord items to the output file/stdout.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    63
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    64
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    65
    file = pvl.args.apply_file(options.output, 'w', options.output_charset)
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    66
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    67
    for item in zone:
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    68
        file.write(unicode(item))
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    69
        file.write('\n')
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    70
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    71
def apply_zone (options, args):
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    72
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    73
        ZoneLine.load() in given zones.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    74
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    75
        Yields ZoneDirective/ZoneRecord items.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    76
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    77
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    78
    for file in pvl.args.apply_files(args, 'r', options.input_charset) :
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    79
        log.info("%s: reading zone", file.name)
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    80
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    81
        for item in zone.ZoneLine.load(file):
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    82
            yield item
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    83
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    84
def apply_zone_records (options, origin, args) :
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    85
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    86
        ZoneRecord.load() in given zones.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    87
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    88
        Yields expanded ZoneRecord items.
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    89
    """
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    90
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    91
    for file in pvl.args.apply_files(args, 'r', options.input_charset) :
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    92
        log.info("%s: expanding zone", file.name)
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    93
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    94
        for item in zone.ZoneRecord.load(file, origin):
9d36e312e6a7 pvl.dns-zone: update and split out pvl.dns-process for --serial and --include-path transforms
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
    95
            yield item