Chris PeBenito 17de1b7
#!/usr/bin/python
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#  Author: Joshua Brindle <jbrindle@tresys.com>
Chris PeBenito 56e1b3d
#          Caleb Case <ccase@tresys.com>
Chris PeBenito 17de1b7
#
Chris PeBenito 17de1b7
# Copyright (C) 2005 - 2006 Tresys Technology, LLC
Chris PeBenito 17de1b7
#      This program is free software; you can redistribute it and/or modify
Chris PeBenito 17de1b7
#      it under the terms of the GNU General Public License as published by
Chris PeBenito 17de1b7
#      the Free Software Foundation, version 2.
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
"""
Chris PeBenito 17de1b7
	This module generates configuration files and documentation from the 
Chris PeBenito 17de1b7
	SELinux reference policy XML format. 
Chris PeBenito 17de1b7
"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
import sys
Chris PeBenito 17de1b7
import getopt
Chris PeBenito 17de1b7
import pyplate
Chris PeBenito 17de1b7
import os
Chris PeBenito 17de1b7
import string
Chris PeBenito 17de1b7
from xml.dom.minidom import parse, parseString
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#modules enabled and disabled values
Chris PeBenito 17de1b7
MOD_BASE = "base"
Chris PeBenito 17de1b7
MOD_ENABLED = "module"
Chris PeBenito 17de1b7
MOD_DISABLED = "off"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#booleans enabled and disabled values
Chris PeBenito 17de1b7
BOOL_ENABLED = "true"
Chris PeBenito 17de1b7
BOOL_DISABLED = "false"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#tunables enabled and disabled values
Chris PeBenito 17de1b7
TUN_ENABLED = "true"
Chris PeBenito 17de1b7
TUN_DISABLED = "false"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def read_policy_xml(filename):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Takes in XML from a file and returns a parsed file.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		xml_fh = open(filename)
Chris PeBenito 17de1b7
	except:
Chris PeBenito 17de1b7
		error("error opening " + filename)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		doc = parseString(xml_fh.read())
Chris PeBenito 17de1b7
	except: 
Chris PeBenito 17de1b7
		xml_fh.close()
Chris PeBenito 17de1b7
		error("Error while parsing xml")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	xml_fh.close()	
Chris PeBenito 17de1b7
	return doc
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def gen_booleans_conf(doc, file_name, namevalue_list):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Generates the booleans configuration file using the XML provided and the
Chris PeBenito 17de1b7
	previous booleans configuration.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	for node in doc.getElementsByTagName("bool"):
Chris PeBenito 17de1b7
		for desc in node.getElementsByTagName("desc"):
Chris PeBenito 17de1b7
			bool_desc = format_txt_desc(desc)
Chris PeBenito 17de1b7
		s = string.split(bool_desc, "\n")
Chris PeBenito 17de1b7
		file_name.write("#\n")
Chris PeBenito 17de1b7
		for line in s:
Chris PeBenito 17de1b7
			file_name.write("# %s\n" % line)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		bool_name = bool_val = None
Chris PeBenito 17de1b7
		for (name, value) in node.attributes.items():
Chris PeBenito 17de1b7
			if name == "name":
Chris PeBenito 17de1b7
				bool_name = value
Chris PeBenito 17de1b7
			elif name == "dftval":
Chris PeBenito 17de1b7
				bool_val = value
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			if [bool_name,BOOL_ENABLED] in namevalue_list:
Chris PeBenito 17de1b7
				bool_val = BOOL_ENABLED
Chris PeBenito 17de1b7
			elif [bool_name,BOOL_DISABLED] in namevalue_list:
Chris PeBenito 17de1b7
				bool_val = BOOL_DISABLED
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			if bool_name and bool_val:
Chris PeBenito 17de1b7
	            		file_name.write("%s = %s\n\n" % (bool_name, bool_val))
Chris PeBenito 17de1b7
				bool_name = bool_val = None
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	# tunables are currently implemented as booleans
Chris PeBenito 17de1b7
	for node in doc.getElementsByTagName("tunable"):
Chris PeBenito 17de1b7
		for desc in node.getElementsByTagName("desc"):
Chris PeBenito 17de1b7
			bool_desc = format_txt_desc(desc)
Chris PeBenito 17de1b7
		s = string.split(bool_desc, "\n")
Chris PeBenito 17de1b7
		file_name.write("#\n")
Chris PeBenito 17de1b7
		for line in s:
Chris PeBenito 17de1b7
			file_name.write("# %s\n" % line)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		bool_name = bool_val = None
Chris PeBenito 17de1b7
		for (name, value) in node.attributes.items():
Chris PeBenito 17de1b7
			if name == "name":
Chris PeBenito 17de1b7
				bool_name = value
Chris PeBenito 17de1b7
			elif name == "dftval":
Chris PeBenito 17de1b7
				bool_val = value
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			if [bool_name,BOOL_ENABLED] in namevalue_list:
Chris PeBenito 17de1b7
				bool_val = BOOL_ENABLED
Chris PeBenito 17de1b7
			elif [bool_name,BOOL_DISABLED] in namevalue_list:
Chris PeBenito 17de1b7
				bool_val = BOOL_DISABLED
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			if bool_name and bool_val:
Chris PeBenito 17de1b7
	            		file_name.write("%s = %s\n\n" % (bool_name, bool_val))
Chris PeBenito 17de1b7
				bool_name = bool_val = None
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def gen_module_conf(doc, file_name, namevalue_list):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Generates the module configuration file using the XML provided and the
Chris PeBenito 17de1b7
	previous module configuration.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	# If file exists, preserve settings and modify if needed.
Chris PeBenito 17de1b7
	# Otherwise, create it.
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	file_name.write("#\n# This file contains a listing of available modules.\n")
Chris PeBenito 17de1b7
	file_name.write("# To prevent a module from  being used in policy\n")
Chris PeBenito 17de1b7
	file_name.write("# creation, set the module name to \"%s\".\n#\n" % MOD_DISABLED)
Chris PeBenito 17de1b7
	file_name.write("# For monolithic policies, modules set to \"%s\" and \"%s\"\n" % (MOD_BASE, MOD_ENABLED))
Chris PeBenito 17de1b7
	file_name.write("# will be built into the policy.\n#\n")
Chris PeBenito 17de1b7
	file_name.write("# For modular policies, modules set to \"%s\" will be\n" % MOD_BASE)
Chris PeBenito 17de1b7
	file_name.write("# included in the base module.  \"%s\" will be compiled\n" % MOD_ENABLED)
Chris PeBenito 17de1b7
	file_name.write("# as individual loadable modules.\n#\n\n")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	# For required in [True,False] is present so that the requiered modules
Chris PeBenito 17de1b7
	# are at the top of the config file.
Chris PeBenito 17de1b7
	for required in [True,False]:
Chris PeBenito 17de1b7
		for node in doc.getElementsByTagName("module"):
Chris PeBenito 17de1b7
			mod_req = False
Chris PeBenito 17de1b7
			for req in node.getElementsByTagName("required"):
Chris PeBenito 17de1b7
				if req.getAttribute("val") == "true":
Chris PeBenito 17de1b7
					mod_req = True
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			# Skip if we arnt working on the right set of modules.
Chris PeBenito 17de1b7
			if mod_req and not required or not mod_req and required:
Chris PeBenito 17de1b7
				continue
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			mod_name = mod_layer = None
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			mod_name = node.getAttribute("name")	
Chris PeBenito 17de1b7
			mod_layer = node.parentNode.getAttribute("name")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			if mod_name and mod_layer:
Chris PeBenito 17de1b7
				file_name.write("# Layer: %s\n# Module: %s\n" % (mod_layer,mod_name))
Chris PeBenito 17de1b7
				if required:
Chris PeBenito 17de1b7
					file_name.write("# Required in base\n")
Chris PeBenito 17de1b7
				file_name.write("#\n")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			for desc in node.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
				if not desc.parentNode == node:
Chris PeBenito 17de1b7
					continue
Chris PeBenito 17de1b7
				s = string.split(format_txt_desc(desc), "\n")
Chris PeBenito 17de1b7
				for line in s:
Chris PeBenito 17de1b7
					file_name.write("# %s\n" % line)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
				# If the module is set as disabled.
Chris PeBenito 17de1b7
				if [mod_name, MOD_DISABLED] in namevalue_list:
Chris PeBenito 17de1b7
					file_name.write("%s = %s\n\n" % (mod_name, MOD_DISABLED))
Chris PeBenito 17de1b7
				# If the module is set as enabled.
Chris PeBenito 17de1b7
				elif [mod_name, MOD_ENABLED] in namevalue_list:
Chris PeBenito 17de1b7
					file_name.write("%s = %s\n\n" % (mod_name, MOD_ENABLED))
Chris PeBenito 17de1b7
				# If the module is set as base.
Chris PeBenito 17de1b7
				elif [mod_name, MOD_BASE] in namevalue_list:
Chris PeBenito 17de1b7
					file_name.write("%s = %s\n\n" % (mod_name, MOD_BASE))
Chris PeBenito 17de1b7
				# If the module is a new module.
Chris PeBenito 17de1b7
				else:
Chris PeBenito 17de1b7
					# Set the module to base if it is marked as required.
Chris PeBenito 17de1b7
					if mod_req:
Chris PeBenito 17de1b7
						file_name.write("%s = %s\n\n" % (mod_name, MOD_BASE))
Chris PeBenito 17de1b7
					# Set the module to enabled if it is not required. 
Chris PeBenito 17de1b7
					else:
Chris PeBenito 17de1b7
						file_name.write("%s = %s\n\n" % (mod_name, MOD_ENABLED))
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def get_conf(conf):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Returns a list of [name, value] pairs from a config file with the format
Chris PeBenito 17de1b7
	name = value
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	conf_lines = conf.readlines()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	namevalue_list = []
Chris PeBenito 17de1b7
	for i in range(0,len(conf_lines)):
Chris PeBenito 17de1b7
		line = conf_lines[i]
Chris PeBenito 17de1b7
		if line.strip() != '' and line.strip()[0] != "#":
Chris PeBenito 17de1b7
			namevalue = line.strip().split("=")
Chris PeBenito 17de1b7
			if len(namevalue) != 2:
Chris PeBenito 17de1b7
				warning("line %d: \"%s\" is not a valid line, skipping"\
Chris PeBenito 17de1b7
					 % (i, line.strip()))
Chris PeBenito 17de1b7
				continue
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			namevalue[0] = namevalue[0].strip()
Chris PeBenito 17de1b7
			if len(namevalue[0].split()) > 1:
Chris PeBenito 17de1b7
				warning("line %d: \"%s\" is not a valid line, skipping"\
Chris PeBenito 17de1b7
					 % (i, line.strip()))
Chris PeBenito 17de1b7
				continue
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			namevalue[1] = namevalue[1].strip()
Chris PeBenito 17de1b7
			if len(namevalue[1].split()) > 1:
Chris PeBenito 17de1b7
				warning("line %d: \"%s\" is not a valid line, skipping"\
Chris PeBenito 17de1b7
					 % (i, line.strip()))
Chris PeBenito 17de1b7
				continue
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			namevalue_list.append(namevalue)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return namevalue_list
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def first_cmp(a, b):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Compares the two first elements of a list instead of the entire list.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return cmp(a[0], b[0])
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def int_cmp(a, b):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Compares two interfaces.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return cmp(a["interface_name"], b["interface_name"])
Chris PeBenito 17de1b7
		
Chris PeBenito 17de1b7
def temp_cmp(a, b):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Compares two templates.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return cmp(a["template_name"], b["template_name"])
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def tun_cmp(a, b):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Compares two tunables.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return cmp(a["tun_name"], b["tun_name"])
Chris PeBenito 17de1b7
def bool_cmp(a, b):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Compares two booleans.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return cmp(a["bool_name"], b["bool_name"])
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def gen_doc_menu(mod_layer, module_list):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Generates the HTML document menu.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	menu = []
Chris PeBenito 17de1b7
	for layer, value in module_list.iteritems():
Chris PeBenito 17de1b7
		cur_menu = (layer, [])
Chris PeBenito 17de1b7
		menu.append(cur_menu)
Chris PeBenito 17de1b7
		if layer != mod_layer and mod_layer != None:
Chris PeBenito 17de1b7
			continue
Chris PeBenito 17de1b7
		#we are in our layer so fill in the other modules or we want them all
Chris PeBenito 17de1b7
		for mod, desc in value.iteritems():
Chris PeBenito 17de1b7
			cur_menu[1].append((mod, desc))
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	menu.sort(first_cmp)
Chris PeBenito 17de1b7
	for x in menu:
Chris PeBenito 17de1b7
		x[1].sort(first_cmp)
Chris PeBenito 17de1b7
	return menu
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def format_html_desc(node):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Formats a XML node into a HTML format.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	desc_buf = ''
Chris PeBenito 17de1b7
	for desc in node.childNodes:
Chris PeBenito 17de1b7
		if desc.nodeName == "#text":
Chris PeBenito 17de1b7
			if desc.data is not '':
Chris PeBenito 17de1b7
				if desc.parentNode.nodeName != "p":
Chris PeBenito 17de1b7
					desc_buf += "

" + desc.data + "

"
Chris PeBenito 17de1b7
				else:
Chris PeBenito 17de1b7
					desc_buf += desc.data
Chris PeBenito 17de1b7
		else:
Chris PeBenito 17de1b7
			desc_buf += "<" + desc.nodeName + ">" \
Chris PeBenito 17de1b7
				 + format_html_desc(desc) \
Chris PeBenito 17de1b7
				 + "</" + desc.nodeName +">"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return desc_buf
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def format_txt_desc(node):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Formats a XML node into a plain text format.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	desc_buf = ''
Chris PeBenito 17de1b7
	for desc in node.childNodes:
Chris PeBenito 17de1b7
		if desc.nodeName == "#text":
Chris PeBenito 17de1b7
			desc_buf += desc.data + "\n"
Chris PeBenito 17de1b7
		elif desc.nodeName == "p":
Chris PeBenito 17de1b7
			desc_buf += desc.firstChild.data + "\n"
Chris PeBenito 17de1b7
			for chld in desc.childNodes: 
Chris PeBenito 17de1b7
				if chld.nodeName == "ul":
Chris PeBenito 17de1b7
					desc_buf += "\n"
Chris PeBenito 17de1b7
					for li in chld.getElementsByTagName("li"):
Chris PeBenito 17de1b7
						desc_buf += "\t -" + li.firstChild.data + "\n"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	return desc_buf.strip() + "\n"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def gen_docs(doc, working_dir, templatedir):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Generates all the documentation.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		#get the template data ahead of time so we don't reopen them over and over
Chris PeBenito 17de1b7
		bodyfile = open(templatedir + "/header.html", "r")
Chris PeBenito 17de1b7
		bodydata = bodyfile.read()
Chris PeBenito 17de1b7
		bodyfile.close()
Chris PeBenito 17de1b7
		intfile = open(templatedir + "/interface.html", "r")
Chris PeBenito 17de1b7
		intdata = intfile.read()
Chris PeBenito 17de1b7
		intfile.close()
Chris PeBenito 17de1b7
		templatefile = open(templatedir + "/template.html", "r")
Chris PeBenito 17de1b7
		templatedata = templatefile.read()
Chris PeBenito 17de1b7
		templatefile.close()
Chris PeBenito 56e1b3d
		tunfile = open(templatedir + "/tunable.html", "r")
Chris PeBenito 56e1b3d
		tundata = tunfile.read()
Chris PeBenito 56e1b3d
		tunfile.close()
Chris PeBenito 56e1b3d
		boolfile = open(templatedir + "/boolean.html", "r")
Chris PeBenito 56e1b3d
		booldata = boolfile.read()
Chris PeBenito 56e1b3d
		boolfile.close()
Chris PeBenito 17de1b7
		menufile = open(templatedir + "/menu.html", "r")
Chris PeBenito 17de1b7
		menudata = menufile.read()
Chris PeBenito 17de1b7
		menufile.close()
Chris PeBenito 17de1b7
		indexfile = open(templatedir + "/module_list.html","r")
Chris PeBenito 17de1b7
		indexdata = indexfile.read()
Chris PeBenito 17de1b7
		indexfile.close()
Chris PeBenito 17de1b7
		modulefile = open(templatedir + "/module.html","r")
Chris PeBenito 17de1b7
		moduledata = modulefile.read()
Chris PeBenito 17de1b7
		modulefile.close()
Chris PeBenito 17de1b7
		intlistfile = open(templatedir + "/int_list.html", "r")
Chris PeBenito 17de1b7
		intlistdata = intlistfile.read()
Chris PeBenito 17de1b7
		intlistfile.close()
Chris PeBenito 17de1b7
		templistfile = open(templatedir + "/temp_list.html", "r")
Chris PeBenito 17de1b7
		templistdata = templistfile.read()
Chris PeBenito 17de1b7
		templistfile.close()
Chris PeBenito 56e1b3d
		tunlistfile = open(templatedir + "/tun_list.html", "r")
Chris PeBenito 17de1b7
		tunlistdata = tunlistfile.read()
Chris PeBenito 17de1b7
		tunlistfile.close()
Chris PeBenito 56e1b3d
		boollistfile = open(templatedir + "/bool_list.html", "r")
Chris PeBenito 56e1b3d
		boollistdata = boollistfile.read()
Chris PeBenito 56e1b3d
		boollistfile.close()
Chris PeBenito 56e1b3d
		gboollistfile = open(templatedir + "/global_bool_list.html", "r")
Chris PeBenito 56e1b3d
		gboollistdata = gboollistfile.read()
Chris PeBenito 56e1b3d
		gboollistfile.close()
Chris PeBenito 56e1b3d
		gtunlistfile = open(templatedir + "/global_tun_list.html", "r")
Chris PeBenito 56e1b3d
		gtunlistdata = gtunlistfile.read()
Chris PeBenito 56e1b3d
		gtunlistfile.close()
Chris PeBenito 17de1b7
	except:
Chris PeBenito 17de1b7
		error("Could not open templates")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		os.chdir(working_dir)
Chris PeBenito 17de1b7
	except:
Chris PeBenito 17de1b7
		error("Could not chdir to target directory")	
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#arg, i have to go through this dom tree ahead of time to build up the menus
Chris PeBenito 17de1b7
	module_list = {}
Chris PeBenito 17de1b7
	for node in doc.getElementsByTagName("module"):
Chris PeBenito 17de1b7
                mod_name = mod_layer = interface_buf = ''
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		mod_name = node.getAttribute("name")
Chris PeBenito 17de1b7
		mod_layer = node.parentNode.getAttribute("name")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		for desc in node.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
			if desc.parentNode == node and desc:
Chris PeBenito 17de1b7
				mod_summary = format_html_desc(desc)
Chris PeBenito 17de1b7
		if not module_list.has_key(mod_layer):
Chris PeBenito 17de1b7
			module_list[mod_layer] = {}
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		module_list[mod_layer][mod_name] = mod_summary
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
#generate index pages
Chris PeBenito 17de1b7
	main_content_buf = ''
Chris PeBenito 17de1b7
	for mod_layer,modules in module_list.iteritems():
Chris PeBenito 17de1b7
		menu = gen_doc_menu(mod_layer, module_list)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		layer_summary = None
Chris PeBenito 17de1b7
		for desc in doc.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
			if desc.parentNode.getAttribute("name") == mod_layer:
Chris PeBenito 17de1b7
				layer_summary = format_html_desc(desc)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		menu_args = { "menulist" : menu,
Chris PeBenito 17de1b7
			      "mod_layer" : mod_layer,
Chris PeBenito 17de1b7
			      "layer_summary" : layer_summary }
Chris PeBenito 17de1b7
		menu_tpl = pyplate.Template(menudata)
Chris PeBenito 17de1b7
		menu_buf = menu_tpl.execute_string(menu_args)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		content_tpl = pyplate.Template(indexdata)
Chris PeBenito 17de1b7
		content_buf = content_tpl.execute_string(menu_args)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		main_content_buf += content_buf
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		body_args = { "menu" : menu_buf,
Chris PeBenito 17de1b7
			      "content" : content_buf }
Chris PeBenito 17de1b7
	
Chris PeBenito 17de1b7
		index_file = mod_layer + ".html"
Chris PeBenito 17de1b7
		index_fh = open(index_file, "w")
Chris PeBenito 17de1b7
		body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
		body_tpl.execute(index_fh, body_args)
Chris PeBenito 17de1b7
		index_fh.close()	
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	menu = gen_doc_menu(None, module_list)
Chris PeBenito 17de1b7
	menu_args = { "menulist" : menu,
Chris PeBenito 17de1b7
		      "mod_layer" : None }
Chris PeBenito 17de1b7
	menu_tpl = pyplate.Template(menudata)
Chris PeBenito 17de1b7
	menu_buf = menu_tpl.execute_string(menu_args)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_args = { "menu" : menu_buf,
Chris PeBenito 17de1b7
		      "content" : main_content_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	index_file = "index.html"
Chris PeBenito 17de1b7
	index_fh = open(index_file, "w")
Chris PeBenito 17de1b7
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
	body_tpl.execute(index_fh, body_args)
Chris PeBenito 17de1b7
	index_fh.close()
Chris PeBenito 17de1b7
#now generate the individual module pages
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	all_interfaces = []
Chris PeBenito 17de1b7
	all_templates = []
Chris PeBenito 56e1b3d
	all_tunables = []
Chris PeBenito 56e1b3d
	all_booleans = []
Chris PeBenito 17de1b7
	for node in doc.getElementsByTagName("module"):
Chris PeBenito 17de1b7
                mod_name = mod_layer = mod_desc = interface_buf = ''
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		mod_name = node.getAttribute("name")
Chris PeBenito 17de1b7
		mod_layer = node.parentNode.getAttribute("name")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		mod_req = None
Chris PeBenito 17de1b7
		for req in node.getElementsByTagName("required"):
Chris PeBenito 17de1b7
			if req.getAttribute("val") == "true":
Chris PeBenito 17de1b7
				mod_req = True
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		for desc in node.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
			if desc.parentNode == node:
Chris PeBenito 17de1b7
				mod_summary = format_html_desc(desc)
Chris PeBenito 17de1b7
		for desc in node.getElementsByTagName("desc"):
Chris PeBenito 17de1b7
			if desc.parentNode == node:
Chris PeBenito 17de1b7
				mod_desc = format_html_desc(desc)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		interfaces = []
Chris PeBenito 17de1b7
		for interface in node.getElementsByTagName("interface"):
Chris PeBenito 17de1b7
			interface_parameters = []
Chris PeBenito 17de1b7
			interface_desc = interface_summary = None
Chris PeBenito 17de1b7
			interface_name = interface.getAttribute("name")
Chris PeBenito 17de1b7
			interface_line = interface.getAttribute("lineno")
Chris PeBenito 17de1b7
			for desc in interface.childNodes:
Chris PeBenito 17de1b7
				if desc.nodeName == "desc":
Chris PeBenito 17de1b7
					interface_desc = format_html_desc(desc)
Chris PeBenito 17de1b7
				elif desc.nodeName == "summary":
Chris PeBenito 17de1b7
					interface_summary = format_html_desc(desc)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			for args in interface.getElementsByTagName("param"):
Chris PeBenito 17de1b7
				for desc in args.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
					paramdesc = format_html_desc(desc)
Chris PeBenito 17de1b7
				paramname = args.getAttribute("name")
Chris PeBenito 17de1b7
				if args.getAttribute("optional") == "true":
Chris PeBenito 17de1b7
					paramopt = "Yes"
Chris PeBenito 17de1b7
				else:
Chris PeBenito 17de1b7
					paramopt = "No"
Chris PeBenito c5cfd2d
				if args.getAttribute("unused") == "true":
Chris PeBenito c5cfd2d
					paramunused = "Yes"
Chris PeBenito c5cfd2d
				else:
Chris PeBenito c5cfd2d
					paramunused = "No"
Chris PeBenito 17de1b7
				parameter = { "name" : paramname,
Chris PeBenito 17de1b7
					      "desc" : paramdesc,
Chris PeBenito c5cfd2d
					      "optional" : paramopt,
Chris PeBenito c5cfd2d
					      "unused" : paramunused }
Chris PeBenito 17de1b7
				interface_parameters.append(parameter)
Chris PeBenito 17de1b7
			interfaces.append( { "interface_name" : interface_name,
Chris PeBenito 17de1b7
					   "interface_summary" : interface_summary,
Chris PeBenito 17de1b7
					   "interface_desc" : interface_desc,
Chris PeBenito 17de1b7
					   "interface_parameters" : interface_parameters })
Chris PeBenito 17de1b7
			#all_interfaces is for the main interface index with all interfaces
Chris PeBenito 17de1b7
			all_interfaces.append( { "interface_name" : interface_name,
Chris PeBenito 17de1b7
					   "interface_summary" : interface_summary,
Chris PeBenito 17de1b7
					   "interface_desc" : interface_desc,
Chris PeBenito 17de1b7
					   "interface_parameters" : interface_parameters,
Chris PeBenito 17de1b7
					   "mod_name": mod_name,
Chris PeBenito 17de1b7
					   "mod_layer" : mod_layer })
Chris PeBenito 17de1b7
		interfaces.sort(int_cmp)	
Chris PeBenito 17de1b7
		interface_tpl = pyplate.Template(intdata)
Chris PeBenito 17de1b7
		interface_buf = interface_tpl.execute_string({"interfaces" : interfaces})
Chris PeBenito 17de1b7
	
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# now generate individual template pages
Chris PeBenito 17de1b7
		templates = []
Chris PeBenito 17de1b7
		for template in node.getElementsByTagName("template"):
Chris PeBenito 17de1b7
			template_parameters = []
Chris PeBenito 17de1b7
			template_desc = template_summary = None
Chris PeBenito 17de1b7
			template_name = template.getAttribute("name")
Chris PeBenito 17de1b7
			template_line = template.getAttribute("lineno")
Chris PeBenito 17de1b7
			for desc in template.childNodes:
Chris PeBenito 17de1b7
				if desc.nodeName == "desc":
Chris PeBenito 17de1b7
					template_desc = format_html_desc(desc)
Chris PeBenito 17de1b7
				elif desc.nodeName == "summary":
Chris PeBenito 17de1b7
					template_summary = format_html_desc(desc)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
			for args in template.getElementsByTagName("param"):
Chris PeBenito 17de1b7
				for desc in args.getElementsByTagName("summary"):
Chris PeBenito 17de1b7
					paramdesc = format_html_desc(desc)
Chris PeBenito 17de1b7
				paramname = args.getAttribute("name")
Chris PeBenito 17de1b7
				if args.getAttribute("optional") == "true":
Chris PeBenito 17de1b7
					paramopt = "Yes"
Chris PeBenito 17de1b7
				else:
Chris PeBenito 17de1b7
					paramopt = "No"
Chris PeBenito c5cfd2d
				if args.getAttribute("unused") == "true":
Chris PeBenito c5cfd2d
					paramunused = "Yes"
Chris PeBenito c5cfd2d
				else:
Chris PeBenito c5cfd2d
					paramunused = "No"
Chris PeBenito 17de1b7
				parameter = { "name" : paramname,
Chris PeBenito 17de1b7
					      "desc" : paramdesc,
Chris PeBenito c5cfd2d
					      "optional" : paramopt,
Chris PeBenito c5cfd2d
					      "unused": paramunused }
Chris PeBenito 17de1b7
				template_parameters.append(parameter)
Chris PeBenito 17de1b7
			templates.append( { "template_name" : template_name,
Chris PeBenito 17de1b7
					   "template_summary" : template_summary,
Chris PeBenito 17de1b7
					   "template_desc" : template_desc,
Chris PeBenito 17de1b7
					   "template_parameters" : template_parameters })
Chris PeBenito 17de1b7
			#all_templates is for the main interface index with all templates
Chris PeBenito 17de1b7
			all_templates.append( { "template_name" : template_name,
Chris PeBenito 17de1b7
					   "template_summary" : template_summary,
Chris PeBenito 17de1b7
					   "template_desc" : template_desc,
Chris PeBenito 17de1b7
					   "template_parameters" : template_parameters,
Chris PeBenito 17de1b7
					   "mod_name": mod_name,
Chris PeBenito 17de1b7
					   "mod_layer" : mod_layer })
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		templates.sort(temp_cmp)	
Chris PeBenito 17de1b7
		template_tpl = pyplate.Template(templatedata)
Chris PeBenito 17de1b7
		template_buf = template_tpl.execute_string({"templates" : templates})
Chris PeBenito 17de1b7
Chris PeBenito 56e1b3d
		#generate 'boolean' pages
Chris PeBenito 56e1b3d
		booleans = []
Chris PeBenito 56e1b3d
		for boolean in node.getElementsByTagName("bool"):
Chris PeBenito 56e1b3d
			boolean_parameters = []
Chris PeBenito 56e1b3d
			boolean_desc = None
Chris PeBenito 56e1b3d
			boolean_name = boolean.getAttribute("name")
Chris PeBenito 56e1b3d
			boolean_dftval = boolean.getAttribute("dftval")
Chris PeBenito 56e1b3d
			for desc in boolean.childNodes:
Chris PeBenito 56e1b3d
				if desc.nodeName == "desc":
Chris PeBenito 56e1b3d
					boolean_desc = format_html_desc(desc)
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
			booleans.append({ "bool_name" : boolean_name,
Chris PeBenito 56e1b3d
					  "desc" : boolean_desc,
Chris PeBenito 56e1b3d
					  "def_val" : boolean_dftval })
Chris PeBenito 56e1b3d
			#all_booleans is for the main boolean index with all booleans
Chris PeBenito 56e1b3d
			all_booleans.append({ "bool_name" : boolean_name,
Chris PeBenito 56e1b3d
					   "desc" : boolean_desc,
Chris PeBenito 56e1b3d
					   "def_val" : boolean_dftval,
Chris PeBenito 56e1b3d
					   "mod_name": mod_name,
Chris PeBenito 56e1b3d
					   "mod_layer" : mod_layer })
Chris PeBenito 56e1b3d
		booleans.sort(bool_cmp)
Chris PeBenito 56e1b3d
		boolean_tpl = pyplate.Template(booldata)
Chris PeBenito 56e1b3d
		boolean_buf = boolean_tpl.execute_string({"booleans" : booleans})
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
		#generate 'tunable' pages
Chris PeBenito 56e1b3d
		tunables = []
Chris PeBenito 56e1b3d
		for tunable in node.getElementsByTagName("tunable"):
Chris PeBenito 56e1b3d
			tunable_parameters = []
Chris PeBenito 56e1b3d
			tunable_desc = None
Chris PeBenito 56e1b3d
			tunable_name = tunable.getAttribute("name")
Chris PeBenito 56e1b3d
			tunable_dftval = tunable.getAttribute("dftval")
Chris PeBenito 56e1b3d
			for desc in tunable.childNodes:
Chris PeBenito 56e1b3d
				if desc.nodeName == "desc":
Chris PeBenito 56e1b3d
					tunable_desc = format_html_desc(desc)
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
			tunables.append({ "tun_name" : tunable_name,
Chris PeBenito 56e1b3d
					  "desc" : tunable_desc,
Chris PeBenito 56e1b3d
					  "def_val" : tunable_dftval })
Chris PeBenito 56e1b3d
			#all_tunables is for the main tunable index with all tunables
Chris PeBenito 56e1b3d
			all_tunables.append({ "tun_name" : tunable_name,
Chris PeBenito 56e1b3d
					   "desc" : tunable_desc,
Chris PeBenito 56e1b3d
					   "def_val" : tunable_dftval,
Chris PeBenito 56e1b3d
					   "mod_name": mod_name,
Chris PeBenito 56e1b3d
					   "mod_layer" : mod_layer })
Chris PeBenito 56e1b3d
		tunables.sort(tun_cmp)
Chris PeBenito 56e1b3d
		tunable_tpl = pyplate.Template(tundata)
Chris PeBenito 56e1b3d
		tunable_buf = tunable_tpl.execute_string({"tunables" : tunables})
Chris PeBenito 56e1b3d
	
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		menu = gen_doc_menu(mod_layer, module_list)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		menu_tpl = pyplate.Template(menudata)
Chris PeBenito 17de1b7
		menu_buf = menu_tpl.execute_string({ "menulist" : menu })
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		# pyplate's execute_string gives us a line of whitespace in
Chris PeBenito 17de1b7
		# template_buf or interface_buf if there are no interfaces or
Chris PeBenito 17de1b7
		# templates for this module. This is problematic because the
Chris PeBenito 17de1b7
		# HTML templates use a conditional if on interface_buf or
Chris PeBenito 17de1b7
		# template_buf being 'None' to decide if the "Template:" or
Chris PeBenito 17de1b7
		# "Interface:" headers need to be printed in the module pages.
Chris PeBenito 17de1b7
		# This detects if either of these are just whitespace, and sets
Chris PeBenito 17de1b7
		# their values to 'None' so that when applying it to the
Chris PeBenito 17de1b7
		# templates, they are properly recognized as not existing.
Chris PeBenito 17de1b7
		if not interface_buf.strip():
Chris PeBenito 17de1b7
			interface_buf = None
Chris PeBenito 17de1b7
		if not template_buf.strip():
Chris PeBenito 17de1b7
			template_buf = None
Chris PeBenito 56e1b3d
		if not tunable_buf.strip():
Chris PeBenito 56e1b3d
			tunable_buf = None
Chris PeBenito 56e1b3d
		if not boolean_buf.strip():
Chris PeBenito 56e1b3d
			boolean_buf = None
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		module_args = { "mod_layer" : mod_layer,
Chris PeBenito 17de1b7
			      "mod_name" : mod_name,	
Chris PeBenito 17de1b7
			      "mod_summary" : mod_summary,
Chris PeBenito 17de1b7
			      "mod_desc" : mod_desc,
Chris PeBenito 17de1b7
			      "mod_req" : mod_req,
Chris PeBenito 17de1b7
			      "interfaces" : interface_buf,
Chris PeBenito 56e1b3d
			      "templates" : template_buf,
Chris PeBenito 56e1b3d
			      "tunables" : tunable_buf,
Chris PeBenito 56e1b3d
			      "booleans" : boolean_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		module_tpl = pyplate.Template(moduledata)
Chris PeBenito 17de1b7
		module_buf = module_tpl.execute_string(module_args)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		body_args = { "menu" : menu_buf,
Chris PeBenito 17de1b7
			      "content" : module_buf }
Chris PeBenito 17de1b7
			  
Chris PeBenito 17de1b7
		module_file = mod_layer + "_" + mod_name + ".html"
Chris PeBenito 17de1b7
		module_fh = open(module_file, "w")
Chris PeBenito 17de1b7
		body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
		body_tpl.execute(module_fh, body_args)
Chris PeBenito 17de1b7
		module_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		
Chris PeBenito 17de1b7
	menu = gen_doc_menu(None, module_list)
Chris PeBenito 17de1b7
	menu_args = { "menulist" : menu,
Chris PeBenito 17de1b7
		      "mod_layer" : None }
Chris PeBenito 17de1b7
	menu_tpl = pyplate.Template(menudata)
Chris PeBenito 17de1b7
	menu_buf = menu_tpl.execute_string(menu_args)
Chris PeBenito 17de1b7
	
Chris PeBenito 17de1b7
	#build the interface index
Chris PeBenito 17de1b7
	all_interfaces.sort(int_cmp)
Chris PeBenito 17de1b7
	interface_tpl = pyplate.Template(intlistdata)
Chris PeBenito 17de1b7
	interface_buf = interface_tpl.execute_string({"interfaces" : all_interfaces})
Chris PeBenito 17de1b7
	int_file = "interfaces.html"
Chris PeBenito 17de1b7
	int_fh = open(int_file, "w")
Chris PeBenito 17de1b7
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_args = { "menu" : menu_buf, 
Chris PeBenito 17de1b7
		      "content" : interface_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_tpl.execute(int_fh, body_args)
Chris PeBenito 17de1b7
	int_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	#build the template index
Chris PeBenito 17de1b7
	all_templates.sort(temp_cmp)
Chris PeBenito 17de1b7
	template_tpl = pyplate.Template(templistdata)
Chris PeBenito 17de1b7
	template_buf = template_tpl.execute_string({"templates" : all_templates})
Chris PeBenito 17de1b7
	temp_file = "templates.html"
Chris PeBenito 17de1b7
	temp_fh = open(temp_file, "w")
Chris PeBenito 17de1b7
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_args = { "menu" : menu_buf, 
Chris PeBenito 17de1b7
		      "content" : template_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_tpl.execute(temp_fh, body_args)
Chris PeBenito 17de1b7
	temp_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	#build the global tunable index
Chris PeBenito 56e1b3d
	global_tun = []
Chris PeBenito 17de1b7
	for tunable in doc.getElementsByTagName("tunable"):
Chris PeBenito 17de1b7
		if tunable.parentNode.nodeName == "policy":
Chris PeBenito 17de1b7
			tunable_name = tunable.getAttribute("name")
Chris PeBenito 17de1b7
			default_value = tunable.getAttribute("dftval")
Chris PeBenito 17de1b7
			for desc in tunable.getElementsByTagName("desc"):
Chris PeBenito 17de1b7
				description = format_html_desc(desc)
Chris PeBenito 56e1b3d
			global_tun.append( { "tun_name" : tunable_name,
Chris PeBenito 17de1b7
						"def_val" : default_value,
Chris PeBenito 17de1b7
						"desc" : description } )
Chris PeBenito 56e1b3d
	global_tun.sort(tun_cmp)
Chris PeBenito 56e1b3d
	global_tun_tpl = pyplate.Template(gtunlistdata)
Chris PeBenito 56e1b3d
	global_tun_buf = global_tun_tpl.execute_string({"tunables" : global_tun})
Chris PeBenito 17de1b7
	global_tun_file = "global_tunables.html"
Chris PeBenito 17de1b7
	global_tun_fh = open(global_tun_file, "w")
Chris PeBenito 17de1b7
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_args = { "menu" : menu_buf,
Chris PeBenito 17de1b7
		      "content" : global_tun_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_tpl.execute(global_tun_fh, body_args)
Chris PeBenito 17de1b7
	global_tun_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 56e1b3d
	#build the tunable index
Chris PeBenito 56e1b3d
	all_tunables = all_tunables + global_tun
Chris PeBenito 56e1b3d
	all_tunables.sort(tun_cmp)
Chris PeBenito 56e1b3d
	tunable_tpl = pyplate.Template(tunlistdata)
Chris PeBenito 56e1b3d
	tunable_buf = tunable_tpl.execute_string({"tunables" : all_tunables})
Chris PeBenito 56e1b3d
	temp_file = "tunables.html"
Chris PeBenito 56e1b3d
	temp_fh = open(temp_file, "w")
Chris PeBenito 56e1b3d
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
	body_args = { "menu" : menu_buf, 
Chris PeBenito 56e1b3d
		      "content" : tunable_buf }
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
	body_tpl.execute(temp_fh, body_args)
Chris PeBenito 56e1b3d
	temp_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	#build the global boolean index
Chris PeBenito 56e1b3d
	global_bool = []
Chris PeBenito 17de1b7
	for boolean in doc.getElementsByTagName("bool"):
Chris PeBenito 17de1b7
		if boolean.parentNode.nodeName == "policy":
Chris PeBenito 17de1b7
			bool_name = boolean.getAttribute("name")
Chris PeBenito 17de1b7
			default_value = boolean.getAttribute("dftval")
Chris PeBenito 17de1b7
			for desc in boolean.getElementsByTagName("desc"):
Chris PeBenito 17de1b7
				description = format_html_desc(desc)
Chris PeBenito 56e1b3d
			global_bool.append( { "bool_name" : bool_name,
Chris PeBenito 17de1b7
						"def_val" : default_value,
Chris PeBenito 17de1b7
						"desc" : description } )
Chris PeBenito 56e1b3d
	global_bool.sort(bool_cmp)
Chris PeBenito 56e1b3d
	global_bool_tpl = pyplate.Template(gboollistdata)
Chris PeBenito 56e1b3d
	global_bool_buf = global_bool_tpl.execute_string({"booleans" : global_bool})
Chris PeBenito 17de1b7
	global_bool_file = "global_booleans.html"
Chris PeBenito 17de1b7
	global_bool_fh = open(global_bool_file, "w")
Chris PeBenito 17de1b7
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_args = { "menu" : menu_buf,
Chris PeBenito 17de1b7
		      "content" : global_bool_buf }
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	body_tpl.execute(global_bool_fh, body_args)
Chris PeBenito 17de1b7
	global_bool_fh.close()
Chris PeBenito 56e1b3d
	
Chris PeBenito 56e1b3d
	#build the boolean index
Chris PeBenito 56e1b3d
	all_booleans = all_booleans + global_bool
Chris PeBenito 56e1b3d
	all_booleans.sort(bool_cmp)
Chris PeBenito 56e1b3d
	boolean_tpl = pyplate.Template(boollistdata)
Chris PeBenito 56e1b3d
	boolean_buf = boolean_tpl.execute_string({"booleans" : all_booleans})
Chris PeBenito 56e1b3d
	temp_file = "booleans.html"
Chris PeBenito 56e1b3d
	temp_fh = open(temp_file, "w")
Chris PeBenito 56e1b3d
	body_tpl = pyplate.Template(bodydata)
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
	body_args = { "menu" : menu_buf, 
Chris PeBenito 56e1b3d
		      "content" : boolean_buf }
Chris PeBenito 56e1b3d
Chris PeBenito 56e1b3d
	body_tpl.execute(temp_fh, body_args)
Chris PeBenito 56e1b3d
	temp_fh.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def error(error):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Print an error message and exit.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
        sys.stderr.write("%s exiting for: " % sys.argv[0])
Chris PeBenito 17de1b7
        sys.stderr.write("%s\n" % error)
Chris PeBenito 17de1b7
        sys.stderr.flush()
Chris PeBenito 17de1b7
        sys.exit(1)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def warning(warn):
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Print a warning message.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	sys.stderr.write("%s warning: " % sys.argv[0])
Chris PeBenito 17de1b7
	sys.stderr.write("%s\n" % warn)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
def usage():
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
	Describes the proper usage of this tool.
Chris PeBenito 17de1b7
	"""
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	sys.stdout.write("%s [-tmdT] -x <xmlfile>\n\n" % sys.argv[0])
Chris PeBenito 17de1b7
	sys.stdout.write("Options:\n")
