[Oval-commits] r308 - in trunk/oval-server: . oval/dsa2oval/definition

Pavel Vinogradov blaze-guest at alioth.debian.org
Sun Nov 18 19:47:46 UTC 2007


Author: blaze-guest
Date: 2007-11-18 19:47:46 +0000 (Sun, 18 Nov 2007)
New Revision: 308

Modified:
   trunk/oval-server/dsa2oval.py
   trunk/oval-server/oval/dsa2oval/definition/generator.py
Log:
Rewrite generator module as OVALGenerator class

Modified: trunk/oval-server/dsa2oval.py
===================================================================
--- trunk/oval-server/dsa2oval.py	2007-11-18 19:43:29 UTC (rev 307)
+++ trunk/oval-server/dsa2oval.py	2007-11-18 19:47:46 UTC (rev 308)
@@ -39,9 +39,9 @@
     	Use generator from dsa2oval package for convert all DSA stored in dict
     	to proper formated XML file.
     	"""
-    
-		ovalDefinitions = generator.createOVALDefinitions (self.dsaref)
-		generator.printOVALDefinitions (ovalDefinitions)
+		ovalBuilder = generator.OVALGenerator()    
+		ovalDefinitions = ovalBuilder.createOVALDefinitions (self.dsaref)
+		ovalBuilder.printOVALDefinitions (ovalDefinitions)
 
 	def parseDir (self, directory, depth):
 		""" Recursive search directory for DSA files contain postfix in their names.
@@ -57,7 +57,7 @@
 		@type depth: C(integer)
 		@param depth: maximum recursion depth
 		"""
-		
+				
 		if depth == 0:
 			logging.log(logging.DEBUG, "Maximum depth reached at directory " + directory)
 			return (0)
@@ -91,17 +91,17 @@
 							self.dsaref[result[0]][k] = v
 					else:
 						self.dsaref[result[0]] = result[1]
-									
+
 		return 0
 
 	def parseFile (self, filename):
 		""" Parse specifi DSA data and wml file.
 			
 		Parse specified DSA data file and according wml file.
-		Create OVAl definition for this DSA and return it.
+		Create OVAl definition and store in global variable dsaref..
 
 		@type filename: C(string)
-		@param filename: path to DSA datafile
+		@param filename: path to DSA file
 		@rtype: C(string)		
 		"""
 
@@ -118,17 +118,19 @@
 			else:
 				self.dsaref[result[0]] = result[1]
 
-		#Parse wml file
-		result = wml.parseFile(wmlFile)
-		if result:
-			if self.dsaref.has_key (result[0]):
-				for (k, v) in result[1].iteritems():
-					self.dsaref[result[0]][k] = v
-			else:
-				self.dsaref[result[0]] = result[1]
+			#Parse according wml file
+			result = wml.parseFile(wmlFile)
+			if result:
+				if self.dsaref.has_key (result[0]):
+					for (k, v) in result[1].iteritems():
+						self.dsaref[result[0]][k] = v
+				else:
+					self.dsaref[result[0]] = result[1]
+			
+			return 0
+		
+		return -1
 
-		return 0
-
 def usage (prog = "dsa2oval"):
 	"""Print information about script flags and options
 	
@@ -170,11 +172,12 @@
 		logging.basicConfig(level=logging.ERROR)
 	
 	walker = Walker();
+
 	if opts.has_key('-f'):
 		walker.parseFile (opts['-f'])
 		walker.printDSA()
 		sys.exit(0)
-	
+
 	if opts.has_key('-d'):
 		walker.parseDir(opts['-d'], 2)
 		walker.printDSA()

Modified: trunk/oval-server/oval/dsa2oval/definition/generator.py
===================================================================
--- trunk/oval-server/oval/dsa2oval/definition/generator.py	2007-11-18 19:43:29 UTC (rev 307)
+++ trunk/oval-server/oval/dsa2oval/definition/generator.py	2007-11-18 19:47:46 UTC (rev 308)
@@ -22,497 +22,500 @@
 
 class DSAFormatException (OvalGeneratorException):
 	code = 1
-	
-def __createXMLElement (name, descr = None, attrs = {}):
-	"""
-		Create XML element with text descr and attributes attrs
-		
-		Keyword arguments:
-		name -- Name of XML element
-		descr -- content of textNode (default None)
-		attrs -- attributes of element (default {})
 
-		Return created XML element
-	"""
+class OVALGenerator:
 
-	doc = xml.dom.minidom.Document ()
-	element = doc.createElement (name)
+	namespace = "oval:org.debian.oval"
+	releaseArchHash = {"2.0" : 2, "2.1" : 4, "2.2":  6, "3.0" : 11, "3.1" : 12, "4.0" : 11}
+	#We need more info about alpha, arm, hppa, bmips, lmips
+	unameArchTable = {'i386' : 'i686', 'amd64' : 'x86-64', 'ia64' : 'ia64', 'powerpc' : 'ppc', 's390' : 's390x', 'm86k' : 'm86k'} 
 	
-	for (attr, value) in attrs.items():
-		attribute = doc.createAttribute (attr)
-		attribute.value = value
-		element.attributes.setNamedItem (attribute)
-	
-	if descr != None:
-		description = doc.createTextNode (descr.encode("utf8"))
-		element.appendChild (description)
-	
-	return (element)
+	def __init__ (self):
+		self.tests = self.__createXMLElement ("tests")
+		self.objects = self.__createXMLElement ("objects")
+		self.states = self.__createXMLElement ("states")
 
