(no commit message)
[sfa.git] / sfatables / commands / List.py
1 import os, time
2 import libxml2
3 import pdb
4
5 from globals import *
6 from 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
20     def get_info(self, xmlextension_path):
21         xmldoc = libxml2.parseFile(xmlextension_path)
22         p = xmldoc.xpathNewContext()
23         
24         ext_name_node = p.xpathEval("/match/@name")
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
30         names = [n.content for n in name_nodes]
31         values = [v.content for v in value_nodes]
32
33         name_values = zip(names,values)
34         name_value_pairs = map(lambda (n,v):n+'='+v, name_values)
35
36         argument_str = ",".join(name_value_pairs)
37
38         p.xpathFreeContext()
39         xmldoc.freeDoc()
40
41         return {'name':ext_name, 'arguments':'argument_str'}
42
43     def call(self, command_options, match_options, target_options):
44         chain = command_options.args[0]
45         chain_dir = sfatables_config + "/" + chain
46         rule_list = []
47         broken_semantics = os.walk(chain_dir)
48         for (root, dirs, files) in broken_semantics:
49             for file in files:
50                 if (file.startswith('sfatables')):
51                     (magic,number,type) = file.split('-')
52                     rule_list.append(int(number))
53
54         rule_list.sort()
55
56         pretty = Pretty(['Rule','Match','Target','Arguments'])
57
58         for number in rule_list:
59             match_file = "sfatables-%d-%s"%(number,'match')
60             target_file = "sfatables-%d-%s"%(number,'target')
61
62             match_path = sfatables_config + '/' + chain + '/' + match_file
63             target_path = sfatables_config + '/' + chain + '/' + target_file
64             
65             match_info = self.get_info (match_path)
66             target_info = self.get_info (target_path)
67
68             pretty.push_row(["%d"%number,  match_info['name'], match_info['arguments'], target_info['arguments']])
69         
70         
71         pretty.pprint()
72
73             
74
75
76
77
78
79