bin/process-zone
author Tero Marttila <terom@paivola.fi>
Mon, 19 Mar 2012 11:40:06 +0200
changeset 25 3d35d0eef197
parent 24 4ccc31fdc047
child 35 840092ee4d97
permissions -rwxr-xr-x
process-zone: implement --meta-zone
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
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    54
    # check stage
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    55
    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
    56
            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
    57
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    58
    parser.add_option('--check-exempt',         metavar='HOST', action='append',
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    59
            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
    60
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    61
    # meta stage
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    62
    parser.add_option('--meta-zone',            action='store_true',
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    63
            help="Generate host metadata zone; requires --input-line-date")
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    64
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    65
    parser.add_option('--meta-ignore',          metavar='HOST', action='append',
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    66
            help="Ignore given hostnames in metadata output")
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    67
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    68
    parser.add_option('--input-line-date',      action='store_true',
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    69
            help="Parse timestamp prefix from each input line (e.g. `hg blame | ...`)")
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    70
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    71
    # forward stage
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    parser.add_option('--forward-zone',         action='store_true', 
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
            help="Generate forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
    parser.add_option('--forward-txt',          action='store_true',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
            help="Generate TXT records for forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    parser.add_option('--forward-mx',           metavar='MX',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
            help="Generate MX records for forward zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    81
    # reverse stage
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    parser.add_option('--reverse-domain',       metavar='DOMAIN',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
            help="Domain to use for hosts in reverse zone")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    parser.add_option('--reverse-zone',         metavar='NET',
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            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
    87
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    # defaults
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    parser.set_defaults(
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    90
        loglevel            = logging.WARN,
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    91
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    92
        # XXX: combine
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    93
        check_exempt        = [],
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    94
        meta_ignore         = [],
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    )
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
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    options, args = parser.parse_args(argv[1:])
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    # configure
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    logging.basicConfig(
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   102
        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
   103
        level   = options.loglevel,
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
    )
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    return options, args
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
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
   108
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
   109
    """
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
        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
   111
    """
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
    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
   114
    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
   115
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
    # 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
   117
    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
   118
    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
   119
    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
   120
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
    # 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
   122
    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
   123
    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
   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
    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
   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
    @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
   128
    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
   129
        """
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
            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
   131
        """
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
        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
   134
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
        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
   136
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
        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
   138
            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
   139
                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
   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
            # 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
   142
            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
   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
            # 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
   145
            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
   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("  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
   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
        # 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
   150
        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
   151
        
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
        # 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
   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
        
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
        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
   156
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
        # 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
   158
        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
   159
            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
   160
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
            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
   162
            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
   163
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
        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
   165
            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
   166
            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
   167
        
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
        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
   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
        # 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
   171
        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
   172
            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
   173
            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
   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
        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
   176
            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
   177
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
        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
   179
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
        # 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
   181
        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
   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
    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
   184
        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
   185
        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
   186
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
        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
   188
        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
   189
        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
   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
        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
   192
        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
   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
    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
   195
        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
   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
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
   198
    """
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
        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
   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
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
    # 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
   203
    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
   204
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
    # 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
   206
    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
   207
    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
   208
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
    # 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
   210
    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
   211
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
    # 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
   213
    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
   214
    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
   215
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
    @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
   217
    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
   218
        """
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
            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
   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
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 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
   223
            # 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
   224
            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
   225
        
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
        # 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
   227
        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
   228
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
        # 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
   230
        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
   231
            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
   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
        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
   234
            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
   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
        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
   237
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
        # 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
   239
        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
   240
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
        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
   242
            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
   243
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
        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
   245
            _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
   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
        # 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
   248
        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
   249
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
        # 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
   251
        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
   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
        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
   254
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
        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
   256
            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
   257
            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
   258
            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
   259
        )
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
    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
   262
        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
   263
        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
   264
        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
   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
        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
   267
        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
   268
        
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
        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
   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: 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
   272
        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
   273
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
    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
   275
        """
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
            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
   277
        """
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
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
        # 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
   280
        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
   281
            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
   282
        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
   283
            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
        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
   286
                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
   287
                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
   288
                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
   289
                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
   290
                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
   291
                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
   292
        )
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
   293
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
   294
    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
   295
        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
   296
24
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   297
class TXTRecord (ZoneRecord) :
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
        TXT record.
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   300
    """
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   301
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   302
    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
   303
        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
   304
            [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
   305
            **opts
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   306
        )
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   307
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
   308
def parse_record (path, lineno, line, **opts) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
        Parse (name, ttl, type, data, comment) from bind zonefile.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
        Returns None for empty/comment lines.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
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
   315
    # 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
   316
    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
   317
    record = ZoneRecord.parse(line)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
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
   319
    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
   320
        return record
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
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
def parse_zone_records (file, **opts) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
    """
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
   324
        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
   325
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
    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
   328
        record = parse_record(file.name, lineno, line, **opts)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
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
   330
        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
   331
            yield record
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   333
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
   334
    """
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   335
        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
   336
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   337
        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
   338
    """
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
    by_name = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   341
    by_ip = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   342
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   343
    fail = None
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   344
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
   345
    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
   346
        name = r.name
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   347
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   348
        # name
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   349
        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
   350
            by_name[name] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   351
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
   352
        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
   353
            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
   354
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   355
        else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   356
            # 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
   357
            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
   358
            fail = True
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   359
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   360
        # 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
   361
        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
   362
            ip, = r.data
12
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
            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
   365
                by_ip[ip] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   366
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   367
            else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   368
                # 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
   369
                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
   370
                fail = True
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   371
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   372
    return fail
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   373
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   374
def process_zone_forwards (zone, txt=False, mx=False) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   376
        Process zone data -> forward zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   377
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   378
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
   379
    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
   380
        yield r
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   381
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
   382
        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
   383
            if txt :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   384
                # comment?
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   385
                comment = r.line.comment
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 comment :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   388
                    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
   389
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   390
           
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   391
            # XXX: RP, do we need it?
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   392
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   393
            if mx :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   394
                # 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
   395
                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
   396
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   397
def process_zone_meta (zone, ignore=None) :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   398
    """
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   399
        Process zone metadata -> output.
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   400
    """
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   401
    
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   402
    TIMESTAMP_FORMAT='%Y/%m/%d'
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   403
    
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   404
    for r in zone :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   405
        if ignore and r.name in ignore :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   406
            # skip
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   407
            log.debug("Ignore record: %s", r)
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   408
            continue
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   409
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   410
        # for hosts..
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   411
        if r.type == 'A' :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   412
            # timestamp?
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   413
            timestamp = r.line.timestamp
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   414
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   415
            if timestamp :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   416
                yield TXTRecord(r.name, timestamp.strftime(TIMESTAMP_FORMAT), ttl=r.ttl)
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   417
     
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   418
def reverse_addr (ip) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   419
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   420
        Return in-addr.arpa reverse for given IPv4 IP.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   421
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   422
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   423
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   424
    octets = tuple(int(part) for part in ip.split('.'))
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   425
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   426
    for octet in octets :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   427
        assert 0 <= octet <= 255
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   428
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   429
    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
   430
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   431
def fqdn (*parts) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   432
    return '.'.join(parts) + '.'
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   433
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
def process_zone_reverse (zone, origin, domain) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   436
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   437
        Process zone data -> reverse zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   438
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   439
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
   440
    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
   441
        if r.type != 'A' :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   442
            continue
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   443
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
   444
        ip, = r.data
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   445
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   446
        # generate reverse-addr
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   447
        reverse = reverse_addr(ip)
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
        # verify
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   450
        if zone and reverse.endswith(origin) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   451
            reverse = reverse[:-(len(origin) + 1)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   452
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   453
        else :
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   454
            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
   455
            continue
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
        # domain to use
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   458
        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
   459
        host_fqdn = fqdn(r.name, domain)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   460
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
   461
        yield ZoneRecord(reverse, 'PTR', [host_fqdn])
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   462
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
   463
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
   464
    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
   465
        file.write(r.build_line() + u'\n')
0
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
def open_file (path, mode, charset) :
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
        Open unicode-enabled file from path, with - using stdio.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   470
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   471
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   472
    if path == '-' :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   473
        # use stdin/out based on mode
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   474
        stream, func = {
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   475
            'r':    (sys.stdin, codecs.getreader),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   476
            'w':    (sys.stdout, codecs.getwriter),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   477
        }[mode[0]]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   478
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   479
        # wrap
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   480
        return func(charset)(stream)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   481
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   482
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   483
        # open
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   484
        return codecs.open(path, mode, charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   485
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   486
def main (argv) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   487
    global options
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   488
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   489
    options, args = parse_options(argv)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   490
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   491
    if args :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   492
        # open files
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   493
        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
   494
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   495
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   496
        # default to stdout
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   497
        input_files = [open_file('-', 'r', options.input_charset)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   498
   
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   499
    # process zone data
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   500
    zone = []
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   501
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   502
    for file in input_files :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   503
        log.info("Reading zone: %s", file)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   504
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
   505
        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
   506
            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
   507
        ))
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   508
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   509
    # check?
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   510
    if options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   511
        whitelist = set(options.check_exempt)
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   512
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   513
        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
   514
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   515
        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
   516
            log.warn("Hosts check failed")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   517
            return 2
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   518
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   519
        else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   520
            log.info("Hosts check OK")
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
    # output file
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   523
    output = open_file(options.output, 'w', options.output_charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   524
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   525
    if options.forward_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   526
        log.info("Write forward zone: %s", output)
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
        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
   529
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   530
    elif options.meta_zone :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   531
        log.info("Write metadata zone: %s", output)
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   532
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   533
        if not options.input_line_date :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   534
            log.error("--meta-zone requires --input-line-date")
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   535
            return 1
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   536
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   537
        zone = list(process_zone_meta(zone, ignore=set(options.meta_ignore)))
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   538
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   539
    elif options.reverse_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   540
        origin = reverse_addr(options.reverse_zone)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   541
        domain = options.reverse_domain
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   542
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   543
        if not domain :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   544
            log.error("--reverse-zone requires --reverse-domain")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   545
            return 1
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   546
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   547
        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
   548
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   549
    elif options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   550
        # we only did that, done
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   551
        return 0
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   552
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   553
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   554
        log.warn("Nothing to do")
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   555
        return 1
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   556
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
   557
    write_zone_records(output, zone)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   558
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   559
    return 0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   560
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   561
if __name__ == '__main__':
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   562
    import sys
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   563
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   564
    sys.exit(main(sys.argv))