-namespace = "oval:org.debian.oval"
-tests = __createXMLElement ("tests")
-objects = __createXMLElement ("objects")
-states = __createXMLElement ("states")
+		self.testsCurId = 1
+		self.objectsCurId = 1
+		self.statesCurId = 1
+		
+		self.testsHash = {"arch" : {}, "release": {}, "obj": {}, "fileSte": {}, "unameSte" : {}, "dpkgSte": {}}
+		
+	def __createXMLElement (self, name, descr = None, attrs = {}):
+		"""
+			Create XML element with text descr and attributes attrs
+			
+			Keyword arguments:
+			name -- Name of XML element
+			descr -- content of textNode (default None)
+			attrs -- attributes of element (default {})
+			
+			Return created XML element
+		"""
 
-testsCurId = 1
-objectsCurId = 1
-statesCurId = 1
-
-releaseArchHash = {"2.0" : 2, "2.1" : 4, "2.2":  6, "3.0" : 11, "3.1" : 12, "4.0" : 11}
-testsHash = {"arch" : {}, "release": {}, "obj": {}, "fileSte": {}, "unameSte" : {}, "dpkgSte": {}} 
-#We need more info about alpha, arm, hppa, bmips, lmips
-unameArchTable = {'i386' : 'i686', 'amd64' : 'x86-64', 'ia64' : 'ia64', 'powerpc' : 'ppc', 's390' : 's390x', 'm86k' : 'm86k'} 
-
-def __trimzero (val):
-	value = val[:]
-	while value[0] == "0":
-		value = value[1:]
-	return value
-
-def __getNewId (type):
-	"""Generate new unique id for tests, objects or states
-	
-		Argument keqywords:
-		type -- type of generated id test | object | state
+		doc = xml.dom.minidom.Document ()
+		element = doc.createElement (name)
 		
-		return Generate id like <namespace>:tst|obj|ste:<id>
-	"""
-	global testsCurId, objectsCurId, statesCurId
-	  
-	if type == "test":
-		result = "%s:tst:%d" % (namespace, testsCurId)
-		testsCurId += 1
+		for (attr, value) in attrs.items():
+			attribute = doc.createAttribute (attr)
+			attribute.value = value
+			element.attributes.setNamedItem (attribute)
 		
-	if type == "object":
-		result = "%s:obj:%d" % (namespace, objectsCurId)
-		objectsCurId += 1
-		
-	if type == "state":
-		result = "%s:ste:%d" % (namespace, statesCurId)
-		statesCurId += 1
+		if descr != None:
+			description = doc.createTextNode (descr.encode("utf8"))
+			element.appendChild (description)
 	
-	return (result)
+		return (element)
 
