b841a933580ac36140cf8d371531089fab19e750
[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     options = [('-L','--list')]
11     help = 'List a chain'
12     key='list_rule'
13     matches = False
14     targets = False
15
16     def __init__(self):
17         return
18
19     def get_info(self, type, xmlextension_path):
20         xmldoc = libxml2.parseFile(xmlextension_path)
21         p = xmldoc.xpathNewContext()
22         
23         ext_name_node = p.xpathEval("/%s/@name"%type)
24         ext_name = ext_name_node[0].content
25
26         name_nodes = p.xpathEval("//rule/argument[value!='']/name")
27         value_nodes = p.xpathEval("//rule/argument[value!='']/value")
28         element_nodes = p.xpathEval("//argument[value!='']/parent::rule/@element")
29
30         if (len(element_nodes)>1):
31             raise Exception("Invalid rule %s contains multiple elements."%xmlextension_path)
32
33         element = element_nodes[0].content
34
35         names = [n.content for n in name_nodes]
36         values = [v.content for v in value_nodes]
37
38         name_values = zip(names,values)
39         name_value_pairs = map(lambda (n,v):n+'='+v, name_values)
40
41         argument_str = ",".join(name_value_pairs)
42
43         p.xpathFreeContext()
44         xmldoc.freeDoc()
45
46         return {'name':ext_name, 'arguments':argument_str, 'element':element}
47
48     def get_rule_list(self, chain_dir_path):
49         broken_semantics = os.walk(chain_dir_path)
50         rule_numbers = {}
51
52         for (root, dirs, files) in broken_semantics:
53             for file in files:
54                 if (file.startswith('sfatables')):
55                     (magic,number,type) = file.split('-')
56                     rule_numbers[int(number)]=1
57
58         rule_list = rule_numbers.keys()
59         rule_list.sort()
60         return rule_list
61
62     def call(self, command_options, match_options, target_options):
63         if (len(command_options.args) < 1):
64             print "Please specify the name of the chain you would like to list, e.g. sfatables -L INCOMING."
65             return
66
67         chain = command_options.args[0]
68         chain_dir = sfatables_config + "/" + chain
69
70         rule_list = self.get_rule_list(chain_dir)
71
72         pretty = Pretty(['Rule','Match','Arguments','Target','Element','Arguments'])
73
74         for number in rule_list:
75             match_file = "sfatables-%d-%s"%(number,'match')
76             target_file = "sfatables-%d-%s"%(number,'target')
77
78             match_path = sfatables_config + '/' + chain + '/' + match_file
79             target_path = sfatables_config + '/' + chain + '/' + target_file
80             
81             match_info = self.get_info ('match',match_path)
82             target_info = self.get_info ('target',target_path)
83
84             pretty.push_row(["%d"%number,  match_info['name'], match_info['arguments'], target_info['name'], target_info['element'], target_info['arguments']])
85         
86         
87         pretty.pprint()
88
89             
90
91
92
93
94
95