3 from sfatables.command import Command
4 from sfatables.globals import *
7 options = [('-A','--add')]
8 help = 'Add a rule to a chain'
15 def getnextfilename(self,type,chain):
16 dir = sfatables_config + chain;
19 for (root, dirs, files) in os.walk(dir):
21 if (file.startswith('sfatables-')):
22 number_str = file.split('-')[1]
23 number = int(number_str)
24 if (number>last_rule_number):
25 last_rule_number = number
27 return "sfatables-%d-%s"%(last_rule_number+1,type)
29 def call(self, command_options, match_options, target_options):
30 filename = match_dir + "/"+match_options.match_name+".xml"
31 xmldoc = libxml2.parseFile(filename)
33 p = xmldoc.xpathNewContext()
35 supplied_arguments = match_options.arguments
36 for option in supplied_arguments:
37 option_name = option['name']
38 option_value = getattr(match_options,option_name)
40 if (hasattr(match_options,option_name)):
41 context = p.xpathEval("//rule/argument[name='%s']"%option_name)
45 raise Exception('Unknown option %s for match %s'%(option,option['name']))
47 # Add the value of option
48 valueNode = libxml2.newNode('value')
49 valueNode.addContent(option_value)
50 context[0].addChild(valueNode)
52 chain = command_options.args[0]
53 filename = self.getnextfilename('match',chain)
54 file_path = sfatables_config + '/' + chain + '/' + filename
55 xmldoc.saveFile(file_path)