[CalendarServer-changes] [3147] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Oct 13 15:23:17 PDT 2008


Revision: 3147
          http://trac.macosforge.org/projects/calendarserver/changeset/3147
Author:   sagen at apple.com
Date:     2008-10-13 15:23:17 -0700 (Mon, 13 Oct 2008)
Log Message:
-----------
Changing default for pubsub node configuration, and allowing node config to be specified in plist

Also, added "delete" node command to interactive xmpp session

Modified Paths:
--------------
    CalendarServer/trunk/conf/caldavd-test.plist
    CalendarServer/trunk/conf/caldavd.plist
    CalendarServer/trunk/twistedcaldav/config.py
    CalendarServer/trunk/twistedcaldav/notify.py
    CalendarServer/trunk/twistedcaldav/test/test_notify.py

Modified: CalendarServer/trunk/conf/caldavd-test.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd-test.plist	2008-10-13 19:59:14 UTC (rev 3146)
+++ CalendarServer/trunk/conf/caldavd-test.plist	2008-10-13 22:23:17 UTC (rev 3147)
@@ -416,6 +416,14 @@
           <key>ServiceAddress</key>
           <string>pubsub.xmpp.host.name</string>
 
+          <key>NodeConfiguration</key>
+          <dict>
+            <key>pubsub#deliver_payloads</key>
+            <string>1</string>
+            <key>pubsub#persist_items</key>
+            <string>1</string>
+          </dict>
+
           <!-- Sends a presence notification to XMPP server at this interval (prevents disconnect) -->
           <key>KeepAliveSeconds</key>
           <integer>120</integer>

Modified: CalendarServer/trunk/conf/caldavd.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd.plist	2008-10-13 19:59:14 UTC (rev 3146)
+++ CalendarServer/trunk/conf/caldavd.plist	2008-10-13 22:23:17 UTC (rev 3147)
@@ -312,6 +312,14 @@
           <key>ServiceAddress</key>
           <string>pubsub.xmpp.host.name</string>
 
+          <key>NodeConfiguration</key>
+          <dict>
+            <key>pubsub#deliver_payloads</key>
+            <string>1</string>
+            <key>pubsub#persist_items</key>
+            <string>1</string>
+          </dict>
+
           <!-- Sends a presence notification to XMPP server at this interval (prevents disconnect) -->
           <key>KeepAliveSeconds</key>
           <integer>120</integer>

Modified: CalendarServer/trunk/twistedcaldav/config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/config.py	2008-10-13 19:59:14 UTC (rev 3146)
+++ CalendarServer/trunk/twistedcaldav/config.py	2008-10-13 22:23:17 UTC (rev 3147)
@@ -254,6 +254,10 @@
                 "JID" : "", # "jid at xmpp.host.name/resource"
                 "Password" : "",
                 "ServiceAddress" : "", # "pubsub.xmpp.host.name"
+                "NodeConfiguration" : {
+                    "pubsub#deliver_payloads" : "1",
+                    "pubsub#persist_items" : "1",
+                },
                 "KeepAliveSeconds" : 120,
                 "HeartbeatMinutes" : 30,
                 "AllowedJIDs": [],
@@ -544,7 +548,7 @@
                 service["Enabled"]
             ):
                 for key, value in service.iteritems():
-                    if not value and key not in ("AllowedJIDs"):
+                    if not value and key not in ("AllowedJIDs", "HeartbeatMinutes"):
                         raise ConfigurationError("Invalid %s for XMPPNotifierService: %r"
                                                  % (key, value))
 

Modified: CalendarServer/trunk/twistedcaldav/notify.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/notify.py	2008-10-13 19:59:14 UTC (rev 3146)
+++ CalendarServer/trunk/twistedcaldav/notify.py	2008-10-13 22:23:17 UTC (rev 3147)
@@ -568,11 +568,6 @@
 
     pubsubNS = 'http://jabber.org/protocol/pubsub'
 
-    nodeConf = {
-        'pubsub#deliver_payloads': '1',
-        'pubsub#persist_items'   : '0',
-    }
-
     def __init__(self, settings, reactor=None, configOverride=None,
         heartbeat=True, roster=True):
         self.xmlStream = None
@@ -581,7 +576,7 @@
             from twisted.internet import reactor
         self.reactor = reactor
         self.config = configOverride or config
-        self.doHeartbeat = heartbeat
+        self.doHeartbeat = heartbeat and self.settings['HeartbeatMinutes'] != 0
         self.doRoster = roster
 
         self.roster = {}
@@ -636,9 +631,11 @@
             pubsubElement = iq.addElement('pubsub', defaultUri=self.pubsubNS)
             publishElement = pubsubElement.addElement('publish')
             publishElement['node'] = nodeName
-            itemElement = publishElement.addElement('item')
-            payloadElement = itemElement.addElement('plistfrag',
-                defaultUri='plist-apple')
+            if self.settings["NodeConfiguration"]["pubsub#deliver_payloads"] == '1':
+                itemElement = publishElement.addElement('item')
+                payloadElement = itemElement.addElement('plistfrag',
+                    defaultUri='plist-apple')
+
             self.sendDebug("Publishing (%s)" % (nodeName,), iq)
             d = iq.send(to=self.settings['ServiceAddress'])
             d.addCallback(self.publishNodeSuccess, nodeName)
@@ -748,6 +745,7 @@
             return
 
         try:
+            nodeConf = self.settings["NodeConfiguration"]
             self.sendDebug("Received configuration form (%s)" % (nodeName,), iq)
             pubsubElement = self._getChild(iq, 'pubsub')
             if pubsubElement:
