bin/process-zone
author Tero Marttila <terom@paivola.fi>
Mon, 19 Mar 2012 16:50:28 +0200
changeset 35 840092ee4d97
parent 25 3d35d0eef197
child 80 b58236f9ea7b
permissions -rwxr-xr-x
process-zone: support $ORIGIN, $GENERATE for --reverse-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
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    88
    # 
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    89
    parser.add_option('--doctest',              action='store_true',
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    90
            help="Run module doctests")
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    91
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    # defaults
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    parser.set_defaults(
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    94
        loglevel            = logging.WARN,
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    95
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    96
        # XXX: combine
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    97
        check_exempt        = [],
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    98
        meta_ignore         = [],
0
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
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
    options, args = parser.parse_args(argv[1:])
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
    # configure
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    logging.basicConfig(
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   106
        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
   107
        level   = options.loglevel,
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    )
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
    return options, args
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   112
class ZoneError (Exception) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   113
    pass
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   114
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   115
class ZoneLineError (ZoneError) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   116
    """
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   117
        ZoneLine-related error
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   118
    """
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   119
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   120
    def __init__ (self, line, msg, *args, **kwargs) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   121
        super(ZoneLineError, self).__init__("%s: %s" % (line, msg.format(*args, **kwargs)))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   122
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
   123
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
   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
        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
   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
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    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
   129
    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
   130
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    # 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
   132
    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
   133
    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
   134
    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
   135
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   136
    # 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
   137
    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
   138
    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
   139
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    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
   141
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    @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
   143
    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
   144
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
            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
   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
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   149
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   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
        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
   153
            if ': ' not in line :
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   154
                raise ZoneError("%s:%d: Missing timestamp prefix: %s" % (file, lineno, line))
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
   155
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   156
            # 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
   157
            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
   158
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
            # 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
   160
            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
   161
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   162
            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
   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
        # 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
   165
        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
   166
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   167
        # 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
   168
        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
   169
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   170
        log.debug("  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
   171
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   172
        # 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
   173
        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
   174
            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
   175
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
            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
   177
            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
   178
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   179
        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
   180
            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
   181
            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
   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
        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
   184
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        # 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
   186
        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
   187
            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
   188
            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
   189
           
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   191
            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
   192
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   193
        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
   194
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        # 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
   196
        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
   197
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    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
   199
        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
   200
        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
   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
        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
   203
        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
   204
        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
   205
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   207
        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
   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
    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
   210
        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
   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
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
   213
    """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   214
        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
   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
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    # 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
   218
    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
   219
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   220
    # possible $ORIGIN context
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   221
    origin = None
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   222
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
   223
    # 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
   224
    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
   225
    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
   226
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    # 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
   228
    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
   229
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   230
    # 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
   231
    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
   232
    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
   233
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    @classmethod
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   235
    def parse (cls, line, parts=None, origin=None) :
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
   236
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
            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
   238
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   239
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   240
        if parts is None :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   241
            parts = list(line.parts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   242
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   243
        if not parts :
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
   244
            # 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
   245
            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
   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
        # 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
   248
        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
   249
            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
   250
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   252
            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
   253
        
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   254
        log.debug("  name=%r, origin=%r", name, origin)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   255
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   256
        if len(parts) < 2 :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   257
            raise ZoneLineError(line, "Too few parts to parse: {0!r}", line.data)
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
   258
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        # 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
   260
        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
   261
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   263
            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
   264
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   266
            _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
   267
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   268
        # 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
   269
        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
   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
        # 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
   272
        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
   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
        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
   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
        return cls(name, type, data,
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   277
            origin  = origin,
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
   278
            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
   279
            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
   280
            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
   281
        )
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   283
    def __init__ (self, name, type, data, origin=None, ttl=None, cls=None, line=None, comment=None) :
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
   284
        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
   285
        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
   286
        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
   287
        
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   289
        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
   290
        
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   291
        self.origin = origin
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
   292
        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
   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
        # 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
   295
        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
   296
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   297
    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
   298
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   299
            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
   300
        """
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   301
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord classes for handling zone line data; implement --input-line-date for parsing `hg blame` output
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   302
        # 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
   303
        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
   304
            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
   305
        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
   306
            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
   307
            
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
        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
   309
                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
   310
                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
   311
                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
   312
                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
   313
                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
   314
                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
   315
        )
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
91c073d5615a process-zone: refactor to use ZoneLine/ZoneRecord 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
    def __str__ (self) :
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   318
        return ' '.join((self.name or '', self.type, ' '.join(self.data)))
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
24
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   320
class TXTRecord (ZoneRecord) :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   321
    """
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   322
        TXT record.
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   323
    """
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   324
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   325
    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
   326
        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
   327
            [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
   328
            **opts
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   329
        )
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   330
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   331
class OffsetValue (object) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   332
    def __init__ (self, value) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   333
        self.value = value
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   334
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   335
    def __getitem__ (self, offset) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   336
        value = self.value + offset
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   337
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   338
        #log.debug("OffsetValue: %d[%d] -> %d", self.value, offset, value)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   339
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   340
        return value
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   341
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   342
def parse_generate_field (line, field) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
    """
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   344
        Parse a $GENERATE lhs/rhs field:
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   345
            $
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   346
            ${<offset>[,<width>[,<base>]]}
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   347
            \$
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   348
            $$
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   350
        Returns a wrapper that builds the field-value when called with the index.
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   351
        
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   352
        >>> parse_generate_field(None, "foo")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   353
        'foo'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   354
        >>> parse_generate_field(None, "foo-$")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   355
        'foo-1'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   356
        >>> parse_generate_field(None, "foo-$$")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   357
        'foo-$'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   358
        >>> parse_generate_field(None, "\$")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   359
        '$'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   360
        >>> parse_generate_field(None, "10.0.0.${100}")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   361
        '10.0.0.101'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   362
        >>> parse_generate_field(None, "foo-${0,2,d}")(1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   363
        'foo-01'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   364
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   365
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   367
    input = field
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   368
    expr = []
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   370
    while '$' in field :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   371
        # defaults
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   372
        offset = 0
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   373
        width = 0
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   374
        base = 'd'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   375
        escape = False
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   376
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   377
        # different forms
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   378
        if '${' in field :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   379
            pre, body = field.split('${', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   380
            body, post = body.split('}', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   381
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   382
            # parse body
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   383
            parts = body.split(',')
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   384
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   385
            # offset
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   386
            offset = int(parts.pop(0))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   387
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   388
            # width
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   389
            if parts :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   390
                width = int(parts.pop(0))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   391
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   392
            # base
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   393
            if parts :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   394
                base = parts.pop(0)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   395
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   396
            if parts:
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   397
                # fail
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   398
                raise ZoneLineError(line, "extra data in ${...} body: {0!r}", parts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   399
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   400
        elif '$$' in field :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   401
            pre, post = field.split('$$', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   402
            escape = True
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   403
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   404
        elif '\\$' in field :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   405
            pre, post = field.split('\\$', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   406
            escape = True
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   407
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   408
        else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   409
            pre, post = field.split('$', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   410
        
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   411
        expr.append(pre)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   412
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   413
        if escape :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   414
            expr.append('$')
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   415
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   416
        else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   417
            # meta-format
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   418
            fmt = '{value[%d]:0%d%s}' % (offset, width, base)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   419
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   420
            log.debug("field=%r -> pre=%r, fmt=%r, post=%r", field, expr, fmt, post)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   421
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   422
            expr.append(fmt)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   423
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   424
        field = post
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   425
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   426
    # final
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   427
    if field :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   428
        expr.append(field)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   429
    
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   430
    # combine
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   431
    expr = ''.join(expr)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   432
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   433
    log.debug("%s: %s", input, expr)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   434
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   435
    # processed
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   436
    def value_func (value) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   437
        # magic wrapper to implement offsets
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   438
        return expr.format(value=OffsetValue(value))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   439
    
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   440
    return value_func
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   441
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   442
def process_generate (line, origin, parts) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   443
    """
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   444
        Process a 
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   445
            $GENERATE <start>-<stop>[/<step>] lhs [ttl] [class] type rhs [comment]
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   446
        directive into a series of ZoneResource's.
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   447
    """
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   448
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   449
    range = parts.pop(0)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   450
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   451
    # parse range
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   452
    if '/' in range :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   453
        range, step = range.split('/')
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   454
        step = int(step)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   455
    else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   456
        step = 1
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   457
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   458
    start, stop = range.split('-')
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   459
    start = int(start)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   460
    stop = int(stop)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   461
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   462
    log.debug("  range: start=%r, stop=%r, step=%r", start, stop, step)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   463
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   464
    # inclusive
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   465
    range = xrange(start, stop + 1, step)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   466
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   467
    lhs_func = parse_generate_field(line, parts.pop(0))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   468
    rhs_func = parse_generate_field(line, parts.pop(-1))
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   469
    body = parts
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   470
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   471
    for i in range :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   472
        # build
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   473
        parts = [lhs_func(i)] + body + [rhs_func(i)]
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   474
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   475
        log.debug(" %03d: %r", i, parts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   476
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   477
        # parse
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   478
        yield ZoneRecord.parse(line, parts=parts, origin=origin)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   479
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   480
def parse_zone_records (file, origin=None, **opts) :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   481
    """
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
   482
        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
   483
    """
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   484
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   485
    ttl = None
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   486
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   487
    skip_multiline = False
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   488
    
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   489
    for lineno, raw_line in enumerate(file) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   490
        # parse comment
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   491
        if ';' in raw_line :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   492
            line, comment = raw_line.split(';', 1)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   493
        else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   494
            line = raw_line
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   495
            comment = None
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   496
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   497
        # XXX: handle multi-line statements...
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   498
        # start
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   499
        if '(' in line :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   500
            skip_multiline = True
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   501
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   502
            log.warn("%s:%d: Start of multi-line statement: %s", file.name, lineno, raw_line)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   503
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   504
        # end?
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   505
        if ')' in line :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   506
            skip_multiline = False
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   507
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   508
            log.warn("%s:%d: End of multi-line statement: %s", file.name, lineno, raw_line)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   509
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   510
            continue
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   511
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   512
        elif skip_multiline :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   513
            log.warn("%s:%d: Multi-line statement: %s", file.name, lineno, raw_line)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   514
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   515
            continue
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   516
        
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   517
        # parse
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   518
        line = ZoneLine.parse(file.name, lineno, raw_line, **opts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   519
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   520
        if not line.data :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   521
            log.debug("%s: skip empty line: %s", line, raw_line)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   522
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   523
            continue
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   524
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   525
        elif line.data.startswith('$') :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   526
            # control record
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   527
            type = line.parts[0]
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   528
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   529
            if type == '$ORIGIN':
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   530
                # update
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   531
                origin = line.parts[1]
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   532
                
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   533
                log.info("%s: origin: %s", line, origin)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   534
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   535
            elif type == '$GENERATE':
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   536
                # process...
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   537
                log.info("%s: generate: %s", line, line.parts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   538
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   539
                for record in process_generate(line, origin, line.parts[1:]) :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   540
                    yield record
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   541
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   542
            else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   543
                log.warning("%s: skip control record: %s", line, line.data)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   544
            
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   545
            # XXX: passthrough!
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   546
            continue
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   547
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   548
        # normal record?
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   549
        record = ZoneRecord.parse(line, origin=origin)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   550
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
   551
        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
   552
            yield record
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   553
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   554
        else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   555
            # unknown
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   556
            log.warning("%s: skip unknown line: %s", line, line.data)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   557
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   558
def check_zone_hosts (zone, whitelist=None, whitelist_types=set(['TXT'])) :
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   559
    """
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   560
        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
   561
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   562
        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
   563
    """
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   564
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   565
    by_name = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   566
    by_ip = {}
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   567
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   568
    fail = None
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   569
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   570
    last_name = None
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   571
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
   572
    for r in zone :
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   573
        name = r.name or last_name
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   574
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   575
        name = (r.origin, name)
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   576
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   577
        # name
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   578
        if r.type not in whitelist_types :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   579
            if name not in by_name :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   580
                by_name[name] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   581
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   582
            elif r.name in whitelist :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   583
                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
   584
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   585
            else :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   586
                # fail!
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   587
                log.warn("%s: Duplicate name: %s <-> %s", r.line, r, by_name[name])
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   588
                fail = True
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   589
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   590
        # 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
   591
        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
   592
            ip, = r.data
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   593
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   594
            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
   595
                by_ip[ip] = r
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   596
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   597
            else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   598
                # 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
   599
                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
   600
                fail = True
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   601
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   602
    return fail
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   603
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   604
def process_zone_forwards (zone, txt=False, mx=False) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   605
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   606
        Process zone data -> forward zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   607
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   608
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
   609
    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
   610
        yield r
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   611
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
   612
        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
   613
            if txt :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   614
                # comment?
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   615
                comment = r.line.comment
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   616
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   617
                if comment :
4ccc31fdc047 process-zone: generate TXT records for ZoneLine.timestamp, if available
Tero Marttila <terom@paivola.fi>
parents: 23
diff changeset
   618
                    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
   619
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   620
           
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   621
            # XXX: RP, do we need it?
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   622
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   623
            if mx :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   624
                # 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
   625
                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
   626
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   627
def process_zone_meta (zone, ignore=None) :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   628
    """
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   629
        Process zone metadata -> output.
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   630
    """
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   631
    
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   632
    TIMESTAMP_FORMAT='%Y/%m/%d'
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   633
    
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   634
    for r in zone :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   635
        if ignore and r.name in ignore :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   636
            # skip
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   637
            log.debug("Ignore record: %s", r)
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   638
            continue
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   639
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   640
        # for hosts..
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   641
        if r.type == 'A' :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   642
            # timestamp?
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   643
            timestamp = r.line.timestamp
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   644
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   645
            if timestamp :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   646
                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
   647
     
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   648
def reverse_addr (ip) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   649
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   650
        Return in-addr.arpa reverse for given IPv4 IP.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   651
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   652
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   653
    # parse
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   654
    octets = tuple(int(part) for part in ip.split('.'))
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   655
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   656
    for octet in octets :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   657
        assert 0 <= octet <= 255
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   658
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   659
    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
   660
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   661
def fqdn (*parts) :
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   662
    fqdn = '.'.join(parts)
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   663
    
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   664
    # we may be given an fqdn in parts
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   665
    if not fqdn.endswith('.') :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   666
        fqdn += '.'
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   667
    
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   668
    return fqdn
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   669
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   670
def process_zone_reverse (zone, origin, domain) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   671
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   672
        Process zone data -> reverse zone data.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   673
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   674
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
   675
    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
   676
        if r.type != 'A' :
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   677
            continue
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   678
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
   679
        ip, = r.data
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   680
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   681
        # generate reverse-addr
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   682
        reverse = reverse_addr(ip)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   683
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   684
        # verify
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   685
        if zone and reverse.endswith(origin) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   686
            reverse = reverse[:-(len(origin) + 1)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   687
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   688
        else :
4
3a2221124592 process-zone: fix parts handling; default to logging.WARN, cleanup
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   689
            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
   690
            continue
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   691
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   692
        # domain to use
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   693
        host_domain = r.origin or domain
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   694
        host_fqdn = fqdn(r.name, host_domain)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   695
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
   696
        yield ZoneRecord(reverse, 'PTR', [host_fqdn])
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   697
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
   698
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
   699
    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
   700
        file.write(r.build_line() + u'\n')
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   701
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   702
def open_file (path, mode, charset) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   703
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   704
        Open unicode-enabled file from path, with - using stdio.
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   705
    """
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   706
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   707
    if path == '-' :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   708
        # use stdin/out based on mode
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   709
        stream, func = {
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   710
            'r':    (sys.stdin, codecs.getreader),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   711
            'w':    (sys.stdout, codecs.getwriter),
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   712
        }[mode[0]]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   713
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   714
        # wrap
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   715
        return func(charset)(stream)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   716
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   717
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   718
        # open
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   719
        return codecs.open(path, mode, charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   720
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   721
def main (argv) :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   722
    global options
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   723
    
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   724
    options, args = parse_options(argv)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   725
35
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   726
    if options.doctest :
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   727
        import doctest
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   728
        fail, total = doctest.testmod()
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   729
        return fail
840092ee4d97 process-zone: support $ORIGIN, $GENERATE for --reverse-zone
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   730
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   731
    if args :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   732
        # open files
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   733
        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
   734
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   735
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   736
        # default to stdout
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   737
        input_files = [open_file('-', 'r', options.input_charset)]
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   738
   
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   739
    # process zone data
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   740
    zone = []
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   741
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   742
    for file in input_files :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   743
        log.info("Reading zone: %s", file)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   744
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
   745
        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
   746
            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
   747
        ))
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   748
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   749
    # check?
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   750
    if options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   751
        whitelist = set(options.check_exempt)
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   752
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   753
        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
   754
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   755
        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
   756
            log.warn("Hosts check failed")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   757
            return 2
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   758
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   759
        else :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   760
            log.info("Hosts check OK")
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   761
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   762
    # output file
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   763
    output = open_file(options.output, 'w', options.output_charset)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   764
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   765
    if options.forward_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   766
        log.info("Write forward zone: %s", output)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   767
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   768
        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
   769
25
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   770
    elif options.meta_zone :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   771
        log.info("Write metadata zone: %s", output)
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   772
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   773
        if not options.input_line_date :
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   774
            log.error("--meta-zone requires --input-line-date")
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   775
            return 1
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   776
3d35d0eef197 process-zone: implement --meta-zone
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   777
        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
   778
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   779
    elif options.reverse_zone :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   780
        origin = reverse_addr(options.reverse_zone)
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   781
        domain = options.reverse_domain
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   782
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   783
        if not domain :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   784
            log.error("--reverse-zone requires --reverse-domain")
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   785
            return 1
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   786
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   787
        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
   788
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   789
    elif options.check_hosts :
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   790
        # we only did that, done
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   791
        return 0
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   792
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   793
    else :
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   794
        log.warn("Nothing to do")
12
bddc9a060a73 process-zone: implement --check-hosts; fix logging processName
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   795
        return 1
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   796
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
   797
    write_zone_records(output, zone)
0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   798
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   799
    return 0
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   800
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   801
if __name__ == '__main__':
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   802
    import sys
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   803
f0ac5a96fb19 process-zone: forward/reverse zonefile operations
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   804
    sys.exit(main(sys.argv))