-def __createOVALDpkginfoObject (name):
-	""" Generate OVAL dpkginfo_object definition """
-	
-	if not testsHash["obj"].has_key(name):
-		objectId = __getNewId ("object");
-		object = __createXMLElement("dpkginfo_object",
-			attrs={"id":objectId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"})
-		object.appendChild ( __createXMLElement ("name", name))
-		objects.appendChild (object)
+	def __trimzero (self, val):
+		value = val[:]
+		while value[0] == "0":
+			value = value[1:]
+		return value
 
-		testsHash["obj"][name] = objectId
+	def __getNewId (self, type):
+		"""Generate new unique id for tests, objects or states
+			
+			Argument keqywords:
+			type -- type of generated id test | object | state
+					
+			return Generate id like <namespace>:tst|obj|ste:<id>
+		"""
+				
+		if type == "test":
+			result = "%s:tst:%d" % (OVALGenerator.namespace, self.testsCurId)
+			self.testsCurId += 1
+		
+		if type == "object":
+			result = "%s:obj:%d" % (OVALGenerator.namespace, self.objectsCurId)
+			self.objectsCurId += 1
+		
+		if type == "state":
+			result = "%s:ste:%d" % (OVALGenerator.namespace, self.statesCurId)
+			self.statesCurId += 1
 	
-	return (testsHash["obj"][name])
+		return (result)
 
-def __createOVALTextfilecontentObject (pattern, path = "/etc", filename = "debian_version"):
-	""" Generate OVAL textfilecontent_object definition """
-	name = path + filename + pattern
+	def __createOVALDpkginfoObject (self, name):
+		""" Generate OVAL dpkginfo_object definition """
+		
+		if not self.testsHash["obj"].has_key(name):
+			objectId = self.__getNewId ("object");
+			object = self.__createXMLElement("dpkginfo_object",
+				attrs={"id":objectId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"})
+			object.appendChild ( self.__createXMLElement ("name", name))
+			self.objects.appendChild (object)
 	
-	if not testsHash["obj"].has_key(name):
-		objectId = __getNewId ("object");
-		object = __createXMLElement("textfilecontent_object",
-			attrs={"id":objectId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"})
-		object.appendChild ( __createXMLElement ("path", path))
-		object.appendChild ( __createXMLElement ("filename", filename))
-		object.appendChild ( __createXMLElement ("line", pattern, attrs={"operation" : "pattern match"}))
-		objects.appendChild (object)
+			self.testsHash["obj"][name] = objectId
+		
+		return (self.testsHash["obj"][name])
 
-		testsHash["obj"][name] = objectId
+	def __createOVALTextfilecontentObject (self, pattern, path = "/etc", filename = "debian_version"):
+		""" Generate OVAL textfilecontent_object definition """
+		name = path + filename + pattern
+		
+		if not self.testsHash["obj"].has_key(name):
+			objectId = self.__getNewId ("object");
+			object = self.__createXMLElement("textfilecontent_object",
+				attrs={"id":objectId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"})
+			object.appendChild ( self.__createXMLElement ("path", path))
+			object.appendChild ( self.__createXMLElement ("filename", filename))
+			object.appendChild ( self.__createXMLElement ("line", pattern, attrs={"operation" : "pattern match"}))
+			self.objects.appendChild (object)
 	
-	return (testsHash["obj"][name])
-
-def __createOVALUnameObject ():
-	""" Generate OVAL textfilecontent_object definition """
-	name = "uname_object"
+			self.testsHash["obj"][name] = objectId
+		
+		return (self.testsHash["obj"][name])
 	
-	if not testsHash["obj"].has_key(name):
-		objectId = __getNewId ("object");
-		object = __createXMLElement("uname_object",
-			attrs={"id":objectId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"})
-		objects.appendChild (object)
-
-		testsHash["obj"][name] = objectId
+	def __createOVALUnameObject (self):
+		""" Generate OVAL textfilecontent_object definition """
+		name = "uname_object"
+		
+		if not self.testsHash["obj"].has_key(name):
+			objectId = self.__getNewId ("object");
+			object = self.__createXMLElement("uname_object",
+				attrs={"id":objectId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"})
+			self.objects.appendChild (object)
 	
-	return (testsHash["obj"][name])
-
-def __createOVALState (value, operation = "less than"):
-	""" Generate OVAL state definition 
+			self.testsHash["obj"][name] = objectId
+		
+		return (self.testsHash["obj"][name])
 	
-		Use state hash for optimization of resulted XML
-	"""
-	if not testsHash["dpkgSte"].has_key(operation) or not testsHash["dpkgSte"][operation].has_key(value):
-		stateId = __getNewId ("state")
-
-		state = __createXMLElement("dpkginfo_state", 
-			attrs={"id":stateId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"})
-		state.appendChild ( __createXMLElement ("evr", "0:"+value, 
-						  			{"datatype":"evr_string", 
-									   "operation":operation}))
-		states.appendChild (state)
+	def __createOVALState (self, value, operation = "less than"):
+		""" Generate OVAL state definition 
+		
+			Use state hash for optimization of resulted XML
+		"""
+		if not self.testsHash["dpkgSte"].has_key(operation) or not self.testsHash["dpkgSte"][operation].has_key(value):
+			stateId = self.__getNewId ("state")
 	
-		testsHash["dpkgSte"][operation] = {value : stateId}
+			state = self.__createXMLElement("dpkginfo_state", 
+				attrs={"id":stateId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"})
+			state.appendChild ( self.__createXMLElement ("evr", "0:"+value, 
+							  			{"datatype":"evr_string", 
+										   "operation":operation}))
+			self.states.appendChild (state)
 		
-	return (testsHash["dpkgSte"][operation][value])
-
-def __createOVALUnameState (field, value, operation = "equals"):
-	""" Generate OVAL uname state definition 
+			self.testsHash["dpkgSte"][operation] = {value : stateId}
+			
+		return (self.testsHash["dpkgSte"][operation][value])
 	
-		Use unameArchTable to convert dsa arch to uname arch value
-	"""
+	def __createOVALUnameState (self, field, value, operation = "equals"):
+		""" Generate OVAL uname state definition 
+		
+			Use unameArchTable to convert dsa arch to uname arch value
+		"""
+		
+		try:
+			value = OVALGenerator.unameArchTable[value]
+		except KeyError:
+			pass
 	
-	try:
-		value = unameArchTable[value]
-	except KeyError:
-		pass
-
-	if not testsHash["unameSte"].has_key(operation) or not testsHash["unameSte"][operation].has_key(value):
-		stateId = __getNewId ("state")
-
-		state = __createXMLElement("uname_state", 
-			attrs={"id":stateId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"})
-		state.appendChild ( __createXMLElement (field, value, 
-						  			{"operation":operation}))
-		states.appendChild (state)
+		if not self.testsHash["unameSte"].has_key(operation) or not self.testsHash["unameSte"][operation].has_key(value):
+			stateId = self.__getNewId ("state")
 	
-		testsHash["unameSte"][operation] = {value : stateId}
+			state = self.__createXMLElement("uname_state", 
+				attrs={"id":stateId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"})
+			state.appendChild ( self.__createXMLElement (field, value, 
+							  			{"operation":operation}))
+			self.states.appendChild (state)
 		
-	return (testsHash["unameSte"][operation][value])
-
-def __createOVALTextfilecontentState (value, operation = "equals"):
-	""" Generate OVAL state definition 
+			self.testsHash["unameSte"][operation] = {value : stateId}
+			
+		return (self.testsHash["unameSte"][operation][value])
 	
-		Use state hash for optimization of resulted XML
-	"""
-
-	if not testsHash["fileSte"].has_key(operation) or not testsHash["fileSte"][operation].has_key(value):
-		stateId = __getNewId ("state")
-
-		state = __createXMLElement("textfilecontent_state", 
-			attrs={"id":stateId, 
-				"version":"1",
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"})
-		state.appendChild ( __createXMLElement ("line", value, 
-						  			{"operation":operation}))
-		states.appendChild (state)
-	
-		testsHash["fileSte"][operation] = {value : stateId}
+	def __createOVALTextfilecontentState (self, value, operation = "equals"):
+		""" Generate OVAL state definition 
 		
-	return (testsHash["fileSte"][operation][value])
+			Use state hash for optimization of resulted XML
+		"""
 	
-def __createDPKGTest(name, version):
-	""" Generate OVAL DPKG test """
+		if not self.testsHash["fileSte"].has_key(operation) or not self.testsHash["fileSte"][operation].has_key(value):
+			stateId = self.__getNewId ("state")
 	
-	ref = __getNewId ("test")
-	test = __createXMLElement("dpkginfo_test", 
-			attrs={"id":ref, 
-				"version":"1", 
-				"check":"all",
-				"check_existence":"at_least_one_exists",
-				"comment":"%s is earlier than %s" % (name, version),
-				"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"
-			})
-	test.appendChild ( __createXMLElement("object", attrs={"object_ref" : __createOVALDpkginfoObject (name)}))
-	test.appendChild ( __createXMLElement("state", attrs={"state_ref" : __createOVALState (version)}))
-	tests.appendChild(test)
-
-	return (ref)
-	
-def __createTest(testType, value):
-	""" Generate OVAL test for release or architecture cases"""
-	
-	if not testsHash[testType].has_key(value):
-		comment = None
+			state = self.__createXMLElement("textfilecontent_state", 
+				attrs={"id":stateId, 
+					"version":"1",
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"})
+			state.appendChild ( self.__createXMLElement ("line", value, 
+							  			{"operation":operation}))
+			self.states.appendChild (state)
+		
+			self.testsHash["fileSte"][operation] = {value : stateId}
 			
-		ref = __getNewId("test")
+		return (self.testsHash["fileSte"][operation][value])
 		
-		if testType == "release":
-			objectId = __createOVALTextfilecontentObject ("\d\.\d")
-			comment = "Debian GNU/Linux %s is installed" % value
-			
-			test = __createXMLElement("textfilecontent_test", 
+	def __createDPKGTest(self, name, version):
+		""" Generate OVAL DPKG test """
+		
+		ref = self.__getNewId ("test")
+		test = self.__createXMLElement("dpkginfo_test", 
 				attrs={"id":ref, 
 					"version":"1", 
 					"check":"all",
 					"check_existence":"at_least_one_exists",
-					"comment":comment,
-					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"
-			})
-			test.appendChild ( __createXMLElement("object", attrs={"object_ref" : objectId}))
-			test.appendChild ( __createXMLElement("state", attrs={"state_ref" : __createOVALTextfilecontentState (value, "equals")}))
+					"comment":"%s is earlier than %s" % (name, version),
+					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"
+				})
+		test.appendChild ( self.__createXMLElement("object", attrs={"object_ref" : self.__createOVALDpkginfoObject (name)}))
+		test.appendChild ( self.__createXMLElement("state", attrs={"state_ref" : self.__createOVALState (version)}))
+		self.tests.appendChild(test)
+	
+		return (ref)
+		
+	def __createTest(self, testType, value):
+		""" Generate OVAL test for release or architecture cases"""
+		
+		if not self.testsHash[testType].has_key(value):
+			comment = None
+				
+			ref = self.__getNewId("test")
 			
-		else:
-			objectId = __createOVALUnameObject ()
-			comment = "Installed architecture is %s" % value
+			if testType == "release":
+				objectId = self.__createOVALTextfilecontentObject ("\d\.\d")
+				comment = "Debian GNU/Linux %s is installed" % value
+				
+				test = self.__createXMLElement("textfilecontent_test", 
+					attrs={"id":ref, 
+						"version":"1", 
+						"check":"all",
+						"check_existence":"at_least_one_exists",
+						"comment":comment,
+						"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#independent"
+				})
+				test.appendChild ( self.__createXMLElement("object", attrs={"object_ref" : objectId}))
+				test.appendChild ( self.__createXMLElement("state", attrs={"state_ref" : self.__createOVALTextfilecontentState (value, "equals")}))
+				
+			else:
+				objectId = self.__createOVALUnameObject ()
+				comment = "Installed architecture is %s" % value
+				
+				test = self.__createXMLElement("uname_test", 
+					attrs={"id":ref, 
+						"version":"1", 
+						"check":"all",
+						"check_existence":"at_least_one_exists",
+						"comment":comment,
+						"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"
+				})
+				test.appendChild ( self.__createXMLElement("object", attrs={"object_ref" : objectId}))
+				if value != "all":
+					test.appendChild ( self.__createXMLElement("state", attrs={"state_ref" : self.__createOVALUnameState ("processor_type", value, "equals")}))
 			
-			test = __createXMLElement("uname_test", 
-				attrs={"id":ref, 
-					"version":"1", 
-					"check":"all",
-					"check_existence":"at_least_one_exists",
-					"comment":comment,
-					"xmlns":"http://oval.mitre.org/XMLSchema/oval-definitions-5#unix"
-			})
-			test.appendChild ( __createXMLElement("object", attrs={"object_ref" : objectId}))
-			if value != "all":
-				test.appendChild ( __createXMLElement("state", attrs={"state_ref" : __createOVALUnameState ("processor_type", value, "equals")}))
+			self.tests.appendChild(test)
+					
+			self.testsHash[testType][value] = ref
 		
-		tests.appendChild(test)
-				
-		testsHash[testType][value] = ref
+		return (self.testsHash[testType][value])
 	
-	return (testsHash[testType][value])
-
-def __createGeneratorHeader ():
-	"""
-		Create OVAL definitions XML generator element.
+	def __createGeneratorHeader (self):
+		"""
+			Create OVAL definitions XML generator element.
+			
+			return  xml.dom.minidom.Document with header information
+		"""
 		
-		return  xml.dom.minidom.Document with header information
-	"""
+		doc = xml.dom.minidom.Document ()
+		generator = doc.createElement ("generator")
 	
-	doc = xml.dom.minidom.Document ()
-	generator = doc.createElement ("generator")
-
-	generator.appendChild ( __createXMLElement ("oval:product_name", "Debian") )
-	generator.appendChild ( __createXMLElement ("oval:schema_version", "5.3") )
-	generator.appendChild ( __createXMLElement ("oval:timestamp", datetime.datetime.now().strftime ("%Y-%m-%dT%H:%M:%S.188-04:00")) )
-
-	return (generator)
-
-def createPlatformDefinition (release, data, dsa):
-	""" Generate OVAL definitions for current release
+		generator.appendChild ( self.__createXMLElement ("oval:product_name", "Debian") )
+		generator.appendChild ( self.__createXMLElement ("oval:schema_version", "5.3") )
+		generator.appendChild ( self.__createXMLElement ("oval:timestamp", datetime.datetime.now().strftime ("%Y-%m-%dT%H:%M:%S.188-04:00")) )
 	
-		Generate full criteria tree for specified release. Tests, states and objects 
-		stored in global dictionaries.
-		Use differ module for otimize generated tree.
-		
-		Argument keywords:
-		release -- Debian release
-		data -- dict with information about packages
-		dsa - DSA id
-		
-		return Generated XML fragment
-	"""
-	#Raise excetion if we receive too small data
-	if len(data) == 0:
-		raise DSAFormatException
+		return (generator)
 	
-	softwareCriteria = __createXMLElement ("criteria", attrs = {"comment" : "Release section", "operator" : "AND"})
-	softwareCriteria.appendChild ( __createXMLElement ("criterion", attrs={"test_ref" : __createTest("release", release), "comment" : "Debian %s is installed" % release}))
+	def createPlatformDefinition (self, release, data, dsa):
+		""" Generate OVAL definitions for current release
 		
-	archCriteria = __createXMLElement ("criteria", attrs = {"comment" : "Architecture section", "operator" : "OR"})
-
-	# Handle architecture independed section
-	if data.has_key ("all"):
-		archIndepCriteria = __createXMLElement ("criteria", attrs={"comment" : "Architecture independet section", "operator" : "AND"})
+			Generate full criteria tree for specified release. Tests, states and objects 
+			stored in global dictionaries.
+			Use differ module for otimize generated tree.
+			
+			Argument keywords:
+			release -- Debian release
+			data -- dict with information about packages
+			dsa - DSA id
+			
+			return Generated XML fragment
+		"""
+		#Raise excetion if we receive too small data
+		if len(data) == 0:
+			raise DSAFormatException
 		
-		archIndepCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createTest("arch", "all"), "comment" : "all architecture"}))
-		#Build packages section only if we have more then one package
-		if len (data["all"]) > 1:
-			packageCriteria = __createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
-			archIndepCriteria.appendChild (packageCriteria)
-		else:
-			packageCriteria = archIndepCriteria
+		softwareCriteria = self.__createXMLElement ("criteria", attrs = {"comment" : "Release section", "operator" : "AND"})
+		softwareCriteria.appendChild ( self.__createXMLElement ("criterion", attrs={"test_ref" : self.__createTest("release", release), "comment" : "Debian %s is installed" % release}))
 			
-		for pkg in data["all"].keys():
-			packageCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createDPKGTest(pkg, data["all"][pkg]), "comment" : "%s DPKG is earlier than %s" % (pkg, data["all"][pkg])}))
+		archCriteria = self.__createXMLElement ("criteria", attrs = {"comment" : "Architecture section", "operator" : "OR"})
 	
-		archCriteria.appendChild (archIndepCriteria)
-
-	# Optimize packages tree in 2 stages
-	diff = differ ()
-	for i in range(2):
-		
-		if i == 0:
-			dsaData = data
-		else:
-			dsaData = diff.getDiffer()
-		
-		diff.Clean()	
-		for (key, value) in dsaData.iteritems():
-			if key != "all":
-				diff.compareElement(key, value)
-		
-		eq = diff.getEqual()
-		di = diff.getDiffer()
-		
-		# Generate XML for optimized packages
-		if (len(eq)):
-			if len(diff.getArchs()) != releaseArchHash[release]:
-				archDependCriteria = __createXMLElement ("criteria", attrs={"comment" : "Architecture depended section", "operator" : "AND"})	
+		# Handle architecture independed section
+		if data.has_key ("all"):
+			archIndepCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Architecture independet section", "operator" : "AND"})
+			
+			archIndepCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createTest("arch", "all"), "comment" : "all architecture"}))
+			#Build packages section only if we have more then one package
+			if len (data["all"]) > 1:
+				packageCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
+				archIndepCriteria.appendChild (packageCriteria)
+			else:
+				packageCriteria = archIndepCriteria
 				
-				supportedArchCriteria = __createXMLElement ("criteria", attrs={"comment" : "Supported architectures section", "operator" : "OR"})
-				for arch in diff.getArchs():
-					supportedArchCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createTest("arch", arch), "comment" : "%s architecture" % arch}))
-					archDependCriteria.appendChild (supportedArchCriteria)
+			for pkg in data["all"].keys():
+				packageCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createDPKGTest(pkg, data["all"][pkg]), "comment" : "%s DPKG is earlier than %s" % (pkg, data["all"][pkg])}))
 		
-			packageCriteria = __createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
-			for bpkg in eq.keys():
-				packageCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createDPKGTest(bpkg, eq[bpkg]), "comment" : "%s DPKG is earlier than %s" % (bpkg, eq[bpkg])}))
+			archCriteria.appendChild (archIndepCriteria)
+	
+		# Optimize packages tree in 2 stages
+		diff = differ ()
+		for i in range(2):
 			
-			if len(diff.getArchs()) != releaseArchHash[release]:			
-				archDependCriteria.appendChild (packageCriteria)
-				archCriteria.appendChild (archDependCriteria)
+			if i == 0:
+				dsaData = data
 			else:
-				archCriteria.appendChild (packageCriteria)
-		
-	# Generate XML for all other packages
-	if len(di):
-		archDependCriteria = __createXMLElement ("criteria", attrs={"comment" : "Architecture depended section", "operator" : "AND"})
+				dsaData = diff.getDiffer()
 			
-		for (key, value) in di.iteritems():
-			supportedPlatformCriteria = __createXMLElement ("criteria", attrs={"comment" : "Supported platform section", "operator" : "AND"})
-			supportedPlatformCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createTest("arch", key), "comment" : "%s architecture" % key}))
-		
-			packageCriteria = __createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
+			diff.Clean()	
+			for (key, value) in dsaData.iteritems():
+				if key != "all":
+					diff.compareElement(key, value)
+			
+			eq = diff.getEqual()
+			di = diff.getDiffer()
+			
+			# Generate XML for optimized packages
+			if (len(eq)):
+				if len(diff.getArchs()) != OVALGenerator.releaseArchHash[release]:
+					archDependCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Architecture depended section", "operator" : "AND"})	
 					
-			for bpkg in di[key].keys():
-				packageCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createDPKGTest(bpkg, di[key][bpkg]), "comment" : "%s DPKG is earlier than %s" % (bpkg, di[key][bpkg])}))
-				supportedPlatformCriteria.appendChild (packageCriteria)
+					supportedArchCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Supported architectures section", "operator" : "OR"})
+					for arch in diff.getArchs():
+						supportedArchCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createTest("arch", arch), "comment" : "%s architecture" % arch}))
+						archDependCriteria.appendChild (supportedArchCriteria)
+			
+				packageCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
+				for bpkg in eq.keys():
+					packageCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createDPKGTest(bpkg, eq[bpkg]), "comment" : "%s DPKG is earlier than %s" % (bpkg, eq[bpkg])}))
+				
+				if len(diff.getArchs()) != OVALGenerator.releaseArchHash[release]:			
+					archDependCriteria.appendChild (packageCriteria)
+					archCriteria.appendChild (archDependCriteria)
+				else:
+					archCriteria.appendChild (packageCriteria)
+			
+		# Generate XML for all other packages
+		if len(di):
+			archDependCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Architecture depended section", "operator" : "AND"})
+				
+			for (key, value) in di.iteritems():
+				supportedPlatformCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Supported platform section", "operator" : "AND"})
+				supportedPlatformCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createTest("arch", key), "comment" : "%s architecture" % key}))
+			
+				packageCriteria = self.__createXMLElement ("criteria", attrs={"comment" : "Packages section", "operator" : "OR"})
+						
+				for bpkg in di[key].keys():
+					packageCriteria.appendChild ( self.__createXMLElement ("criterion", attrs = {"test_ref" : self.__createDPKGTest(bpkg, di[key][bpkg]), "comment" : "%s DPKG is earlier than %s" % (bpkg, di[key][bpkg])}))
+					supportedPlatformCriteria.appendChild (packageCriteria)
+			
+			archDependCriteria.appendChild (supportedPlatformCriteria)
+			archCriteria.appendChild (archDependCriteria)	
+			 	
+		softwareCriteria.appendChild (archCriteria)	
 		
