(no commit message)
authorSapan Bhatia <sapanb@cs.princeton.edu>
Tue, 15 Sep 2009 17:48:47 +0000 (17:48 +0000)
committerSapan Bhatia <sapanb@cs.princeton.edu>
Tue, 15 Sep 2009 17:48:47 +0000 (17:48 +0000)
sfatables/exec.py
sfatables/globals.py [new file with mode: 0644]
sfatables/processors/hrn.xsl
sfatables/xmlrule.py

index 0423850..303723e 100644 (file)
@@ -34,15 +34,23 @@ def main():
 
     rspec = """
 <rspec>
+    <context-input>
+        <sfa><user><hrn>plc.princeton.sapan</hrn></user></sfa>
+    </context-input>
+
     <sfatables-input>
         <rule>
+            <argument>
+                <name>hrn</name>
+                <value>plc</value>
+            </argument>
             <argument>
                 <name>whitelist</name>
                 <value>plc.princeton</value>
             </argument>
             <argument>
                 <name>blacklist</name>
-                <value>plc.princeton.planetlab-04</value>
+                <value>plc.tp</value>
             </argument>
         </rule>
     </sfatables-input>
@@ -52,7 +60,7 @@ def main():
             <node name="plc.princeton.planetlab-02"/>
             <node name="plc.princeton.planetlab-03"/>
             <node name="plc.princeton.planetlab-04"/>
-            <node name="plc.mit.csail.planetlab3"/>
+            <node name="plc.tp.planetlab3"/>
         </nodespec>
     </request>
 </rspec>
@@ -63,8 +71,7 @@ def main():
     print "%d rules loaded for OUTGOING chain\n"%len(outgoing.sorted_rule_list)
 
     newrspec = incoming.apply(rspec)
-    import pdb
-    pdb.set_trace()
+    print newrspec
     return
 
 if __name__=="__main__":
diff --git a/sfatables/globals.py b/sfatables/globals.py
new file mode 100644 (file)
index 0000000..676722b
--- /dev/null
@@ -0,0 +1,3 @@
+sfatables_config = '/etc/sfatables'
+match_dir = 'matches'
+target_dir = 'targets'
index 29988a5..65e85c6 100644 (file)
@@ -2,16 +2,22 @@
 <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:variable name="context-hrn" select="hrn"/>
+
+    <!-- Magic sauce -->
+
+    <xsl:template match="@* | node()">
+            <xsl:apply-templates select="@* | node()"/>
+    </xsl:template>
+
     <xsl:template match="user">
                     <xsl:choose>
                     <xsl:when test="starts-with($context-hrn, hrn)">
-                        True <!--Match -->
+                        <result verdict="True"/> <!--Match -->
                     </xsl:when>
                     <xsl:otherwise>
-                        False <!-- No match -->
+                        <result verdict="False"/> <!-- No match -->
                     </xsl:otherwise>
                 </xsl:choose>
-        <xsl:value-of select="$result"/>
     </xsl:template>
 
 </xsl:stylesheet>
index b0f6fde..9c43e0f 100644 (file)
@@ -12,7 +12,7 @@ class XMLRule:
     processors = {'match':None,'target':None}
     context = {'match':None,'target':None}
 
-    def apply_processor(self, type, rspec):
+    def apply_processor(self, type, rspec, output_xpath_filter=None):
         processor = self.processors[type]
 
         # XXX TO CLEAN UP
@@ -23,19 +23,31 @@ class XMLRule:
         style = libxslt.parseStylesheetDoc(styledoc)
         doc = libxml2.parseDoc(rspec)
         result = style.applyStylesheet(doc, None)
-        stylesheet_result = style.saveResultToString(result)
+        if (output_xpath_filter):
+            p = result.xpathNewContext()
+            xpath_result = p.xpathEval(output_xpath_filter)
+            if (xpath_result == []):
+                raise Exception("Could not apply processor %s."%processor)
+
+            stylesheet_result = xpath_result[0].content
+            p.xpathFreeContext()
+        else:
+            stylesheet_result = style.saveResultToString(result)
         style.freeStylesheet()
         doc.freeDoc()
         result.freeDoc()
 
+
         return stylesheet_result
 
     def match(self, rspec):
-        match_result = self.apply_processor('match',rspec) 
+        import pdb
+        pdb.set_trace()
+        match_result = self.apply_processor('match',rspec,"//result/@verdict") 
         return (match_result=='True')
 
     def target(self, rspec):
-        target_result = self.apply_processor('target',rspec)
+        target_result = self.apply_processor('target',rspec,None)
         return target_result
 
     def apply_interpreted(self, rspec):