[CalendarServer-changes] [2677] CalendarServer/branches/users/sagen/xmpp/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Thu Jul 10 16:56:36 PDT 2008
Revision: 2677
http://trac.macosforge.org/projects/calendarserver/changeset/2677
Author: sagen at apple.com
Date: 2008-07-10 16:56:36 -0700 (Thu, 10 Jul 2008)
Log Message:
-----------
TestJID will receive error messages, and can optionally receive debug messages (by sending "debug on")
Modified Paths:
--------------
CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py
CalendarServer/branches/users/sagen/xmpp/twistedcaldav/test/test_notify.py
Modified: CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py
===================================================================
--- CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py 2008-07-10 22:28:08 UTC (rev 2676)
+++ CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py 2008-07-10 23:56:36 UTC (rev 2677)
@@ -423,7 +423,7 @@
pubsubNS = 'http://jabber.org/protocol/pubsub'
- nodeConfiguration = {
+ nodeConf = {
'pubsub#deliver_payloads' : '0',
'pubsub#persist_items' : '0',
}
@@ -436,9 +436,9 @@
self.reactor = reactor
self.config = configOverride or config
+ self.sendDebugMessages = False
+
def enqueue(self, uri):
- self.log_debug("ENQUEUE %s" % (uri,))
-
if self.xmlStream is not None:
# Convert uri to node
nodeName = self.uriToNodeName(uri)
@@ -457,8 +457,12 @@
iq.send(to=self.settings['ServiceAddress'])
def responseFromPublish(self, nodeName, iq):
- if iq['type'] == 'error':
- self.log_debug("Error from pubsub")
+ if iq['type'] == 'result':
+ self.sendDebug("Node publish successful (%s)" % (nodeName,), iq)
+ else:
+ self.log_error("PubSub node publish error: %s" %
+ (iq.toXml().encode('ascii', 'replace')),)
+ self.sendDebug("Node publish failed (%s)" % (nodeName,), iq)
errorElement = None
pubsubElement = None
@@ -486,8 +490,13 @@
def responseFromCreate(self, nodeName, iq):
if iq['type'] == 'result':
+ self.sendDebug("Node creation successful (%s)" % (nodeName,), iq)
# now time to configure; fetch the form
self.requestConfigurationForm(nodeName)
+ else:
+ self.log_error("PubSub node creation error: %s" %
+ (iq.toXml().encode('ascii', 'replace')),)
+ self.sendError("Node creation failed (%s)" % (nodeName,), iq)
def requestConfigurationForm(self, nodeName):
if self.xmlStream is not None:
@@ -505,49 +514,108 @@
return None
def responseFromConfigurationForm(self, nodeName, iq):
- pubsubElement = self._getChild(iq, 'pubsub')
- if pubsubElement:
- configureElement = self._getChild(pubsubElement, 'configure')
- if configureElement:
- formElement = configureElement.firstChildElement()
- if formElement['type'] == 'form':
- # We've found the form; start building a response
- filledIq = IQ(self.xmlStream, type='set')
- filledPubSub = filledIq.addElement('pubsub',
- defaultUri=self.pubsubNS+"#owner")
- filledConfigure = filledPubSub.addElement('configure')
- filledConfigure['node'] = nodeName
- filledForm = filledConfigure.addElement('x',
- defaultUri='jabber:x:data')
- filledForm['type'] = 'submit'
+ if iq['type'] == 'result':
+ self.sendDebug("Received configuration form (%s)" % (nodeName,), iq)
+ pubsubElement = self._getChild(iq, 'pubsub')
+ if pubsubElement:
+ configureElement = self._getChild(pubsubElement, 'configure')
+ if configureElement:
+ formElement = configureElement.firstChildElement()
+ if formElement['type'] == 'form':
+ # We've found the form; start building a response
+ filledIq = IQ(self.xmlStream, type='set')
+ filledPubSub = filledIq.addElement('pubsub',
+ defaultUri=self.pubsubNS+"#owner")
+ filledConfigure = filledPubSub.addElement('configure')
+ filledConfigure['node'] = nodeName
+ filledForm = filledConfigure.addElement('x',
+ defaultUri='jabber:x:data')
+ filledForm['type'] = 'submit'
- for field in formElement.elements():
- if field.name == 'field':
- value = self.nodeConfiguration.get(field['var'],
- None)
- if value is not None:
- valueElement = self._getChild(field, 'value')
- valueElement.children = []
- valueElement.addContent(value)
- filledForm.addChild(field)
- filledIq.addCallback(self.responseFromConfiguration,
- nodeName)
- filledIq.send(to=self.settings['ServiceAddress'])
+ for field in formElement.elements():
+ if field.name == 'field':
+ value = self.nodeConf.get(field['var'], None)
+ if value is not None:
+ valueElement = self._getChild(field,
+ 'value')
+ valueElement.children = []
+ valueElement.addContent(value)
+ filledForm.addChild(field)
+ filledIq.addCallback(self.responseFromConfiguration,
+ nodeName)
+ filledIq.send(to=self.settings['ServiceAddress'])
+ else:
+ self.log_error("PubSub configuration form request error: %s" %
+ (iq.toXml().encode('ascii', 'replace')),)
+ self.sendError("Failed to receive configuration form (%s)" % (nodeName,), iq)
def responseFromConfiguration(self, nodeName, iq):
if iq['type'] == 'result':
- self.log_debug("Node %s id configured" % (nodeName,))
- self.publishNode(nodeName)
+ self.log_debug("PubSub node %s is configured" % (nodeName,))
+ self.sendDebug("Configured node (%s)" % (nodeName,), iq)
+ self.publishNode(nodeName)
+ else:
+ self.log_error("PubSub node configuration error: %s" %
+ (iq.toXml().encode('ascii', 'replace')),)
+ self.sendError("Failed to configure node (%s)" % (nodeName,), iq)
+
def streamOpened(self, xmlStream):
self.xmlStream = xmlStream
+ xmlStream.addObserver('/message', self.handleMessage)
def streamClosed(self):
self.xmlStream = None
+ def sendDebug(self, txt, element):
+ if self.sendDebugMessages:
+ testJid = self.settings.get("TestJID", "")
+ if testJid:
+ txt = "DEBUG: %s %s" % (txt, element.toXml().encode('ascii',
+ 'replace'))
+ self.sendAlert(testJid, txt)
+ def sendError(self, txt, element):
+ testJid = self.settings.get("TestJID", "")
+ if testJid:
+ txt = "ERROR: %s %s" % (txt, element.toXml().encode('ascii',
+ 'replace'))
+ self.sendAlert(testJid, txt)
+
+ def sendAlert(self, jid, txt):
+ if self.xmlStream is not None:
+ message = domish.Element(('jabber:client', 'message'))
+ message['to'] = JID(jid).full()
+ message.addElement('body', content=txt)
+ self.xmlStream.send(message)
+
+ def handleMessage(self, iq):
+ body = getattr(iq, 'body', None)
+ if body:
+ response = None
+ txt = str(body).lower()
+ if txt == "help":
+ response = "debug on, debug off"
+ elif txt == "debug on":
+ self.sendDebugMessages = True
+ response = "Debugging on"
+ elif txt == "debug off":
+ self.sendDebugMessages = False
+ response = "Debugging off"
+ else:
+ response = "I don't understand. Try 'help'."
+
+ if response:
+ message = domish.Element(('jabber:client', 'message'))
+ message['to'] = JID(iq['from']).full()
+ message.addElement('body', content=response)
+ self.xmlStream.send(message)
+
+
+
+
class XMPPNotificationFactory(xmlstream.XmlStreamFactory, LoggingMixIn):
def __init__(self, notifier, settings, reactor=None):
@@ -595,7 +663,7 @@
def authenticated(self, xmlStream):
self.log_info("XMPP authentication successful: %s" % (self.jid,))
- xmlStream.addObserver('/message', self.handleMessage)
+ # xmlStream.addObserver('/message', self.handleMessage)
self.sendPresence()
self.notifier.streamOpened(xmlStream)
@@ -603,26 +671,6 @@
self.log_error("Failed to log in XMPP (%s); check JID and password" %
(self.jid,))
- def handleMessage(self, elem):
- body = getattr(elem, 'body', None)
- if not body:
- event = getattr(elem, 'event', None)
- if event:
- body = domish.Element((None, 'body'))
- body.addContent(event.toXml().encode('utf-8'))
- if body:
- # forward message to test JID, if specified; else bounce to sender:
- testJid = self.settings.get("TestJID", "")
- if testJid:
- dest = testJid
- else:
- dest = JID(elem['from']).full()
-
- message = domish.Element(('jabber:client', 'message'))
- message['to'] = dest
- message.addChild(body)
- self.xmlStream.send(message)
-
def sendPresence(self):
if self.xmlStream is not None:
presence = domish.Element(('jabber:client', 'presence'))
@@ -630,7 +678,6 @@
self.presenceCall = self.reactor.callLater(self.keepAliveSeconds,
self.sendPresence)
-
def rawDataIn(self, buf):
self.log_debug("RECV: %s" % unicode(buf, 'utf-8').encode('ascii',
'replace'))
Modified: CalendarServer/branches/users/sagen/xmpp/twistedcaldav/test/test_notify.py
===================================================================
--- CalendarServer/branches/users/sagen/xmpp/twistedcaldav/test/test_notify.py 2008-07-10 22:28:08 UTC (rev 2676)
+++ CalendarServer/branches/users/sagen/xmpp/twistedcaldav/test/test_notify.py 2008-07-10 23:56:36 UTC (rev 2677)
@@ -415,7 +415,7 @@
return child
return None
- response = IQ(self.xmlStream)
+ response = IQ(self.xmlStream, type='result')
pubsubElement = response.addElement('pubsub')
configElement = pubsubElement.addElement('configure')
formElement = configElement.addElement('x')
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080710/927e943d/attachment-0001.html
More information about the calendarserver-changes
mailing list