Chris PeBenito 17de1b7
	sys.stdout.write("-b --booleans	<file>		--	write boolean config to <file>\n")
Chris PeBenito 17de1b7
	sys.stdout.write("-m --modules <file>		--	write module config to <file>\n")
Chris PeBenito 17de1b7
	sys.stdout.write("-d --docs <dir>		--	write interface documentation to <dir>\n")
Chris PeBenito 17de1b7
	sys.stdout.write("-x --xml <file>		--	filename to read xml data from\n")
Chris PeBenito 17de1b7
	sys.stdout.write("-T --templates <dir>		--	template directory for documents\n")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
# MAIN PROGRAM
Chris PeBenito 17de1b7
try:
Chris PeBenito 17de1b7
	opts, args = getopt.getopt(sys.argv[1:], "b:m:d:x:T:", ["booleans","modules","docs","xml", "templates"])
Chris PeBenito 17de1b7
except getopt.GetoptError:
Chris PeBenito 17de1b7
	usage()
Chris PeBenito 17de1b7
	sys.exit(1)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
booleans = modules = docsdir = None
Chris PeBenito 17de1b7
templatedir = "templates/"
Chris PeBenito 17de1b7
xmlfile = "policy.xml"
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
for opt, val in opts:
Chris PeBenito 17de1b7
	if opt in ("-b", "--booleans"):
