86d52a2295f226e9ff084c11281549ee2b4fee75
[sfa.git] / sfatables / commands / List.py
1 import os, time
2 import libxml2
3 import pdb
4
5 from sfatables.globals import *
6 from sfatables.pretty import Pretty
7 from sfatables.command import Command
8
9 class List(Command):
10     
11     def __init__(self):
12         self.options = [('-L','--list')]
13         self.help = 'List a chain'
14         self.key='list_rule'
15         self.matches = False
16         self.targets = False
17
18         return
19
20     def get_info(self, type, xmlextension_path):
21         xmldoc = libxml2.parseFile(xmlextension_path)
22         p = xmldoc.xpathNewContext()
23         
24         ext_name_node = p.xpathEval("/%s/@name"%type)
25         ext_name = ext_name_node[0].content
26
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")
30
31         print element_nodes, type, xmlextension_path
32         if (len(element_nodes)>1):
33             raise Exception("Invalid rule %s contains multiple elements."%xmlextension_path)
34
35         element = []
36         argument_str = ""
37         if element_nodes:
38             element = element_nodes[0].content
39
40             names = [n.content for n in name_nodes]
41             values = [v.content for v in value_nodes]
42
43             name_values = zip(names,values)
44             name_value_pairs = map(lambda (n,v):n+'='+v, name_values)
45
46             argument_str = ",".join(name_value_pairs)
47
48         p.xpathFreeContext()
49         xmldoc.freeDoc()
50
51         return {'name':ext_name, 'arguments':argument_str, 'element':element}
52
53     def get_rule_list(self, chain_dir_path):
54         broken_semantics = os.walk(chain_dir_path)
55         rule_numbers = {}
56
57         for (root, dirs, files) in broken_semantics:
58             for file in files:
59                 if (file.startswith('sfatables')):
60                     (magic,number,type) = file.split('-')
61                     rule_numbers[int(number)]=1
62
63         rule_list = rule_numbers.keys()
64         rule_list.sort()
65         return rule_list
66
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."
70             return
71
72         chain = command_options.args[0]
73         chain_dir = os.path.join(sfatables_config, chain)
74
75         rule_list = self.get_rule_list(chain_dir)
76
77         pretty = Pretty(['Rule','Match','Arguments','Target','Element','Arguments'])
78
79         for number in rule_list:
80             match_file = "sfatables-%d-%s"%(number,'match')
81             target_file = "sfatables-%d-%s"%(number,'target')
82
83             match_path = sfatables_config + '/' + chain + '/' + match_file
84             target_path = sfatables_config + '/' + chain + '/' + target_file
85
86             match_info = self.get_info ('match',match_path)
87             target_info = self.get_info ('target',target_path)
88
89             pretty.push_row(["%d"%number,
90                              match_info['name'],
91                              match_info['arguments'],
92                              target_info['name'],
93                              target_info['element'],
94                              target_info['arguments']])
95
96         pretty.pprint()
97
98
99
100
101
102
103
104