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@667: import logging; log = logging.getLogger('pvl.dhcp-conf') terom@667: import optparse terom@667: import os.path terom@321: import pvl.args terom@321: import pvl.dhcp.config terom@321: terom@667: def process_dhcp_items (block, items, terom@667: include_path = None, terom@667: ): terom@667: """ terom@667: Yield items for output from given input items. terom@321: terom@667: include_path - rewrite includes to be relative to given path. terom@321: """ terom@321: terom@667: 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@667: if name == 'include': terom@321: include, = args terom@321: terom@667: if include_path: terom@667: include = os.path.join(include_path, include) terom@321: terom@667: log.info("%s: include: %s", block, include) terom@376: terom@667: yield 'include', include terom@376: terom@667: else: terom@321: yield item terom@321: terom@667: def process_dhcp_block (block, **opts): terom@321: """ terom@667: Return Block for output from given input Block. terom@321: """ terom@321: terom@667: log.debug("%s <- %s %s", block, block.items, block.blocks) terom@321: terom@667: block = pvl.dhcp.config.Block(block.key, terom@667: items = list(process_dhcp_items(block, block.items, **opts)), terom@667: blocks = [process_dhcp_block(subblock, **opts) for subblock in block.blocks] terom@667: ) terom@321: terom@667: log.debug("%s -> %s %s", block, block.items, block.blocks) terom@667: terom@667: return block terom@321: terom@667: 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('--include-path', metavar='PATH', terom@321: help="Adjust includes to use given path prefix") terom@321: terom@667: options, args = pvl.args.parse(parser, argv) terom@667: terom@667: for file in pvl.args.apply_files(args): terom@667: try: terom@667: conf = pvl.dhcp.config.DHCPConfigParser.load(file) terom@667: except pvl.dhcp.config.DHCPConfigError as error: terom@667: log.error("%s", error) terom@667: return 3 terom@321: terom@321: # process terom@667: conf = process_dhcp_block(conf, terom@667: include_path = options.include_path, terom@667: ) terom@321: terom@321: # output terom@667: for line in pvl.dhcp.config.build_block(conf): terom@667: print line terom@667: terom@667: return 0 terom@321: terom@321: if __name__ == '__main__': terom@321: pvl.args.main(main)