#!/usr/bin/python # Author: Joshua Brindle # # Copyright (C) 2003 - 2005 Tresys Technology, LLC # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 2. """ this does dstuff """ import sys import getopt import pyplate from xml.dom.ext import * from xml.dom.ext.reader import Sax2 def read_policy_xml(filename): try: reader = Sax2.Reader() doc = reader.fromStream(filename) except: error("Error while parsing xml") return doc def gen_tunable_conf(doc, file): for node in doc.getElementsByTagName("tunable"): s = string.split(node.firstChild.data, "\n") for line in s: file.write("# %s\n" % line) tun_name = tun_val = None for (name, value) in node.attributes.items(): if name[1] == "name": tun_name = value.value elif name[1] == "dftval": tun_val = value.value if tun_name and tun_val: file.write("%s = %s\n\n" % (tun_name, tun_val)) tun_name = tun_val = None def gen_module_conf(doc, file): for node in doc.getElementsByTagName("module"): for desc in node.getElementsByTagName("summary"): s = string.split(desc.firstChild.data, "\n") for line in s: file.write("# %s\n" % line) file.write("#\n") for (name, value) in node.attributes.items(): if name[1] == "name": file.write("# %s\n\n" % value.value) def gen_docs(doc, file): try: bodyfile = open("templates/header.html", "r") intfile = open("templates/interface.html", "r") except: error("Could not open templates") interface_buf = None interface_parameters = {} for node in doc.getElementsByTagName("module"): for interface in node.getElementsByTagName("interface"): interface_tpl = pyplate.Template(intfile.read()) for i,v in interface.attributes.items(): interface_name = v for desc in interface.getElementsByTagName("description"): interface_desc = desc.firstChild.data for desc in interface.getElementsByTagName("securitydesc"): if desc: interface_secdesc = desc.firstChild.data else: interface_secdesc = None for args in interface.getElementsByTagName("parameter"): paramdesc = args.firstChild.data for i,v in interface.attributes.items(): arg = { "name" : v, "desc" : paramdesc } def error(error): sys.stderr.write("%s exiting for: " % sys.argv[0]) sys.stderr.write("%s\n" % error) sys.stderr.flush() sys.exit(1) def usage(): sys.stdout.write("%s [-tmd] -x \n\n" % sys.argv[0]) sys.stdout.write("Options:\n") sys.stdout.write("-t --tunables -- write tunable config to \n") sys.stdout.write("-m --modules -- write module config to \n") sys.stdout.write("-d --docs -- write interface documentation to \n") sys.stdout.write("-x --xml -- filename to read xml data from\n") try: opts, args = getopt.getopt(sys.argv[1:], "t:m:d:x:", ["tunables","modules","docs","xml"]) except getopt.GetoptError: usage() sys.exit(1) tunables = modules = docs = xmlfile = None for opt, val in opts: if opt in ("-t", "--tunables"): tunables = val if opt in ("-m", "--modules"): modules = val if opt in ("-d", "--docs"): docs = val if opt in ("-x", "--xml"): xmlfile = val if xmlfile == None: usage() sys.exit(1) doc = read_policy_xml(xmlfile) if tunables: try: conf = open(tunables, 'w') except: error("Could not open tunables file for writing") gen_tunable_conf(doc, conf) conf.close() if modules: try: conf = open(modules, 'w') except: error("Could not open modules file for writing") gen_module_conf(doc, conf) conf.close() if docs: gen_docs(doc, sys.stdout)