[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