-		archDependCriteria.appendChild (supportedPlatformCriteria)
-		archCriteria.appendChild (archDependCriteria)	
-		 	
-	softwareCriteria.appendChild (archCriteria)	
+		return (softwareCriteria)
 	
-	return (softwareCriteria)
-
-def createDefinition (dsa, dsaref):
-	""" Generate OVAL header of Definition tag
+	def createDefinition (self, dsa, dsaref):
+		""" Generate OVAL header of Definition tag
+		
+			Print general informaton about OVAL definition. Use createPlatformDefinition for generate criteria 
+			sections for each affected release.
+			
+			Argument keywords:
+			dsa -- DSA dentificator
+			dsaref -- DSA parsed data
+		"""	
+		if not dsaref.has_key("release"):
+			logging.log(logging.ERROR, "DSA %s: Release definition not well formatted. Ignore this DSA." % dsa)
+			raise DSAFormatException
+			
+		if not dsaref.has_key("packages"):
+			logging.log(logging.ERROR, "DSA %s: Package information missed. Ignore this DSA." % dsa)
+			raise DSAFormatException
 	
-		Print general informaton about OVAL definition. Use createPlatformDefinition for generate criteria 
-		sections for each affected release.
+		if not dsaref.has_key("description"):
+			logging.log(logging.WARNING, "DSA %s: Description information missed." % dsa)
+			dsaref["description"] = ""
+	
+		if not dsaref.has_key("moreinfo"):
+			logging.log(logging.WARNING, "DSA %s: Moreinfo information missed." % dsa)
+			dsaref["moreinfo"] = ""
 		
-		Argument keywords:
-		dsa -- DSA dentificator
-		dsaref -- DSA parsed data
-	"""	
-	if not dsaref.has_key("release"):
-		logging.log(logging.ERROR, "DSA %s: Release definition not well formatted. Ignore this DSA." % dsa)
-		raise DSAFormatException
+		if not dsaref.has_key("secrefs"):
+			logging.log(logging.WARNING, "DSA %s: Secrefs information missed." % dsa)
+			dsaref["secrefs"] = ""
+	
+		doc = xml.dom.minidom.Document ()
 		
