6 from pretty import Pretty
7 from sfatables.command import Command
10 options = [('-L','--list')]
20 def get_info(self, xmlextension_path):
21 xmldoc = libxml2.parseFile(xmlextension_path)
22 p = xmldoc.xpathNewContext()
24 ext_name_node = p.xpathEval("/match/@name")
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")
30 names = [n.content for n in name_nodes]
31 values = [v.content for v in value_nodes]
33 name_values = zip(names,values)
34 name_value_pairs = map(lambda (n,v):n+'='+v, name_values)
36 argument_str = ",".join(name_value_pairs)
41 return {'name':ext_name, 'arguments':'argument_str'}
43 def call(self, command_options, match_options, target_options):
44 chain = command_options.args[0]
45 chain_dir = sfatables_config + "/" + chain
47 broken_semantics = os.walk(chain_dir)
48 for (root, dirs, files) in broken_semantics:
50 if (file.startswith('sfatables')):
51 (magic,number,type) = file.split('-')
52 rule_list.append(int(number))
56 pretty = Pretty(['Rule','Match','Target','Arguments'])
58 for number in rule_list:
59 match_file = "sfatables-%d-%s"%(number,'match')
60 target_file = "sfatables-%d-%s"%(number,'target')
62 match_path = sfatables_config + '/' + chain + '/' + match_file
63 target_path = sfatables_config + '/' + chain + '/' + target_file
65 match_info = self.get_info (match_path)
66 target_info = self.get_info (target_path)
68 pretty.push_row(["%d"%number, match_info['name'], match_info['arguments'], target_info['arguments']])