# HG changeset patch # User Goffi # Date 1296598028 -3600 # Node ID 05caa87196e687546f2b1699711e4945f422716a # Parent a00e87d482131553c4cc4784782646f041409244 new xml log plugin diff -r a00e87d48213 -r 05caa87196e6 src/plugins/plugin_misc_xmllog.py --- /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 . +""" + +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 = """ + + + + + + + + """ % {"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 diff -r a00e87d48213 -r 05caa87196e6 src/sat.tac --- 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)