bin/pvl.dhcp-conf
author Tero Marttila <terom@paivola.fi>
Sat, 21 Dec 2013 22:57:44 +0200
changeset 329 b3778c190aa5
parent 321 e931ff718ead
child 376 31d9ae0c1dab
permissions -rwxr-xr-x
version 0..0:

pvl.rrd: api.report()
pvl.wlan-syslog: track openwrt hostapd syslog wlan sta activity
pvl.verkko.wlan: basic Table view
pvl.dns-serial
pvl.dns-zone
pvl.dhcp.config: nested blocks
pvl.hosts-import: import hosts from dns/dhcp
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235
pvl.hosts-dhcp: generate dhcp hosts conf
321
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Process dhcpd configs.
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    Takes a conf file as input, and gives a conf file as output.
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
"""
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pvl.args
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import pvl.dhcp.config
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import os.path
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import optparse
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
import logging; log = logging.getLogger('pvl.dhcp-conf')
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
def apply_input (options, conf) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        Parse (items, blocks) from given dhcp.conf path.
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    file = pvl.args.apply_file(conf, 'r')
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    return pvl.dhcp.config.DHCPConfigParser.load(file)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
def process_dhcp_items (options, block, items) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        Yield items for output from given input items
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    for item in items :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        name, args = item[0], item[1:]
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        log.debug("%s: %s: %s", block, name, args)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        if name == 'include' :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            include, = args
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            if options.include_path :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
                include = os.path.join(options.include_path, include)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
                log.info("include: %s", include)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
            yield 'include', '"{include}"'.format(include=include)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        else :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
            yield item
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
def process_dhcp_block (options, block, items, blocks) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        Yield block for output for given input block.
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    log.debug("%s -> %s %s", block, items, blocks)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    items = list(process_dhcp_items(options, block, items))
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    blocks = [process_dhcp_block(options, subblock, subitems, subblocks) for subblock, subitems, subblocks in blocks]
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    log.debug("%s <- %s %s", block, items, blocks)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
    
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    return block, items, blocks
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
def process_dhcp_conf (options, conf) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        Yield (items, blocks) for output for given input (items, blocks).
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    items, blocks = conf
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    log.debug("-> %s %s", items, blocks)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    _, items, blocks = process_dhcp_block(options, None, items, blocks)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    log.debug("<- %s %s", items, blocks)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    return items, blocks
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
def process_output (options, items, blocks) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        Generate output lines from given (items, blocks).
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    for item in items :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        yield '\t'.join(item) + ';'
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    for block, subitems, subblocks in blocks :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        yield ' '.join(block) + ' {'
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        for line in process_output(options, subitems, subblocks) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
            yield '\t' + line
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        yield '}'
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
def apply_output (options, conf) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        Write output line for given (items, blocks) to --output-conf.
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    """
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    file = pvl.args.apply_file(options.output_conf, 'w')
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
    items, blocks = conf
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    for line in process_output(options, items, blocks) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        print >>file, line
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
def main (argv) :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    parser = optparse.OptionParser(__doc__)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    parser.add_option_group(pvl.args.parser(parser))
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
    parser.add_option('--output-conf',          metavar='FILE',
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            help="Output conf to file; default stdout")
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    parser.add_option('--include-path',         metavar='PATH',
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
            help="Adjust includes to use given path prefix")
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    options, args = parser.parse_args(argv[1:])
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
    pvl.args.apply(options)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
    for conf in args :
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
        # input
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        conf = apply_input(options, conf)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        # process
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        conf = process_dhcp_conf(options, conf)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        # output
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        apply_output(options, conf)
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
if __name__ == '__main__':
e931ff718ead pvl.dhcp-conf: simplistic --include-path processing for dhcp.conf files
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
    pvl.args.main(main)