changeset 277:05caa87196e6

new xml log plugin
author Goffi <goffi@goffi.org>
date Tue, 01 Feb 2011 23:07:08 +0100
parents a00e87d48213
children 56d9c4cfdcfa
files src/plugins/plugin_misc_xmllog.py src/sat.tac
diffstat 2 files changed, 91 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/plugins/plugin_misc_xmllog.py	Tue Feb 01 23:07:08 2011 +0100
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+SàT plugin for managing raw XML log 
+Copyright (C) 2011  Jérôme Poisson (goffi@goffi.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from logging import debug, info, error
+from twisted.words.protocols.jabber.xmlstream import XmlStream
+from twisted.words.xish import domish
+
+PLUGIN_INFO = {
+"name": "Raw XML log Plugin",
+"import_name": "XmlLog",
+"type": "Misc",
+"protocols": [],
+"dependencies": [],
+"main": "XmlLog",
+"handler": "no",
+"description": _("""Send raw XML logs to bridge""")
+}
+
+class LoggingXmlStream(XmlStream):
+    """This class send the raw XML to the Bridge, for logging purpose"""
+
+    def send(self, obj):
+        if isinstance(obj,basestring):
+            log=unicode(obj)
+        elif isinstance(obj, domish.Element):
+            log=obj.toXml()
+        else:
+            error(_('INTERNAL ERROR: Unmanaged XML type'))
+        info('OUT data for %s: %s' % (self._profile, log))
+        self._host.bridge.XmlLog("OUT", log, self._profile)
+        return XmlStream.send(self, obj)
+
+    def dataReceived(self, data):
+        info('IN data for %s: %s' % (self._profile, data.decode('utf-8')))
+        self._host.bridge.XmlLog("IN", data.decode('utf-8'), self._profile)
+        return XmlStream.dataReceived(self, data)
+    
+
+class XmlLog():
+    
+    params = """
+    <params>
+    <general>
+    <category name="Debug">
+        <param name="Xml log" label="%(label_xmllog)s" value="false" type="bool" />
+    </category>
+    </general>
+    </params>
+    """ % {"label_xmllog": _("Activate XML log")}
+
+    def __init__(self, host):
+        info(_("Plugin XML Log initialization"))
+        self.host = host
+        
+        #parameters
+        host.memory.importParams(self.params)
+        
+        #bridge
+        host.bridge.addSignal("XmlLog", ".communication", signature='sss') #args: direction("IN" or "OUT"), xml_data, profile
+        
+        do_log = bool(self.host.memory.getParamA("Xml log", "Debug"))
+        if do_log:
+            info(_("XML log activated"))
+            host.trigger.add("XML Initialized", self.logXml)
+       
+    def logXml(self, xmlstream, profile):
+        xmlstream.__class__ = LoggingXmlStream
+        xmlstream._profile = profile
+        xmlstream._host = self.host
+        return True
--- a/src/sat.tac	Sun Jan 30 22:54:58 2011 +0100
+++ b/src/sat.tac	Tue Feb 01 23:07:08 2011 +0100
@@ -88,10 +88,13 @@
         info (_("********** [%s] CONNECTED **********") % self.profile)
         self.streamInitialized()
         self.host_app.bridge.connected(self.profile) #we send the signal to the clients
+   
 
     def streamInitialized(self):
         """Called after _authd"""
         debug (_("XML stream is initialized"))
+        if not self.host_app.trigger.point("XML Initialized", self.xmlstream, self.profile):
+            return
         self.keep_alife = task.LoopingCall(self.xmlstream.send, " ")  #Needed to avoid disconnection (specially with openfire)
         self.keep_alife.start(180)