[CalendarServer-changes] [4391] CalendarServer/branches/users/sagen/pending-invites-4389
source_changes at macosforge.org
source_changes at macosforge.org
Mon Jun 29 15:44:20 PDT 2009
Revision: 4391
http://trac.macosforge.org/projects/calendarserver/changeset/4391
Author: sagen at apple.com
Date: 2009-06-29 15:44:20 -0700 (Mon, 29 Jun 2009)
Log Message:
-----------
Work in progress towards pending invites
Modified Paths:
--------------
CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py
CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py
CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml
CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py
CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py
CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py 2009-06-29 22:44:20 UTC (rev 4391)
@@ -39,7 +39,8 @@
from twisted.python.usage import Options, UsageError
from twisted.python.reflect import namedClass
from twisted.plugin import IPlugin
-from twisted.internet.reactor import callLater
+from twisted.internet.defer import Deferred, inlineCallbacks
+from twisted.internet.reactor import callLater, addSystemEventTrigger
from twisted.internet.process import ProcessExitedAlready
from twisted.internet.protocol import Protocol, Factory
from twisted.internet.address import IPv4Address
@@ -360,17 +361,21 @@
if config.ProcessType in ('Combined', 'Single'):
- # Process localization string files
- processLocalizationFiles(config.Localization)
+ @inlineCallbacks
+ def beforeStartup():
+ # Process localization string files
+ processLocalizationFiles(config.Localization)
- # Now do any on disk upgrades we might need.
- # Memcache isn't running at this point, so temporarily change
- # the config so nobody tries to talk to it while upgrading
- memcacheSetting = config.Memcached.ClientEnabled
- config.Memcached.ClientEnabled = False
- upgradeData(config)
- config.Memcached.ClientEnabled = memcacheSetting
+ # Now do any on disk upgrades we might need.
+ # Memcache isn't running at this point, so temporarily
+ # change the config so nobody tries to talk to it while
+ # upgrading
+ memcacheSetting = config.Memcached.ClientEnabled
+ config.Memcached.ClientEnabled = False
+ yield upgradeData(config)
+ config.Memcached.ClientEnabled = memcacheSetting
+ addSystemEventTrigger('before', 'startup', beforeStartup)
service = serviceMethod(options)
@@ -1281,20 +1286,9 @@
)
self.active = 1
- delay = 0
- if config.MultiProcess.StaggeredStartup.Enabled:
- delay_interval = config.MultiProcess.StaggeredStartup.Interval
- else:
- delay_interval = 0
-
for name in self.processes.keys():
- if name.startswith("caldav"):
- when = delay
- delay += delay_interval
- else:
- when = 0
- callLater(when, self.startProcess, name)
+ addSystemEventTrigger('after', 'startup', self.startProcess, name)
self.consistency = callLater(
self.consistencyDelay,
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py 2009-06-29 22:44:20 UTC (rev 4391)
@@ -224,10 +224,6 @@
"Enabled": True,
"Scheduler": "LeastConnections",
},
- "StaggeredStartup": {
- "Enabled": False,
- "Interval": 15,
- },
},
#
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml 2009-06-29 22:44:20 UTC (rev 4391)
@@ -58,6 +58,14 @@
<cuaddr>mailto:dreid at example.com</cuaddr>
</user>
<user>
+ <uid>sagen</uid>
+ <guid>64230DAD-0BDE-4508-8C77-15F0CA5C8DD1</guid>
+ <password>negas</password>
+ <name>Morgen Sagen</name>
+ <email-address>sagen at example.com</email-address>
+ <cuaddr>mailto:sagen at example.com</cuaddr>
+ </user>
+ <user>
<uid>nocalendar</uid>
<guid>543D28BA-F74F-4D5F-9243-B3E3A61171E5</guid>
<password>radnelacon</password>
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py 2009-06-29 22:44:20 UTC (rev 4391)
@@ -55,6 +55,7 @@
"CalDAVScheduler",
"IScheduleScheduler",
"IMIPScheduler",
+ "DirectScheduler",
]
@@ -386,7 +387,7 @@
# Now process iMIP recipients
if imip_recipients:
yield self.generateIMIPSchedulingResponses(imip_recipients, responses, freebusy)
-
+
# Return with final response if we are done
returnValue(responses)
@@ -789,6 +790,31 @@
log.err(msg)
raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data"), description=msg))
+
+class DirectScheduler(Scheduler):
+
+ def checkAuthorization(self):
+ pass
+
+ def checkOrganizer(self):
+ pass
+
+ def checkOrganizerAsOriginator(self):
+ pass
+
+ def checkAttendeeAsOriginator(self):
+ pass
+
+ def securityChecks(self):
+ pass
+
+ def checkOriginator(self):
+ pass
+
+ def checkRecipients(self):
+ pass
+
+
class IMIPScheduler(Scheduler):
def checkAuthorization(self):
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py 2009-06-29 22:44:20 UTC (rev 4391)
@@ -23,6 +23,7 @@
from twistedcaldav.test.util import TestCase
from calendarserver.tools.util import getDirectory
from twisted.web2.dav import davxml
+from twisted.internet.defer import inlineCallbacks
import hashlib
import os, zlib, cPickle
@@ -112,6 +113,7 @@
proxyDB = CalendarUserProxyDatabase(self.existingdataroot)
proxyDB._db()
+ @inlineCallbacks
def test_normalUpgrade(self):
"""
Test the behavior of normal upgrade from old server to new.
@@ -129,13 +131,14 @@
self.assertTrue(os.path.exists(os.path.join(config.DocumentRoot, "principals", CalendarUserProxyDatabase.dbOldFilename)))
self.assertFalse(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
- upgradeData(config)
+ yield upgradeData(config)
# Check post-conditions
self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals",)))
self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
+ @inlineCallbacks
def test_noUpgrade(self):
"""
Test the behavior of running on a new server (i.e. no upgrade needed).
@@ -150,13 +153,14 @@
self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals")))
self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
- upgradeData(config)
+ yield upgradeData(config)
# Check post-conditions
self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals",)))
self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
+ @inlineCallbacks
def test_freeBusyUpgrade(self):
"""
Test the updating of calendar-free-busy-set xattrs on inboxes
@@ -220,7 +224,7 @@
value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/users/nonexistent/calendar</href>\r\n</calendar-free-busy-set>\r\n"
self.assertRaises(UpgradeError, updateFreeBusySet, value, directory)
-
+ @inlineCallbacks
def test_calendarsUpgradeWithTypes(self):
"""
Verify that calendar homes in the /calendars/<type>/<shortname>/ form
@@ -354,13 +358,14 @@
config.DocumentRoot = root
config.DataRoot = root
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
# Ensure that repeating the process doesn't change anything
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
+ @inlineCallbacks
def test_calendarsUpgradeWithUIDs(self):
"""
Verify that calendar homes in the /calendars/__uids__/<guid>/ form
@@ -462,13 +467,14 @@
config.DocumentRoot = root
config.DataRoot = root
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
# Ensure that repeating the process doesn't change anything
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
+ @inlineCallbacks
def test_calendarsUpgradeWithUIDsMultilevel(self):
"""
Verify that calendar homes in the /calendars/__uids__/XX/YY/<guid>/
@@ -586,14 +592,15 @@
config.DocumentRoot = root
config.DataRoot = root
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
# Ensure that repeating the process doesn't change anything
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
+ @inlineCallbacks
def test_calendarsUpgradeWithNoChange(self):
"""
Verify that calendar homes in the /calendars/__uids__/XX/YY/<guid>/
@@ -711,12 +718,13 @@
config.DocumentRoot = root
config.DataRoot = root
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
+ @inlineCallbacks
def test_calendarsUpgradeWithError(self):
"""
Verify that a problem with one resource doesn't stop the process, but
@@ -810,8 +818,149 @@
self.assertRaises(UpgradeError, upgradeData, config)
self.assertTrue(self.verifyHierarchy(root, after))
+
+
+ @inlineCallbacks
+ def test_pendingInvitesUpgrade(self):
+ """
+ Verify that pending invites (sitting in inboxes) are processed by
+ the implicit scheduler during upgrade
+ """
+
+ self.setUpXMLDirectory()
+ directory = getDirectory()
+
+ before = {
+ "calendars" :
+ {
+ "__uids__" :
+ {
+ "64" :
+ {
+ "23" :
+ {
+ "6423F94A-6B76-4A3A-815B-D52CFD77935D" :
+ {
+ "calendar" :
+ { },
+ "inbox" :
+ {
+ "b12d602b9f43b53fa4de27d3dea86fcd.ics" :
+ {
+ "@contents" : event03_inbox,
+ },
+ "@xattrs" :
+ {
+ freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+ },
+ },
+ },
+ "64230DAD-0BDE-4508-8C77-15F0CA5C8DD1" :
+ {
+ "calendar" :
+ {
+ "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+ {
+ "@contents" : event03_orig,
+ },
+ },
+ "inbox" :
+ {
+ "@xattrs" :
+ {
+ freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/__uids__/64230DAD-0BDE-4508-8C77-15F0CA5C8DD1/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ CalendarUserProxyDatabase.dbFilename :
+ {
+ "@contents" : "",
+ }
+ }
+
+
+ after = {
+ "calendars" :
+ {
+ "__uids__" :
+ {
+ "64" :
+ {
+ "23" :
+ {
+ "6423F94A-6B76-4A3A-815B-D52CFD77935E" :
+ {
+ "calendar" :
+ {
+ "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+ {
+ "@contents" : event03_orig,
+ },
+ },
+ "inbox" :
+ {
+ "b12d602b9f43b53fa4de27d3dea86fcd.ics" :
+ {
+ "@contents" : event03_inbox,
+ },
+ "@xattrs" :
+ {
+ freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+ },
+ },
+ },
+ "64230DAD-0BDE-4508-8C77-15F0CA5C8DD1" :
+ {
+ "calendar" :
+ {
+ "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+ {
+ "@contents" : event03_orig,
+ },
+ },
+ "inbox" :
+ {
+ "@xattrs" :
+ {
+ freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/__uids__/64230DAD-0BDE-4508-8C77-15F0CA5C8DD1/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ CalendarUserProxyDatabase.dbFilename :
+ {
+ "@contents" : None,
+ },
+ MailGatewayTokensDatabase.dbFilename :
+ {
+ "@contents" : None,
+ },
+ ResourceInfoDatabase.dbFilename :
+ {
+ "@contents" : None,
+ }
+ }
+
+
+ root = self.createHierarchy(before)
+
+ config.DocumentRoot = root
+ config.DataRoot = root
+
+ yield upgradeData(config)
+
+ self.assertTrue(self.verifyHierarchy(root, after))
+
+
+ @inlineCallbacks
def test_migrateResourceInfo(self):
- # Fake getResourceInfo( )
assignments = {
'guid1' : (False, None, None),
@@ -853,7 +1002,7 @@
config.DocumentRoot = root
config.DataRoot = root
- upgradeData(config)
+ yield upgradeData(config)
self.assertTrue(self.verifyHierarchy(root, after))
calendarUserProxyDatabase = CalendarUserProxyDatabase(root)
@@ -967,6 +1116,90 @@
event01_after_md5 = hashlib.md5(event01_after).hexdigest()
+event03_inbox = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+PRODID:-//Apple Inc.//iCal 3.0//EN
+BEGIN:VTIMEZONE
+TZID:US/Pacific
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6
+DTSTART;TZID=US/Pacific:20090907T160000
+DTEND;TZID=US/Pacific:20090907T180000
+ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez at example.com;
+ PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:6423F94A-6B7
+ 6-4A3A-815B-D52CFD77935D
+ATTENDEE;CN=Morgen Sagen;EMAIL=sagen at example.com;PARTSTAT=ACCEPTED:urn:uui
+ d:64230DAD-0BDE-4508-8C77-15F0CA5C8DD1
+CREATED:20090514T215838Z
+DTSTAMP:20090514T215856Z
+ORGANIZER;CN=Morgen Sagen;EMAIL=sagen at example.com:urn:uuid:64230DAD-0BDE-4
+ 508-8C77-15F0CA5C8DD1
+SEQUENCE:9
+SUMMARY:Pending Invitation
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n")
+
+event03_orig = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Apple Inc.//iCal 3.0//EN
+BEGIN:VTIMEZONE
+TZID:US/Pacific
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6
+DTSTART;TZID=US/Pacific:20090907T160000
+DTEND;TZID=US/Pacific:20090907T180000
+ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez at example.com;
+ PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:6423F94A-6B7
+ 6-4A3A-815B-D52CFD77935D
+ATTENDEE;CN=Morgen Sagen;EMAIL=sagen at example.com;PARTSTAT=ACCEPTED:urn:uui
+ d:64230DAD-0BDE-4508-8C77-15F0CA5C8DD1
+CREATED:20090514T215838Z
+DTSTAMP:20090514T215856Z
+ORGANIZER;CN=Morgen Sagen;EMAIL=sagen at example.com:urn:uuid:64230DAD-0BDE-4
+ 508-8C77-15F0CA5C8DD1
+SEQUENCE:9
+SUMMARY:Pending Invitation
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n")
+
+
def isValidCTag(value):
"""
Since ctag is generated from datetime.now(), let's make sure that at
Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py 2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py 2009-06-29 22:44:20 UTC (rev 4391)
@@ -18,6 +18,7 @@
from twisted.web2.dav.fileop import rmdir
from twisted.web2.dav import davxml
+from twisted.internet.defer import inlineCallbacks, returnValue
from twistedcaldav.directory.directory import DirectoryService
from twistedcaldav.directory.calendaruserproxy import CalendarUserProxyDatabase
from twistedcaldav.directory.resourceinfo import ResourceInfoDatabase
@@ -25,8 +26,10 @@
from twistedcaldav.log import Logger
from twistedcaldav.ical import Component
from twistedcaldav import caldavxml
+from twistedcaldav.scheduling.cuaddress import LocalCalendarUser
+from twistedcaldav.scheduling.scheduler import DirectScheduler
from calendarserver.tools.util import getDirectory
-import xattr, os, zlib, hashlib, datetime, pwd, grp, shutil
+import xattr, os, zlib, hashlib, datetime, pwd, grp
from zlib import compress
from cPickle import loads as unpickle, UnpicklingError
@@ -58,6 +61,7 @@
# Upconverts data from any calendar server version prior to data format 1
#
+ at inlineCallbacks
def upgrade_to_1(config):
errorOccurred = False
@@ -197,7 +201,46 @@
return errorOccurred
+ class fakeRequest(object):
+ pass
+ class fakeResource(object):
+ pass
+
+ @inlineCallbacks
+ def processInbox(inboxPath, uuid, directory):
+
+ for ics in os.listdir(inboxPath):
+
+ cua = "urn:uuid:%s" % (uuid,)
+ ownerPrincipal = directory.principalForCalendarUserAddress(cua)
+ owner = LocalCalendarUser(cua, ownerPrincipal)
+
+ icsPath = os.path.join(inboxPath, ics)
+ log.debug("Processing inbox item: %s" % (icsPath,))
+ with open(icsPath) as icsFile:
+ data = icsFile.read()
+ calendar = Component.fromString(data)
+
+ try:
+ method = calendar.propertyValue("METHOD")
+ except ValueError:
+ returnValue(None)
+
+ if method == "REPLY":
+ # originator is attendee sending reply
+ originator = calendar.getAttendees()
+ else:
+ # originator is the organizer
+ originator = calendar.getOrganizer()
+
+ recipients = (owner,)
+ scheduler = DirectScheduler(fakeRequest(), fakeResource())
+ result = (yield scheduler.doSchedulingViaPUT(originator, recipients,
+ calendar, internal_request=False))
+
+ returnValue(None)
+
def doProxyDatabaseMoveUpgrade(config, uid=-1, gid=-1):
# See if the new one is already present
@@ -391,6 +434,23 @@
log.warn("Done processing calendar homes")
+
+ # Process pending invitations
+ for first in os.listdir(uidHomes):
+ if len(first) == 2:
+ firstPath = os.path.join(uidHomes, first)
+ for second in os.listdir(firstPath):
+ if len(second) == 2:
+ secondPath = os.path.join(firstPath, second)
+ for home in os.listdir(secondPath):
+ homePath = os.path.join(secondPath, home)
+ inboxPath = os.path.join(homePath, "inbox")
+ if os.path.exists(inboxPath):
+ yield processInbox(inboxPath,
+ home, directory)
+
+
+
migrateResourceInfo(config, directory, uid, gid)
createMailTokensDatabase(config, uid, gid)
@@ -406,6 +466,7 @@
(1, upgrade_to_1),
]
+ at inlineCallbacks
def upgradeData(config):
docRoot = config.DocumentRoot
@@ -426,13 +487,15 @@
uid, gid = getCalendarServerIDs(config)
+ log.warn("UpgradeData: calendar data is at version %d" % (onDiskVersion,))
for version, method in upgradeMethods:
if onDiskVersion < version:
- log.warn("Upgrading to version %d" % (version,))
- method(config)
+ log.warn("UpgradeData: upgrading to version %d" % (version,))
+ yield method(config)
with open(versionFilePath, "w") as verFile:
verFile.write(str(version))
os.chown(versionFilePath, uid, gid)
+ log.warn("UpgradeData: complete")
class UpgradeError(RuntimeError):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090629/72f2b571/attachment-0001.html>
More information about the calendarserver-changes
mailing list