-	if not dsaref.has_key("packages"):
-		logging.log(logging.ERROR, "DSA %s: Package information missed. Ignore this DSA." % dsa)
-		raise DSAFormatException
-
-	if not dsaref.has_key("description"):
-		logging.log(logging.WARNING, "DSA %s: Description information missed." % dsa)
-		dsaref["description"] = ""
-
-	if not dsaref.has_key("moreinfo"):
-		logging.log(logging.WARNING, "DSA %s: Moreinfo information missed." % dsa)
-		dsaref["moreinfo"] = ""
+		### Definition block: Metadata, Notes, Criteria
+		### TODO: Replace DSA id with unique id
+		definition = self.__createXMLElement ("definition", attrs = {"id" : "oval:org.debian:def:%s" % self.__trimzero(dsa), "version" : "1", "class" : "vulnerability"})
+		
+		### Definition : Metadata : title, affected, reference, description ###
+		metadata = self.__createXMLElement ("metadata")
+		metadata.appendChild (self.__createXMLElement ("title", dsaref["description"]))
 	
-	if not dsaref.has_key("secrefs"):
-		logging.log(logging.WARNING, "DSA %s: Secrefs information missed." % dsa)
-		dsaref["secrefs"] = ""
-
-	doc = xml.dom.minidom.Document ()
+		### Definition : Metadata : Affected : platform, product ###
+		affected = self.__createXMLElement ("affected", attrs = {"family" : "unix"})
+		for platform in dsaref["release"]:
+			affected.appendChild ( self.__createXMLElement ("platform", "Debian GNU/Linux %s" % platform))
+		affected.appendChild ( self.__createXMLElement ("product", dsaref.get("packages")))
+			
+		metadata.appendChild (affected)
+		### Definition : Metadata : Affected : END ###
 	
