plugin XEP-0198: Stream Management implementation:

- hooks can now be set in stream onElement and send methods
- xmllog refactored to use new hooks
- client.isConnected now uses transport.connected method
- fixed reconnection, SàT will now try to reconnect indefinitely until it success, unresolvable failure happen (e.g. invalid certificate), or explicit disconnection is requested (or a plugin change this behaviour)
- new triggers: "stream_hooks", "disconnecting", "disconnected", and "xml_init" (replace "XML Initialized")
This commit is contained in:
Goffi 2018-11-18 15:49:46 +01:00
commit 05b59775d0

View file

@ -23,7 +23,7 @@ from sat.core.log import getLogger
log = getLogger(__name__)
from twisted.words.xish import domish
from twisted.words.xish import xmlstream
from functools import partial
PLUGIN_INFO = {
C.PI_NAME: "Raw XML log Plugin",
@ -36,26 +36,6 @@ PLUGIN_INFO = {
C.PI_DESCRIPTION: _(u"""Send raw XML logs to bridge"""),
}
host = None
def send(self, obj):
global host
if isinstance(obj, basestring):
log = unicode(obj)
elif isinstance(obj, domish.Element):
log = obj.toXml()
else:
log.error(_(u"INTERNAL ERROR: Unmanaged XML type"))
host.bridge.xmlLog("OUT", log, self._profile)
return self._original_send(obj)
def onElement(self, element):
global host
host.bridge.xmlLog("IN", element.toXml(), self._profile)
return self._original_onElement(element)
class XmlLog(object):
@ -71,30 +51,32 @@ class XmlLog(object):
"label_xmllog": _("Activate XML log")
}
def __init__(self, host_):
def __init__(self, host):
log.info(_("Plugin XML Log initialization"))
global host
host = host_
# parameters
self.host = host
host.memory.updateParams(self.params)
# bridge
host.bridge.addSignal(
"xmlLog", ".plugin", signature="sss"
) # args: direction("IN" or "OUT"), xml_data, profile
self.do_log = host.memory.getParamA("Xml log", "Debug")
if self.do_log:
XmlStream = xmlstream.XmlStream
XmlStream._original_send = XmlStream.send
XmlStream._original_onElement = XmlStream.onElement
XmlStream.send = send
XmlStream.onElement = onElement
XmlStream._profile = ""
host.trigger.add("XML Initialized", self.setProfile)
log.info(_(u"XML log activated"))
host.trigger.add("stream_hooks", self.addHooks)
def setProfile(self, xmlstream, profile):
xmlstream._profile = profile
def addHooks(self, client, receive_hooks, send_hooks):
self.do_log = self.host.memory.getParamA("Xml log", "Debug")
if self.do_log:
receive_hooks.append(partial(self.onReceive, client=client))
send_hooks.append(partial(self.onSend, client=client))
log.info(_(u"XML log activated"))
return True
def onReceive(self, element, client):
self.host.bridge.xmlLog("IN", element.toXml(), client.profile)
def onSend(self, obj, client):
if isinstance(obj, basestring):
log = unicode(obj)
elif isinstance(obj, domish.Element):
log = obj.toXml()
else:
log.error(_(u"INTERNAL ERROR: Unmanaged XML type"))
self.host.bridge.xmlLog("OUT", log, client.profile)