X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfatables%2Fcommands%2FAdd.py;h=f5193eb6d8a7fe5ca558c2521b710baa7358a9f3;hb=6c41d17ff2f98c362ad1db112d22bede960d8202;hp=ef2b26e2b2d3f876cb4cc9ffe71d20db3f1f7b7e;hpb=dc1c09e790d507ba6f2258459374a4dcda7decce;p=sfa.git diff --git a/sfatables/commands/Add.py b/sfatables/commands/Add.py index ef2b26e2..f5193eb6 100644 --- a/sfatables/commands/Add.py +++ b/sfatables/commands/Add.py @@ -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,16 +12,58 @@ class Add(Command): def __init__(self): return - def call(self, command_options, match_options, target_options): - filename = match_dir + "/"+match_options.name+".xml" + def getnextfilename(self,type,chain): + dir = sfatables_config + "/"+chain; + last_rule_number = 0 + + for (root, dirs, files) in os.walk(dir): + for file in files: + if (file.startswith('sfatables-') and file.endswith(type)): + 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+1,type) + + def call_gen(self, chain, type, dir, options): + filename = dir + "/"+options.name+".xml" xmldoc = libxml2.parseFile(filename) - p = self.xmldoc.xpathNewContext() + p = xmldoc.xpathNewContext() + + supplied_arguments = options.arguments + if (hasattr(options,'element') and options.element): + element = options.element + else: + element='*' - context = p.xpathEval("//rule/argument[name='user-hrn']") - pdb.set_trace() + for option in supplied_arguments: + option_name = option['name'] + option_value = getattr(options,option_name) + if (hasattr(options,option_name)): + context = p.xpathEval("//rule[@element='%s' or @element='*']/argument[name='%s']"%(element, option_name)) + if (not context): + raise Exception('Unknown option %s for match %s and element %s'%(option,option['name'], element)) + else: + # Add the value of option + valueNode = libxml2.newNode('value') + valueNode.addContent(option_value) + context[0].addChild(valueNode) + filename = self.getnextfilename(type,chain) + file_path = sfatables_config + '/' + chain + '/' + filename + xmldoc.saveFile(file_path) + p.xpathFreeContext() + xmldoc.freeDoc() return True + def call(self, command_options, match_options, target_options): + chain = command_options.args[0] + ret = self.call_gen(chain, 'match',match_dir, match_options) + if (ret): + ret = self.call_gen(chain, 'target',target_dir, target_options) + + return ret