terom@321: #!/usr/bin/env python terom@321: terom@321: """ terom@321: Process dhcpd configs. terom@321: terom@321: Takes a conf file as input, and gives a conf file as output. terom@321: """ terom@321: terom@321: import pvl.args terom@321: import pvl.dhcp.config terom@321: terom@321: import os.path terom@321: import optparse terom@321: import logging; log = logging.getLogger('pvl.dhcp-conf') terom@321: terom@321: def apply_input (options, conf) : terom@321: """ terom@321: Parse (items, blocks) from given dhcp.conf path. terom@321: """ terom@321: terom@321: file = pvl.args.apply_file(conf, 'r') terom@321: return pvl.dhcp.config.DHCPConfigParser.load(file) terom@321: terom@321: def process_dhcp_items (options, block, items) : terom@321: """ terom@321: Yield items for output from given input items terom@321: """ terom@321: terom@321: for item in items : terom@321: name, args = item[0], item[1:] terom@321: terom@321: log.debug("%s: %s: %s", block, name, args) terom@321: terom@321: if name == 'include' : terom@321: include, = args terom@321: terom@321: if options.include_path : terom@321: include = os.path.join(options.include_path, include) terom@321: log.info("include: %s", include) terom@321: terom@321: yield 'include', '"{include}"'.format(include=include) terom@321: else : terom@321: yield item terom@321: terom@321: def process_dhcp_block (options, block, items, blocks) : terom@321: """ terom@321: Yield block for output for given input block. terom@321: """ terom@321: terom@321: log.debug("%s -> %s %s", block, items, blocks) terom@321: terom@321: items = list(process_dhcp_items(options, block, items)) terom@321: blocks = [process_dhcp_block(options, subblock, subitems, subblocks) for subblock, subitems, subblocks in blocks] terom@321: terom@321: log.debug("%s <- %s %s", block, items, blocks) terom@321: terom@321: return block, items, blocks terom@321: terom@321: def process_dhcp_conf (options, conf) : terom@321: """ terom@321: Yield (items, blocks) for output for given input (items, blocks). terom@321: """ terom@321: items, blocks = conf terom@321: terom@321: log.debug("-> %s %s", items, blocks) terom@321: terom@321: _, items, blocks = process_dhcp_block(options, None, items, blocks) terom@321: terom@321: log.debug("<- %s %s", items, blocks) terom@321: terom@321: return items, blocks terom@321: terom@321: def process_output (options, items, blocks) : terom@321: """ terom@321: Generate output lines from given (items, blocks). terom@321: """ terom@321: terom@321: for item in items : terom@321: yield '\t'.join(item) + ';' terom@321: terom@321: for block, subitems, subblocks in blocks : terom@321: yield ' '.join(block) + ' {' terom@321: for line in process_output(options, subitems, subblocks) : terom@321: yield '\t' + line terom@321: yield '}' terom@321: terom@321: def apply_output (options, conf) : terom@321: """ terom@321: Write output line for given (items, blocks) to --output-conf. terom@321: """ terom@321: terom@321: file = pvl.args.apply_file(options.output_conf, 'w') terom@321: terom@321: items, blocks = conf terom@321: terom@321: for line in process_output(options, items, blocks) : terom@321: print >>file, line terom@321: terom@321: def main (argv) : terom@321: parser = optparse.OptionParser(__doc__) terom@321: parser.add_option_group(pvl.args.parser(parser)) terom@321: terom@321: parser.add_option('--output-conf', metavar='FILE', terom@321: help="Output conf to file; default stdout") terom@321: parser.add_option('--include-path', metavar='PATH', terom@321: help="Adjust includes to use given path prefix") terom@321: terom@321: options, args = parser.parse_args(argv[1:]) terom@321: pvl.args.apply(options) terom@321: terom@321: for conf in args : terom@321: # input terom@321: conf = apply_input(options, conf) terom@321: terom@321: # process terom@321: conf = process_dhcp_conf(options, conf) terom@321: terom@321: # output terom@321: apply_output(options, conf) terom@321: terom@321: if __name__ == '__main__': terom@321: pvl.args.main(main)