-	### Definition block: Metadata, Notes, Criteria
-	### TODO: Replace DSA id with unique id
-	definition = __createXMLElement ("definition", attrs = {"id" : "oval:org.debian:def:%s" % __trimzero(dsa), "version" : "1", "class" : "vulnerability"})
+		refpatern = re.compile (r'((CVE|CAN)-[\d-]+)')
+		for ref in dsaref.get("secrefs").split(" "):
+			result = refpatern.search(ref)
+			if result:
+				(ref_id, source) = result.groups()
+				metadata.appendChild ( self.__createXMLElement ("reference", attrs = {"source" : source, "ref_id" : ref_id, "ref_url" : "http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s" % ref_id}) )
+		
+		#TODO: move this info to other place
+		metadata.appendChild ( self.__createXMLElement ("description", "What information can i put there?"))
+		debianMetadata = self.__createXMLElement ("debian")
+		if dsaref.has_key("date"):
+			debianMetadata.appendChild ( self.__createXMLElement ("date", dsaref["date"]) )
+		debianMetadata.appendChild ( self.__createXMLElement ("moreinfo", dsaref["moreinfo"]) )
+		metadata.appendChild (debianMetadata)
+		definition.appendChild ( metadata )
 	
-	### Definition : Metadata : title, affected, reference, description ###
-	metadata = __createXMLElement ("metadata")
-	metadata.appendChild (__createXMLElement ("title", dsaref["description"]))
-
-	### Definition : Metadata : Affected : platform, product ###
-	affected = __createXMLElement ("affected", attrs = {"family" : "unix"})
-	for platform in dsaref["release"]:
-		affected.appendChild ( __createXMLElement ("platform", "Debian GNU/Linux %s" % platform))
-	affected.appendChild ( __createXMLElement ("product", dsaref.get("packages")))
+		### Definition : Criteria ###
+		if len(dsaref["release"]) > 1:
+			#f we have more than one release - generate additional criteria section
+			platformCriteria = self.__createXMLElement ("criteria", attrs = {"comment" : "Platform section", "operator" : "OR"})
+			definition.appendChild (platformCriteria)
+		else:
+			platformCriteria = definition
 		