Chris PeBenito 17de1b7
		booleans = val
Chris PeBenito 17de1b7
	if opt in ("-m", "--modules"):
Chris PeBenito 17de1b7
		modules = val
Chris PeBenito 17de1b7
	if opt in ("-d", "--docs"):
Chris PeBenito 17de1b7
		docsdir = val
Chris PeBenito 17de1b7
	if opt in ("-x", "--xml"):
Chris PeBenito 17de1b7
		xmlfile = val
Chris PeBenito 17de1b7
	if opt in ("-T", "--templates"):
Chris PeBenito 17de1b7
		templatedir = val
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
doc = read_policy_xml(xmlfile)
Chris PeBenito 17de1b7
		
Chris PeBenito 17de1b7
if booleans:
Chris PeBenito 17de1b7
	namevalue_list = []
Chris PeBenito 17de1b7
	if os.path.exists(booleans):
Chris PeBenito 17de1b7
		try:
Chris PeBenito 17de1b7
			conf = open(booleans, 'r')
Chris PeBenito 17de1b7
		except:
Chris PeBenito 17de1b7
			error("Could not open booleans file for reading")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		namevalue_list = get_conf(conf)
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
		conf.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		conf = open(booleans, 'w')
Chris PeBenito 17de1b7
	except:
Chris PeBenito 17de1b7
		error("Could not open booleans file for writing")
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	gen_booleans_conf(doc, conf, namevalue_list)
Chris PeBenito 17de1b7
	conf.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
if modules:
Chris PeBenito 17de1b7
	namevalue_list = []
Chris PeBenito 17de1b7
	if os.path.exists(modules):
Chris PeBenito 17de1b7
		try:
Chris PeBenito 17de1b7
			conf = open(modules, 'r')
Chris PeBenito 17de1b7
		except:
Chris PeBenito 17de1b7
			error("Could not open modules file for reading")
Chris PeBenito 17de1b7
		namevalue_list = get_conf(conf)	
Chris PeBenito 17de1b7
		conf.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
	try:
Chris PeBenito 17de1b7
		conf = open(modules, 'w')
Chris PeBenito 17de1b7
	except:
Chris PeBenito 17de1b7
		error("Could not open modules file for writing")
Chris PeBenito 17de1b7
	gen_module_conf(doc, conf, namevalue_list)
Chris PeBenito 17de1b7
	conf.close()
Chris PeBenito 17de1b7
Chris PeBenito 17de1b7
if docsdir: 
Chris PeBenito 17de1b7
	gen_docs(doc, docsdir, templatedir)