5 from sfatables.globals import *
6 from sfatables.pretty import Pretty
7 from sfatables.command import Command
12 self.options = [('-L','--list')]
13 self.help = 'List a chain'
20 def get_info(self, type, xmlextension_path):
21 xmldoc = libxml2.parseFile(xmlextension_path)
22 p = xmldoc.xpathNewContext()
24 ext_name_node = p.xpathEval("/%s/@name"%type)
25 ext_name = ext_name_node[0].content
27 name_nodes = p.xpathEval("//rule/argument[value!='']/name")
28 value_nodes = p.xpathEval("//rule/argument[value!='']/value")
29 element_nodes = p.xpathEval("//argument[value!='']/parent::rule/@element")
31 print element_nodes, type, xmlextension_path
32 if (len(element_nodes)>1):
33 raise Exception("Invalid rule %s contains multiple elements."%xmlextension_path)
38 element = element_nodes[0].content
40 names = [n.content for n in name_nodes]
41 values = [v.content for v in value_nodes]
43 name_values = zip(names,values)
44 name_value_pairs = map(lambda (n,v):n+'='+v, name_values)
46 argument_str = ",".join(name_value_pairs)
51 return {'name':ext_name, 'arguments':argument_str, 'element':element}
53 def get_rule_list(self, chain_dir_path):
54 broken_semantics = os.walk(chain_dir_path)
57 for (root, dirs, files) in broken_semantics:
59 if (file.startswith('sfatables')):
60 (magic,number,type) = file.split('-')
61 rule_numbers[int(number)]=1
63 rule_list = rule_numbers.keys()
67 def call(self, command_options, match_options, target_options):
68 if (len(command_options.args) < 1):
69 print "Please specify the name of the chain you would like to list, e.g. sfatables -L INCOMING."
72 chain = command_options.args[0]
73 chain_dir = os.path.join(sfatables_config, chain)
75 rule_list = self.get_rule_list(chain_dir)
77 pretty = Pretty(['Rule','Match','Arguments','Target','Element','Arguments'])
79 for number in rule_list:
80 match_file = "sfatables-%d-%s"%(number,'match')
81 target_file = "sfatables-%d-%s"%(number,'target')
83 match_path = sfatables_config + '/' + chain + '/' + match_file
84 target_path = sfatables_config + '/' + chain + '/' + target_file
86 match_info = self.get_info ('match',match_path)
87 target_info = self.get_info ('target',target_path)
89 pretty.push_row(["%d"%number,
91 match_info['arguments'],
93 target_info['element'],
94 target_info['arguments']])