@@ -772,7 +770,7 @@
                                 if var == "FORM_TYPE":
                                     filledForm.addChild(field)
                                 else:
-                                    value = self.nodeConf.get(var, None)
+                                    value = nodeConf.get(var, None)
                                     if (value is not None and
                                         (str(self._getChild(field,
                                         "value")) != value)):
@@ -853,7 +851,43 @@
         finally:
             self.unlockNode(None, nodeName)
 
+    def deleteNode(self, nodeName):
+        if self.xmlStream is None:
+            # We lost our connection
+            self.unlockNode(None, nodeName)
+            return
 
+        try:
+            if not self.lockNode(nodeName):
+                return
+
+            iq = IQ(self.xmlStream)
+            pubsubElement = iq.addElement('pubsub',
+                defaultUri=self.pubsubNS+"#owner")
+            publishElement = pubsubElement.addElement('delete')
+            publishElement['node'] = nodeName
+            self.sendDebug("Deleting (%s)" % (nodeName,), iq)
+            d = iq.send(to=self.settings['ServiceAddress'])
+            d.addCallback(self.deleteNodeSuccess, nodeName)
+            d.addErrback(self.deleteNodeFailure, nodeName)
+        except:
+            self.unlockNode(None, nodeName)
+            raise
+
+    def deleteNodeSuccess(self, iq, nodeName):
+        self.unlockNode(None, nodeName)
+        self.sendDebug("Node delete successful (%s)" % (nodeName,), iq)
+
+    def deleteNodeFailure(self, result, nodeName):
+        try:
+            iq = result.value.getElement()
+            self.log_error("PubSub node delete error: %s" %
+                (iq.toXml().encode('ascii', 'replace')),)
+            self.sendDebug("Node delete failed (%s)" % (nodeName,), iq)
+        finally:
+            self.unlockNode(None, nodeName)
+
+
     def requestRoster(self):
         if self.doRoster:
             self.roster = {}
@@ -988,16 +1022,24 @@
                     response = "Outstanding: %s" % (str(self.outstanding),)
                 elif txt.startswith("publish"):
                     try:
-                        publish, nodeName = txt.split()
+                        publish, nodeName = str(body).split()
                     except ValueError:
                         response = "Please phrase it like 'publish nodename'"
                     else:
                         response = "Publishing node %s" % (nodeName,)
                         self.reactor.callLater(1, self.enqueue, "update",
                             nodeName)
+                elif txt.startswith("delete"):
+                    try:
+                        delete, nodeName = str(body).split()
+                    except ValueError:
+                        response = "Please phrase it like 'delete nodename'"
+                    else:
+                        response = "Deleting node %s" % (nodeName,)
+                        self.reactor.callLater(1, self.deleteNode, nodeName)
                 elif txt.startswith("create"):
                     try:
-                        publish, nodeName = txt.split()
+                        publish, nodeName = str(body).split()
                     except ValueError:
                         response = "Please phrase it like 'create nodename'"
                     else:

Modified: CalendarServer/trunk/twistedcaldav/test/test_notify.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_notify.py	2008-10-13 19:59:14 UTC (rev 3146)
+++ CalendarServer/trunk/twistedcaldav/test/test_notify.py	2008-10-13 22:23:17 UTC (rev 3147)
@@ -347,7 +347,10 @@
 
     def setUp(self):
         self.xmlStream = StubXmlStream()
-        self.settings = { 'ServiceAddress' : 'pubsub.example.com' }
+        self.settings = { 'ServiceAddress' : 'pubsub.example.com',
+            'NodeConfiguration' : { 'pubsub#deliver_payloads' : '1' },
+            'HeartbeatMinutes' : 30,
+        }
         self.notifier = XMPPNotifier(self.settings, reactor=Clock(),
             configOverride=self.xmppEnabledConfig, heartbeat=False)
         self.notifier.streamOpened(self.xmlStream)
@@ -430,13 +433,13 @@
         formElement['type'] = 'form'
         fields = [
             ( "unknown", "don't edit me", "text-single" ),
-            ( "pubsub#deliver_payloads", "1", "boolean" ),
-            ( "pubsub#persist_items", "1", "boolean" ),
+            ( "pubsub#deliver_payloads", "0", "boolean" ),
+            ( "pubsub#persist_items", "0", "boolean" ),
         ]
         expectedFields = {
             "unknown" : "don't edit me",
             "pubsub#deliver_payloads" : "1",
-            "pubsub#persist_items" : "0",
+            "pubsub#persist_items" : "1",
         }
         for field in fields:
             fieldElement = formElement.addElement("field")
@@ -478,6 +481,7 @@
         xmlStream = StubXmlStream()
         settings = { 'ServiceAddress' : 'pubsub.example.com', 'JID' : 'jid',
             'Password' : 'password', 'KeepAliveSeconds' : 5,
+            'NodeConfiguration' : { 'pubsub#deliver_payloads' : "1" },
             'HeartbeatMinutes' : 30 }
         notifier = XMPPNotifier(settings, reactor=clock, heartbeat=True,
             roster=False, configOverride=xmppConfig)
@@ -508,6 +512,7 @@
         clock = Clock()
         xmlStream = StubXmlStream()
         settings = { 'ServiceAddress' : 'pubsub.example.com', 'JID' : 'jid',
+            'NodeConfiguration' : { 'pubsub#deliver_payloads' : "1" },
             'Password' : 'password', 'KeepAliveSeconds' : 5 }
         notifier = XMPPNotifier(settings, reactor=clock, heartbeat=False)
         factory = XMPPNotificationFactory(notifier, settings, reactor=clock)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081013/0056b28d/attachment-0001.html 


More information about the calendarserver-changes mailing list