[selinux-policy: 305/3172] updates
Daniel J Walsh
dwalsh at fedoraproject.org
Thu Oct 7 19:31:19 UTC 2010
commit 5a3299bd30efb4fb7ca6a1104cc73ae6988e5eaa
Author: Chris PeBenito <cpebenito at tresys.com>
Date: Thu Jun 9 18:16:51 2005 +0000
updates
refpolicy/support/pyplate.py | 51 +++--------
refpolicy/support/sedoctool.py | 197 +++++++++++++++++++++++++++++++++++-----
2 files changed, 184 insertions(+), 64 deletions(-)
---
diff --git a/refpolicy/support/pyplate.py b/refpolicy/support/pyplate.py
index 20b1bc6..c7532cc 100755
--- a/refpolicy/support/pyplate.py
+++ b/refpolicy/support/pyplate.py
@@ -179,7 +179,7 @@ class ForTemplateNode(TemplateNode):
self.vars = []
for v in self.vars_temp:
self.vars.append(v.strip())
- print self.vars
+ #print self.vars
self.expression = match.group(2)
def execute(self, stream, data):
@@ -188,8 +188,8 @@ class ForTemplateNode(TemplateNode):
if data.has_key(var):
remember_vars[var] = data[var]
for list in eval(self.expression, globals(), data):
- if util.is_sequence(list):
- for index, value in util.enumerate(list):
+ if is_sequence(list):
+ for index, value in enumerate(list):
data[self.vars[index]] = value
else:
data[self.vars[0]] = list
@@ -255,7 +255,7 @@ class FunctionTemplateNode(TemplateNode):
self.vars = []
for v in self.vars_temp:
self.vars.append(v.strip())
- print self.vars
+ #print self.vars
self.parent.functions[self.function_name] = self
def execute(self, stream, data):
@@ -263,7 +263,7 @@ class FunctionTemplateNode(TemplateNode):
def call(self, args, stream, data):
remember_vars = {}
- for index, var in util.enumerate(self.vars):
+ for index, var in enumerate(self.vars):
if data.has_key(var):
remember_vars[var] = data[var]
data[var] = args[index]
@@ -355,37 +355,10 @@ def TemplateNodeFactory(parent):
return template_factory_type_map[i](parent, directive)
return ExpressionTemplateNode(parent, directive)
-
-############################################################
-# TESTING CODE
-if __name__ == '__main__':
- combinations = (('OneBit', 'Float', 'GreyScale'),
- ('GreyScale', 'RGB'))
-
- template = Template("""
- [[# This is a comment #]]
- [[# This example does recursive function calls need to generate feature combinations #]]
- [[def switch(layer, args)]]
- switch(m[[layer]].id) {
- [[for option in combinations[layer]]]
- [[exec current = option + '(m' + str(layer) + ')']]
- case [[option]]:
- [[if layer == layers - 1]]
- function_call([[string.join(args + [current], ',')]]);
- [[else]]
- [[call switch(layer + 1, args + [current])]]
- [[end]]
- break;
- [[end]]
- }
- [[end]]
-
- PyObject *py_overload_resolution_[[function_name]](PyObject *args) {
- [[call switch(0, [])]]
- }
- """)
-
- data = {'combinations' : combinations,
- 'function_name' : 'threshold',
- 'layers' : 2}
- template.execute(sys.stdout, data)
+def is_sequence(object):
+ try:
+ test = object[0:0]
+ except:
+ return False
+ else:
+ return True
diff --git a/refpolicy/support/sedoctool.py b/refpolicy/support/sedoctool.py
index 4db8263..ee20546 100755
--- a/refpolicy/support/sedoctool.py
+++ b/refpolicy/support/sedoctool.py
@@ -8,12 +8,14 @@
# the Free Software Foundation, version 2.
"""
- this does dstuff
+ This module generates configuration files and documentation from the
+ SELinux reference policy XML format.
"""
import sys
import getopt
import pyplate
+import os
from xml.dom.ext import *
from xml.dom.ext.reader import Sax2
@@ -43,68 +45,211 @@ def gen_tunable_conf(doc, file):
tun_name = tun_val = None
def gen_module_conf(doc, file):
+ file.write("#\n# This file contains a listing of available modules.\n")
+ file.write("# To prevent a module from being used in policy\n")
+ file.write("# creation, uncomment the line with its name.\n#\n")
for node in doc.getElementsByTagName("module"):
+ mod_name = mod_layer = None
+ for (name, value) in node.attributes.items():
+ if name[1] == "name":
+ mod_name = value.value
+ if name[1] == "layer":
+ mod_layer = value.value
+
+ if mod_name and mod_layer:
+ file.write("# Layer: %s\n# Module: %s\n#\n" % (mod_layer,mod_name))
+
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)
+ file.write("#\n#%s\n\n" % mod_name)
+
+def gen_doc_menu(mod_layer, module_list):
+ menu = {}
+ for name, value in module_list.iteritems():
+ if not menu.has_key(name):
+ menu[name] = {}
+ if name == mod_layer or mod_layer == None:
+ #we are in our layer so fill in the other modules or we want them all
+ for mod, desc in value.iteritems():
+ menu[name][mod] = desc
+ return menu
+
+def gen_docs(doc, dir, templatedir):
-def gen_docs(doc, file):
try:
- bodyfile = open("templates/header.html", "r")
- intfile = open("templates/interface.html", "r")
+ bodyfile = open(templatedir + "/header.html", "r")
+ bodydata = bodyfile.read()
+ bodyfile.close()
+ intfile = open(templatedir + "/interface.html", "r")
+ intdata = intfile.read()
+ intfile.close()
+ menufile = open(templatedir + "/menu.html", "r")
+ menudata = menufile.read()
+ menufile.close()
+ indexfile = open(templatedir + "/module_list.html","r")
+ indexdata = indexfile.read()
+ indexfile.close()
+ modulefile = open(templatedir + "/module.html","r")
+ moduledata = modulefile.read()
+ modulefile.close()
except:
error("Could not open templates")
- interface_buf = None
- interface_parameters = {}
+
+ try:
+ os.chdir(dir)
+ except:
+ error("Could now chdir to target directory")
+
+
+#arg, i have to go through this dom tree ahead of time to build up the menus
+ module_list = {}
+ for node in doc.getElementsByTagName("module"):
+ mod_name = mod_layer = interface_buf = ''
+ for (name, value) in node.attributes.items():
+ if name[1] == "name":
+ mod_name = value.value
+ if name[1] == "layer":
+ mod_layer = value.value
+ for desc in node.getElementsByTagName("summary"):
+ mod_summary = desc.firstChild.data
+
+ if not module_list.has_key(mod_layer):
+ module_list[mod_layer] = {}
+
+ module_list[mod_layer][mod_name] = mod_summary
+
+#generate index pages
+ main_content_buf = ''
+ for mod_layer,modules in module_list.iteritems():
+ menu = gen_doc_menu(mod_layer, module_list)
+
+ menu_args = { "menulist" : menu,
+ "mod_layer" : mod_layer }
+ menu_tpl = pyplate.Template(menudata)
+ menu_buf = menu_tpl.execute_string(menu_args)
+
+ content_tpl = pyplate.Template(indexdata)
+ content_buf = content_tpl.execute_string(menu_args)
+
+ main_content_buf += content_buf
+
+ body_args = { "menu" : menu_buf,
+ "content" : content_buf }
+
+ index_file = mod_layer + ".html"
+ index_fh = open(index_file, "w")
+ body_tpl = pyplate.Template(bodydata)
+ body_tpl.execute(index_fh, body_args)
+ index_fh.close()
+
+ menu = gen_doc_menu(None, module_list)
+ menu_args = { "menulist" : menu,
+ "mod_layer" : None }
+ menu_tpl = pyplate.Template(menudata)
+ menu_buf = menu_tpl.execute_string(menu_args)
+
+ body_args = { "menu" : menu_buf,
+ "content" : main_content_buf }
+
+ index_file = "index.html"
+ index_fh = open(index_file, "w")
+ body_tpl = pyplate.Template(bodydata)
+ body_tpl.execute(index_fh, body_args)
+ index_fh.close()
+
for node in doc.getElementsByTagName("module"):
+ mod_name = mod_layer = interface_buf = ''
+ for (name, value) in node.attributes.items():
+ if name[1] == "name":
+ mod_name = value.value
+ if name[1] == "layer":
+ mod_layer = value.value
+ for desc in node.getElementsByTagName("summary"):
+ mod_summary = desc.firstChild.data
for interface in node.getElementsByTagName("interface"):
- interface_tpl = pyplate.Template(intfile.read())
+ interface_parameters = []
+ interface_secdesc = None
+ interface_tpl = pyplate.Template(intdata)
for i,v in interface.attributes.items():
- interface_name = v
+ interface_name = v.value
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 }
-
+ paramname = None
+ paramopt = False
+ for name,val in args.attributes.items():
+ if name[1] == "name":
+ paramname = val.value
+ if name[1] == "optional":
+ paramopt = val.value
+ parameter = { "name" : paramname,
+ "desc" : paramdesc,
+ "optional" : paramopt }
+ interface_parameters.append(parameter)
+ interface_args = { "interface_name" : interface_name,
+ "interface_desc" : interface_desc,
+ "interface_parameters" : interface_parameters,
+ "interface_secdesc" : interface_secdesc }
+ interface_buf += interface_tpl.execute_string(interface_args)
+
+ menu = gen_doc_menu(mod_layer, module_list)
+
+ menu_args = { "menulist" : menu }
+ menu_tpl = pyplate.Template(menudata)
+ menu_buf = menu_tpl.execute_string(menu_args)
+
+ module_args = { "mod_layer" : mod_layer,
+ "mod_name" : mod_name,
+ "mod_summary" : mod_summary,
+ "interfaces" : interface_buf }
+
+ module_tpl = pyplate.Template(moduledata)
+ module_buf = module_tpl.execute_string(module_args)
+
+ body_args = { "menu" : menu_buf,
+ "content" : module_buf }
+
+ module_file = mod_layer + "_" + mod_name + ".html"
+ module_fh = open(module_file, "w")
+ body_tpl = pyplate.Template(bodydata)
+ body_tpl.execute(module_fh, body_args)
+ module_fh.close()
def error(error):
sys.stderr.write("%s exiting for: " % sys.argv[0])
sys.stderr.write("%s\n" % error)
sys.stderr.flush()
+ raise
sys.exit(1)
def usage():
- sys.stdout.write("%s [-tmd] -x <xmlfile>\n\n" % sys.argv[0])
+ sys.stdout.write("%s [-tmdT] -x <xmlfile>\n\n" % sys.argv[0])
sys.stdout.write("Options:\n")
- sys.stdout.write("-t --tunables -- write tunable config to <file>\n")
+ sys.stdout.write("-t --tunables <file> -- write tunable config to <file>\n")
sys.stdout.write("-m --modules <file> -- write module config to <file>\n")
sys.stdout.write("-d --docs <dir> -- write interface documentation to <dir>\n")
sys.stdout.write("-x --xml <file> -- filename to read xml data from\n")
+ sys.stdout.write("-T --templates <dir> -- template directory for documents\n")
try:
- opts, args = getopt.getopt(sys.argv[1:], "t:m:d:x:", ["tunables","modules","docs","xml"])
+ opts, args = getopt.getopt(sys.argv[1:], "t:m:d:x:T:", ["tunables","modules","docs","xml", "templates"])
except getopt.GetoptError:
usage()
sys.exit(1)
-tunables = modules = docs = xmlfile = None
+tunables = modules = docs = None
+templatedir = "templates/"
+xmlfile = "policy.xml"
for opt, val in opts:
if opt in ("-t", "--tunables"):
@@ -112,9 +257,11 @@ for opt, val in opts:
if opt in ("-m", "--modules"):
modules = val
if opt in ("-d", "--docs"):
- docs = val
+ docsdir = val
if opt in ("-x", "--xml"):
xmlfile = val
+ if opt in ("-T", "--templates"):
+ templatedir = val
if xmlfile == None:
usage()
@@ -139,5 +286,5 @@ if modules:
gen_module_conf(doc, conf)
conf.close()
-if docs:
- gen_docs(doc, sys.stdout)
+if docsdir:
+ gen_docs(doc, docsdir, templatedir)
More information about the scm-commits
mailing list