(no commit message)
[sfa.git] / sfatables / commands / Add.py
index ef2b26e..b62ad6c 100644 (file)
@@ -1,7 +1,7 @@
 import os, time
+import libxml2
 from sfatables.command import Command
-
-import sfatables.globals
+from sfatables.globals import *
 
 class Add(Command):
     options = [('-A','--add')]
@@ -12,15 +12,48 @@ class Add(Command):
     def __init__(self):
         return
 
+    def getnextfilename(self,type,chain):
+        dir = sfatables_config + chain;
+        last_rule_number = 1
+
+        for (root, dirs, files) in os.walk(dir):
+            for file in files:
+                if (file.startswith('sfatables-')):
+                    number_str = file.split('-')[1]
+                    number = int(number_str)
+                    if (number>last_rule_number):
+                        last_rule_number = number
+
+        return "sfatables-%d-%s"%(last_rule_number,type)
+
+
+
     def call(self, command_options, match_options, target_options):
-        filename = match_dir + "/"+match_options.name+".xml"
+        filename = match_dir + "/"+match_options.match_name+".xml"
         xmldoc = libxml2.parseFile(filename)
     
-        p = self.xmldoc.xpathNewContext()
-
-        context = p.xpathEval("//rule/argument[name='user-hrn']")
-        pdb.set_trace()
-
+        p = xmldoc.xpathNewContext()
+
+        supplied_arguments = match_options.arguments
+        for option in supplied_arguments:
+            option_name = option['name']
+            option_value = getattr(match_options,option_name)
+
+            if (hasattr(match_options,option_name)):
+                context = p.xpathEval("//rule/argument[name='%s']"%option_name)
+                if (not context):
+                    raise Exception('Unknown option %s for match %s'%(option,option['name']))
+                else:
+                    # Add the value of option
+                    valueNode = libxml2.newNode('value')
+                    valueNode.addContent(option_value)
+                    context[0].addChild(valueNode)
+
+        chain = command_options.args[0]
+        filename = self.getnextfilename('match',chain)
+        xmldoc.saveFile(filename)
+        p.xpathFreeContext()
+        xmldoc.freeDoc()
 
 
         return True