-	metadata.appendChild (affected)
-	### Definition : Metadata : Affected : END ###
-
-	refpatern = re.compile (r'((CVE|CAN)-[\d-]+)')
-	for ref in dsaref.get("secrefs").split(" "):
-		result = refpatern.search(ref)
-		if result:
-			(ref_id, source) = result.groups()
-			metadata.appendChild ( __createXMLElement ("reference", attrs = {"source" : source, "ref_id" : ref_id, "ref_url" : "http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s" % ref_id}) )
+		for platform in dsaref["release"]:
+			data = dsaref["release"][platform]
+			platformCriteria.appendChild (self.createPlatformDefinition(platform, data, dsa))
+			
+		### Definition : Criteria END ###
 	
-	#TODO: move this info to other place
-	metadata.appendChild ( __createXMLElement ("description", "What information can i put there?"))
-	debianMetadata = __createXMLElement ("debian")
-	if dsaref.has_key("date"):
-		debianMetadata.appendChild ( __createXMLElement ("date", dsaref["date"]) )
-	debianMetadata.appendChild ( __createXMLElement ("moreinfo", dsaref["moreinfo"]) )
-	metadata.appendChild (debianMetadata)
-	definition.appendChild ( metadata )
-
-	### Definition : Criteria ###
-	if len(dsaref["release"]) > 1:
-		#f we have more than one release - generate additional criteria section
-		platformCriteria = __createXMLElement ("criteria", attrs = {"comment" : "Platform section", "operator" : "OR"})
-		definition.appendChild (platformCriteria)
-	else:
-		platformCriteria = definition
+		return (definition)
 	
