Added a "negate result" option
[sfa.git] / sfatables / commands / List.py
index 3a0bb39..fe44432 100644 (file)
@@ -16,12 +16,11 @@ class List(Command):
     def __init__(self):
         return
 
-
-    def get_info(self, xmlextension_path):
+    def get_info(self, type, xmlextension_path):
         xmldoc = libxml2.parseFile(xmlextension_path)
         p = xmldoc.xpathNewContext()
         
-        ext_name_node = p.xpathEval("/match/@name")
+        ext_name_node = p.xpathEval("/%s/@name"%type)
         ext_name = ext_name_node[0].content
 
         name_nodes = p.xpathEval("//rule/argument[value!='']/name")
@@ -38,22 +37,33 @@ class List(Command):
         p.xpathFreeContext()
         xmldoc.freeDoc()
 
-        return {'name':ext_name, 'arguments':'argument_str'}
+        return {'name':ext_name, 'arguments':argument_str}
+
+    def get_rule_list(self, chain_dir_path):
+        broken_semantics = os.walk(chain_dir_path)
+        rule_numbers = {}
 
-    def call(self, command_options, match_options, target_options):
-        chain = command_options.args[0]
-        chain_dir = sfatables_config + "/" + chain
-        rule_list = []
-        broken_semantics = os.walk(chain_dir)
         for (root, dirs, files) in broken_semantics:
             for file in files:
                 if (file.startswith('sfatables')):
                     (magic,number,type) = file.split('-')
-                    rule_list.append(int(number))
+                    rule_numbers[int(number)]=1
 
+        rule_list = rule_numbers.keys()
         rule_list.sort()
+        return rule_list
+
+    def call(self, command_options, match_options, target_options):
+        if (len(command_options.args) < 1):
+            print "Please specify the name of the chain you would like to list, e.g. sfatables -L INCOMING."
+            return
+
+        chain = command_options.args[0]
+        chain_dir = sfatables_config + "/" + chain
+
+        rule_list = self.get_rule_list(chain_dir)
 
-        pretty = Pretty(['Rule','Match','Target','Arguments'])
+        pretty = Pretty(['Rule','Match','Arguments','Target','Arguments'])
 
         for number in rule_list:
             match_file = "sfatables-%d-%s"%(number,'match')
@@ -62,10 +72,10 @@ class List(Command):
             match_path = sfatables_config + '/' + chain + '/' + match_file
             target_path = sfatables_config + '/' + chain + '/' + target_file
             
-            match_info = self.get_info (match_path)
-            target_info = self.get_info (target_path)
+            match_info = self.get_info ('match',match_path)
+            target_info = self.get_info ('target',target_path)
 
-            pretty.push_row(["%d"%number,  match_info['name'], match_info['arguments'], target_info['arguments']])
+            pretty.push_row(["%d"%number,  match_info['name'], match_info['arguments'], target_info['name'], target_info['arguments']])
         
         
         pretty.pprint()