bin/process-zone
author Tero Marttila <terom@paivola.fi>
Mon, 19 Mar 2012 10:58:50 +0200
changeset 24 4ccc31fdc047
parent 23 91c073d5615a
child 25 3d35d0eef197
permissions -rwxr-xr-x
process-zone: generate TXT records for ZoneLine.timestamp, if available
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Process zonefiles.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
__version__ = '0.0.1-dev'
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import optparse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import codecs
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    11
from datetime import datetime
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import logging
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    14
log = logging.getLogger('main')
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
# command-line options, global state
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
options = None
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
def parse_options (argv) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        Parse command-line arguments.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    24
    prog = argv[0]
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    25
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    parser = optparse.OptionParser(
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    27
            prog        = prog,
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            usage       = '%prog: [options]',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
            version     = __version__,
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            # module docstring
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            description = __doc__,
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    )
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    # logging
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    general = optparse.OptionGroup(parser, "General Options")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    38
    general.add_option('-q', '--quiet',     dest='loglevel', action='store_const', const=logging.ERROR, help="Less output")
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    general.add_option('-v', '--verbose',   dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    general.add_option('-D', '--debug',     dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    parser.add_option_group(general)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    44
    # input/output
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    parser.add_option('-c', '--input-charset',  metavar='CHARSET',  default='utf-8', 
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            help="Encoding used for input files")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    parser.add_option('-o', '--output',         metavar='FILE',     default='-',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            help="Write to output file; default stdout")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    parser.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
            help="Encoding used for output files")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    54
    # read line mtimes?
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    55
    parser.add_option('--input-line-date',      action='store_true',
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    56
            help="Parse timestamp prefix from each input line (e.g. `hg blame | ...`)")
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    57
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    58
    # check stage
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    59
    parser.add_option('--check-hosts',          action='store_true',
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    60
            help="Check that host/IPs are unique. Use --quiet to silence warnings, and test exit status")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    61
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    62
    parser.add_option('--check-exempt',         action='append',
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    63
            help="Allow given names to have multiple records")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    64
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    65
    # forward stage
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    parser.add_option('--forward-zone',         action='store_true', 
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
            help="Generate forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    parser.add_option('--forward-txt',          action='store_true',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
            help="Generate TXT records for forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    parser.add_option('--forward-mx',           metavar='MX',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
            help="Generate MX records for forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    75
    # reverse stage
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    parser.add_option('--reverse-domain',       metavar='DOMAIN',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            help="Domain to use for hosts in reverse zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    parser.add_option('--reverse-zone',         metavar='NET',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
            help="Generate forward zone for given subnet (x.z.y)")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    # defaults
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    parser.set_defaults(
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    84
        loglevel            = logging.WARN,
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    85
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    86
        check_exempt        = [],
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    )
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    options, args = parser.parse_args(argv[1:])
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    # configure
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    logging.basicConfig(
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    94
        format  = prog + ': %(name)s: %(levelname)s %(funcName)s : %(message)s',
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        level   = options.loglevel,
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    )
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    return options, args
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   100
class ZoneLine (object) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   101
    """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   102
        A line in a zonefile.
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   103
    """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   104
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   105
    file = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   106
    lineno = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   107
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   108
    # data
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   109
    indent = None # was the line indented?
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   110
    data = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   111
    parts = None # split line fields
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   112
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   113
    # optional
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   114
    timestamp = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   115
    comment = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   116
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   117
    PARSE_DATETIME_FORMAT = '%Y-%m-%d'
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   118
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   119
    @classmethod
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   120
    def parse (cls, file, lineno, line, line_timestamp_prefix=False) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   121
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   122
            Parse out given line and build.
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   123
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   124
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   125
        log.debug("parse: %s:%d: %s", file, lineno, line)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   126
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   127
        ts = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   128
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   129
        if line_timestamp_prefix :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   130
            if ': ' not in line :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   131
                raise Exception("Missing timestamp prefix on line: %s:%d: %s" % (file, lineno, line))
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   132
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   133
            # split prefix
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   134
            prefix, line = line.split(': ', 1)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   135
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   136
            # parse it out
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   137
            ts = datetime.strptime(prefix, cls.PARSE_DATETIME_FORMAT)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   138
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   139
            log.debug("  ts=%r", ts)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   140
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   141
        # was line indented?
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   142
        indent = line.startswith(' ') or line.startswith('\t')
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   143
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   144
        # strip
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   145
        line = line.strip()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   146
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   147
        log.debug("  indent=%r, line=%r", indent, line)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   148
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   149
        # parse comment out?
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   150
        if ';' in line :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   151
            line, comment = line.split(';', 1)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   152
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   153
            line = line.strip()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   154
            comment = comment.strip()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   155
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   156
        else :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   157
            line = line.strip()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   158
            comment = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   159
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   160
        log.debug("  line=%r, comment=%r", line, comment)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   161
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   162
        # parse fields
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   163
        if '"' in line :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   164
            pre, data, post = line.split('"', 2)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   165
            parts = pre.split() + [data] + post.split()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   166
           
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   167
        else :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   168
            parts = line.split()
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   169
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   170
        log.debug("  parts=%r", parts)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   171
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   172
        # build
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   173
        return cls(file, lineno, indent, line, parts, timestamp=ts, comment=comment)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   174
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   175
    def __init__ (self, file, lineno, indent, data, parts, timestamp=None, comment=None) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   176
        self.file = file
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   177
        self.lineno = lineno
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   178
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   179
        self.indent = indent
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   180
        self.data = data
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   181
        self.parts = parts
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   182
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   183
        self.timestamp = timestamp
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   184
        self.comment = comment
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   185
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   186
    def __str__ (self) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   187
        return "{file}:{lineno}".format(file=self.file, lineno=self.lineno)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   188
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   189
class ZoneRecord (object) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   190
    """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   191
        A record from a zonefile.
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   192
    """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   193
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   194
    # the underlying line
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   195
    line = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   196
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   197
    # record fields
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   198
    name = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   199
    type = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   200
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   201
    # list of data fields
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   202
    data = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   203
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   204
    # optional
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   205
    ttl = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   206
    cls = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   207
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   208
    @classmethod
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   209
    def parse (cls, line) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   210
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   211
            Parse from ZoneLine. Returns None if there is no record on the line..
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   212
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   213
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   214
        if not line.parts :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   215
            # skip
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   216
            return
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   217
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   218
        # consume parts
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   219
        parts = list(line.parts)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   220
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   221
        # indented lines don't have name
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   222
        if line.indent :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   223
            name = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   224
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   225
        else :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   226
            name = parts.pop(0)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   227
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   228
        log.debug("  name=%r", name)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   229
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   230
        # parse ttl/cls/type
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   231
        ttl = _cls = None
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   232
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   233
        if parts and parts[0][0].isdigit() :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   234
            ttl = parts.pop(0)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   235
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   236
        if parts and parts[0].upper() in ('IN', 'CH') :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   237
            _cls = parts.pop(0)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   238
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   239
        # always have type
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   240
        type = parts.pop(0)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   241
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   242
        # remaining parts are data
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   243
        data = parts
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   244
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   245
        log.debug("  ttl=%r, cls=%r, type=%r, data=%r", ttl, _cls, type, data)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   246
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   247
        return cls(name, type, data,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   248
            ttl     = ttl,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   249
            cls     = _cls,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   250
            line    = line,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   251
        )
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   252
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   253
    def __init__ (self, name, type, data, ttl=None, cls=None, line=None, comment=None) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   254
        self.name = name
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   255
        self.type = type
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   256
        self.data = data
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   257
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   258
        self.ttl = ttl
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   259
        self.cls = cls
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   260
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   261
        self.line = line
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   262
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   263
        # XXX: within line
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   264
        self._comment = comment
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   265
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   266
    def build_line (self) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   267
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   268
            Construct a zonefile-format line..."
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   269
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   270
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   271
        # XXX: comment?
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   272
        if self._comment :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   273
            comment = '\t; ' + self._comment
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   274
        else :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   275
            comment = ''
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   276
            
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   277
        return u"{name:25} {ttl:4} {cls:2} {type:5} {data}{comment}".format(
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   278
                name    = self.name or '',
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   279
                ttl     = self.ttl or '',
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   280
                cls     = self.cls or '',
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   281
                type    = self.type,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   282
                data    = ' '.join(unicode(data) for data in self.data),
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   283
                comment = comment,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   284
        )
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   285
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   286
    def __str__ (self) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   287
        return ' '.join((self.name, self.type, ' '.join(self.data)))
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   288
24
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   289
class TXTRecord (ZoneRecord) :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   290
    """
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   291
        TXT record.
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   292
    """
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   293
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   294
    def __init__ (self, name, text, **opts) :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   295
        return super(TXTRecord, self).__init__(name, 'TXT', 
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   296
            [u'"{0}"'.format(text.replace('"', '\\"'))], 
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   297
            **opts
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   298
        )
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   299
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   300
def parse_record (path, lineno, line, **opts) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
        Parse (name, ttl, type, data, comment) from bind zonefile.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
        Returns None for empty/comment lines.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   307
    # line
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   308
    line = ZoneLine.parse(path, lineno, line, **opts)
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   309
    record = ZoneRecord.parse(line)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   311
    if record :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   312
        return record
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   313
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   314
def parse_zone_records (file, **opts) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
    """
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   316
        Parse ZoneRecord items from the given zonefile, ignoring non-record lines.
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
    for lineno, line in enumerate(file) :
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   320
        record = parse_record(file.name, lineno, line, **opts)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   322
        if record :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   323
            yield record
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   325
def check_zone_hosts (zone, whitelist=None) :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   326
    """
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   327
        Parse host/IP pairs from the zone, and verify that they are unique.
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   328
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   329
        As an exception, names listed in the given whitelist may have multiple IPs.
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   330
    """
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   331
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   332
    by_name = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   333
    by_ip = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   334
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   335
    fail = None
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   336
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   337
    for r in zone :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   338
        name = r.name
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   339
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   340
        # name
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   341
        if name not in by_name :
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   342
            by_name[name] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   343
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   344
        elif r.name in whitelist :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   345
            log.debug("Duplicate whitelist entry: %s", r)
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   346
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   347
        else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   348
            # fail!
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   349
            log.warn("%s: Duplicate name: %s <-> %s", r.line, r, by_name[name])
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   350
            fail = True
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   351
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   352
        # ip
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   353
        if r.type == 'A' :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   354
            ip, = r.data
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   355
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   356
            if ip not in by_ip :
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   357
                by_ip[ip] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   358
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   359
            else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   360
                # fail!
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   361
                log.warn("%s: Duplicate IP: %s <-> %s", r.line, r, by_ip[ip])
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   362
                fail = True
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   363
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   364
    return fail
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   365
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
def process_zone_forwards (zone, txt=False, mx=False) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   367
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   368
        Process zone data -> forward zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
24
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   371
    TIMESTAMP_FORMAT='%Y/%m/%d'
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   372
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   373
    for r in zone :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   374
        yield r
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   376
        if r.type == 'A' :
24
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   377
            if txt :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   378
                # comment?
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   379
                comment = r.line.comment
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   380
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   381
                if comment :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   382
                    yield TXTRecord(None, comment, ttl=r.ttl)
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   383
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   384
                # timestamp?
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   385
                timestamp = r.line.timestamp
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   386
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   387
                if timestamp :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   388
                    yield TXTRecord(None, timestamp.strftime(TIMESTAMP_FORMAT), ttl=r.ttl)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   389
            
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   390
            # XXX: RP, do we need it?
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   391
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   392
            if mx :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   393
                # XXX: is this a good idea?
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   394
                yield ZoneRecord(None, 'MX', [10, mx], ttl=r.ttl)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   395
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   396
def reverse_addr (ip) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   397
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   398
        Return in-addr.arpa reverse for given IPv4 IP.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   399
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   400
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   401
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   402
    octets = tuple(int(part) for part in ip.split('.'))
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   403
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   404
    for octet in octets :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   405
        assert 0 <= octet <= 255
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   406
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   407
    return '.'.join([str(octet) for octet in reversed(octets)] + ['in-addr', 'arpa'])
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   408
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   409
def fqdn (*parts) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   410
    return '.'.join(parts) + '.'
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   411
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   412
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   413
def process_zone_reverse (zone, origin, domain) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   414
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   415
        Process zone data -> reverse zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   416
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   417
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   418
    for r in zone :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   419
        if r.type != 'A' :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   420
            continue
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   421
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   422
        ip, = r.data
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   423
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   424
        # generate reverse-addr
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   425
        reverse = reverse_addr(ip)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   426
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   427
        # verify
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   428
        if zone and reverse.endswith(origin) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   429
            reverse = reverse[:-(len(origin) + 1)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   430
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   431
        else :
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   432
            log.warning("Reverse does not match zone origin, skipping: (%s) -> %s <-> %s", ip, reverse, origin)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   433
            continue
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   434
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   435
        # domain to use
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   436
        host_domain = domain
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   437
        host_fqdn = fqdn(r.name, domain)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   438
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   439
        yield ZoneRecord(reverse, 'PTR', [host_fqdn])
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   440
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   441
def write_zone_records (file, zone) :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   442
    for r in zone :
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   443
        file.write(r.build_line() + u'\n')
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   444
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   445
def open_file (path, mode, charset) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   446
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   447
        Open unicode-enabled file from path, with - using stdio.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   448
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   449
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   450
    if path == '-' :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   451
        # use stdin/out based on mode
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   452
        stream, func = {
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   453
            'r':    (sys.stdin, codecs.getreader),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   454
            'w':    (sys.stdout, codecs.getwriter),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   455
        }[mode[0]]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   456
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   457
        # wrap
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   458
        return func(charset)(stream)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   459
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   460
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   461
        # open
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   462
        return codecs.open(path, mode, charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   463
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   464
def main (argv) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   465
    global options
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   466
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   467
    options, args = parse_options(argv)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   468
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   469
    if args :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   470
        # open files
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   471
        input_files = [open_file(path, 'r', options.input_charset) for path in args]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   472
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   473
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   474
        # default to stdout
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   475
        input_files = [open_file('-', 'r', options.input_charset)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   476
   
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   477
    # process zone data
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   478
    zone = []
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   479
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   480
    for file in input_files :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   481
        log.info("Reading zone: %s", file)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   482
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   483
        zone += list(parse_zone_records(file, 
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   484
            line_timestamp_prefix   = options.input_line_date,
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   485
        ))
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   486
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   487
    # check?
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   488
    if options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   489
        whitelist = set(options.check_exempt)
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   490
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   491
        log.debug("checking hosts; whitelist=%r", whitelist)
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   492
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   493
        if check_zone_hosts(zone, whitelist=whitelist) :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   494
            log.warn("Hosts check failed")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   495
            return 2
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   496
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   497
        else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   498
            log.info("Hosts check OK")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   499
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   500
    # output file
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   501
    output = open_file(options.output, 'w', options.output_charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   502
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   503
    if options.forward_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   504
        log.info("Write forward zone: %s", output)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   505
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   506
        zone = list(process_zone_forwards(zone, txt=options.forward_txt, mx=options.forward_mx))
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   507
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   508
    elif options.reverse_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   509
        origin = reverse_addr(options.reverse_zone)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   510
        domain = options.reverse_domain
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   511
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   512
        if not domain :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   513
            log.error("--reverse-zone requires --reverse-domain")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   514
            return 1
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   515
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   516
        zone = list(process_zone_reverse(zone, origin=origin, domain=domain))
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   517
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   518
    elif options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   519
        # we only did that, done
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   520
        return 0
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   521
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   522
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   523
        log.warn("Nothing to do")
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   524
        return 1
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   525
23
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   526
    write_zone_records(output, zone)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   527
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   528
    return 0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   529
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   530
if __name__ == '__main__':
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   531
    import sys
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   532
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   533
    sys.exit(main(sys.argv))