-	for platform in dsaref["release"]:
-		data = dsaref["release"][platform]
-		platformCriteria.appendChild (createPlatformDefinition(platform, data, dsa))
+	def createOVALDefinitions (self, dsaref):
+		""" Generate XML OVAL definition tree for range of DSA
 		
-	### Definition : Criteria END ###
-
-	return (definition)
-
-def createOVALDefinitions (dsaref):
-	""" Generate XML OVAL definition tree for range of DSA
+			Generate namespace section and use other functions to generate definitions,
+			tests, objects and states subsections.
+			
+			return -- Generated OVAL XML definition 
+		"""
+		doc = xml.dom.minidom.Document ()
 	
-		Generate namespace section and use other functions to generate definitions,
-		tests, objects and states subsections.
+		root = self.__createXMLElement ("oval_definitions", 
+				attrs= {
+					"xsi:schemaLocation" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#independent /usr/share/ovaldi/xml/independent-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#linux /usr/share/ovaldi/xml/linux-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix /usr/share/ovaldi/xml/unix-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5 /usr/share/ovaldi/xml/oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 /usr/share/ovaldi/xml/oval-common-schema.xsd",
+					"xmlns:xsi" 		: "http://www.w3.org/2001/XMLSchema-instance",
+					"xmlns:ind-def " 	: "http://oval.mitre.org/XMLSchema/oval-definitions-5#independent",
+					"xmlns:linux-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#linux",
+					"xmlns:oval-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5",
+					"xmlns:unix-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#unix",
+					"xmlns" 				: "http://oval.mitre.org/XMLSchema/oval-definitions-5",
+					"xmlns:oval" 		: "http://oval.mitre.org/XMLSchema/oval-common-5"
+				}
+				)
+		doc.appendChild (root)
+		root.appendChild ( self.__createGeneratorHeader () )
 		
-		return -- Generated OVAL XML definition 
-	"""
-	doc = xml.dom.minidom.Document ()
-
-	root = __createXMLElement ("oval_definitions", 
-			attrs= {
-				"xsi:schemaLocation" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#independent /usr/share/ovaldi/xml/independent-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#linux /usr/share/ovaldi/xml/linux-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix /usr/share/ovaldi/xml/unix-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5 /usr/share/ovaldi/xml/oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 /usr/share/ovaldi/xml/oval-common-schema.xsd",
-				"xmlns:xsi" 		: "http://www.w3.org/2001/XMLSchema-instance",
-				"xmlns:ind-def " 	: "http://oval.mitre.org/XMLSchema/oval-definitions-5#independent",
-				"xmlns:linux-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#linux",
-				"xmlns:oval-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5",
-				"xmlns:unix-def" : "http://oval.mitre.org/XMLSchema/oval-definitions-5#unix",
-				"xmlns" 				: "http://oval.mitre.org/XMLSchema/oval-definitions-5",
-				"xmlns:oval" 		: "http://oval.mitre.org/XMLSchema/oval-common-5"
-			}
-			)
-	doc.appendChild (root)
-	root.appendChild ( __createGeneratorHeader () )
+		definitions = doc.createElement ("definitions")
+		
+		keyids = dsaref.keys()
+		keyids.sort()
+		for dsa in keyids:
+			try:
+				definitions.appendChild (self.createDefinition(dsa, dsaref[dsa]))
+			except DSAFormatException:
+				logging.log (logging.ERROR, "DSA %s: Bad data file. Ignore this DSA." % dsa)
+				
+		root.appendChild (definitions)
+		
+		root.appendChild(self.tests)
+		root.appendChild(self.objects)
+		root.appendChild(self.states)
 	
-	definitions = doc.createElement ("definitions")
+		return doc
 	
-	keyids = dsaref.keys()
-	keyids.sort()
-	for dsa in keyids:
-		try:
-			definitions.appendChild (createDefinition(dsa, dsaref[dsa]))
-		except DSAFormatException:
-			logging.log (logging.ERROR, "DSA %s: Bad data file. Ignore this DSA." % dsa)
-			
-	root.appendChild (definitions)
-	
-	root.appendChild(tests)
-	root.appendChild(objects)
-	root.appendChild(states)
-
-	return doc
-
-def printOVALDefinitions (doc):
-	if doc.getElementsByTagName("definitions")[0].hasChildNodes():
-		xml.dom.ext.PrettyPrint(doc)
+	def printOVALDefinitions (self, doc):
+		if doc.getElementsByTagName("definitions")[0].hasChildNodes():
+			xml.dom.ext.PrettyPrint(doc)




More information about the Oval-commits mailing list