[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