+import libxml2
+from sfatables.globals import *
+
+class Xmlrule:
+ rule_number = None
+ chain = None
+ xmldoc = None
+
+ arguments = {'match':None,'target':None}
+ processors = {'match':None,'target':None}
+ context = {'match':None,'target':None}
+
+ def load_xml_extension (self, type, chain, rule_number):
+ filename = sfatables_config+"/"+chain+"/"+"sfatables-%d-%s.xml"%(rule_number,type)
+
+ self.xmldoc = libxml2.parseFile(filename)
+ p = self.xmldoc.xpathNewContext()
+
+ context = p.xpathEval('//context/@select')
+ self.context[type] = context[0].content
+
+ processor = p.xpathEval('//processor/@filename')
+
+ self.processor[type] = processor[0].content
+ self.arguments[type] = p.xpathEval('//rule')
+
+ p.xpathFreeContext()
+
+ return
+
+ def wrap_rspec (self, type, rspec):
+ argument = self.arguments[type]
+ p = rspec.xmldoc.xpathNewContext()
+ root_node = p.xpathEval('/RSpec')
+ if (!root_node or !len(root_node)):
+ raise Exception('An evil aggregate manager sent me a malformed RSpec. Please see the stack trace to identify it.')
+
+ root_node.addChild(arguments[type])
+ return rspec
+
+ def __init__(self, chain, rule_number):
+
+ self.load_xml_extension('match', chain, rule_number)
+ self.load_xml_extension('target',chain, rule_number)
+ self.rule_number = rule_number
+ self.chain = chain
+
+ return
+
+ def free(self):
+ self.xmldoc.freeDoc()