[CalendarServer-changes] [9377] CalendarServer/trunk/contrib/migration

source_changes at macosforge.org source_changes at macosforge.org
Wed Jun 20 11:06:18 PDT 2012


Revision: 9377
          http://trac.macosforge.org/projects/calendarserver/changeset/9377
Author:   sagen at apple.com
Date:     2012-06-20 11:06:18 -0700 (Wed, 20 Jun 2012)
Log Message:
-----------
Don't choke on invalid launchd plists

Modified Paths:
--------------
    CalendarServer/trunk/contrib/migration/calendarmigrator.py
    CalendarServer/trunk/contrib/migration/test/test_migrator.py

Modified: CalendarServer/trunk/contrib/migration/calendarmigrator.py
===================================================================
--- CalendarServer/trunk/contrib/migration/calendarmigrator.py	2012-06-20 18:05:22 UTC (rev 9376)
+++ CalendarServer/trunk/contrib/migration/calendarmigrator.py	2012-06-20 18:06:18 UTC (rev 9377)
@@ -242,7 +242,8 @@
         log("serveradmin exited with %d" % (ret,))
 
 
-def isServiceDisabled(source, service):
+def isServiceDisabled(source, service, launchdOverrides=LAUNCHD_OVERRIDES,
+    launchdPrefsDir=LAUNCHD_PREFS_DIR):
     """
     Returns whether or not a service is disabled
 
@@ -251,19 +252,28 @@
     @return: True if service is disabled, False if enabled
     """
 
-    overridesPath = os.path.join(source, LAUNCHD_OVERRIDES)
+    overridesPath = os.path.join(source, launchdOverrides)
     if os.path.isfile(overridesPath):
-        overrides = readPlist(overridesPath)
         try:
+            overrides = readPlist(overridesPath)
+        except Exception, e:
+            raise ServiceStateError("Could not parse %s : %s" %
+                (overridesPath, str(e)))
+
+        try:
             return overrides[service]['Disabled']
         except KeyError:
             # Key is not in the overrides.plist, continue on
             pass
 
-    prefsPath = os.path.join(source, LAUNCHD_PREFS_DIR, "%s.plist" % service)
+    prefsPath = os.path.join(source, launchdPrefsDir, "%s.plist" % service)
     if os.path.isfile(prefsPath):
-        prefs = readPlist(prefsPath)
         try:
+            prefs = readPlist(prefsPath)
+        except Exception, e:
+            raise ServiceStateError("Could not parse %s : %s" %
+                (prefsPath, str(e)))
+        try:
             return prefs['Disabled']
         except KeyError:
             return False

Modified: CalendarServer/trunk/contrib/migration/test/test_migrator.py
===================================================================
--- CalendarServer/trunk/contrib/migration/test/test_migrator.py	2012-06-20 18:05:22 UTC (rev 9376)
+++ CalendarServer/trunk/contrib/migration/test/test_migrator.py	2012-06-20 18:06:18 UTC (rev 9377)
@@ -16,7 +16,8 @@
 
 import twistedcaldav.test.util
 from contrib.migration.calendarmigrator import (
-    mergePlist, examinePreviousSystem, relocateData, relativize
+    mergePlist, examinePreviousSystem, relocateData, relativize, isServiceDisabled,
+    ServiceStateError
 )
 import contrib.migration.calendarmigrator
 
@@ -1487,6 +1488,58 @@
         self.assertEquals(da.mkdir(t), None)
 
 
+    def test_isServiceDisabledTrue(self):
+        CONTENTS = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+        <key>foo</key>
+        <dict>
+                <key>Disabled</key>
+                <true/>
+        </dict>
+</dict>
+</plist>
+"""
+        t = self.mktemp()
+        f = open(t, "w")
+        f.write(CONTENTS)
+        f.close()
+        self.assertTrue(isServiceDisabled("", "foo", t))
+
+    def test_isServiceDisabledFalse(self):
+        CONTENTS = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+        <key>foo</key>
+        <dict>
+                <key>Disabled</key>
+                <false/>
+        </dict>
+</dict>
+</plist>
+"""
+        t = self.mktemp()
+        f = open(t, "w")
+        f.write(CONTENTS)
+        f.close()
+        self.assertFalse(isServiceDisabled("", "foo", t))
+
+    def test_isServiceDisabledError(self):
+        CONTENTS = """This is not a plist """
+        t = self.mktemp()
+        f = open(t, "w")
+        f.write(CONTENTS)
+        f.close()
+        try:
+            isServiceDisabled("", "foo", t)
+        except ServiceStateError:
+            pass
+        else:
+            self.fail(msg="Didn't raise ServiceStateError")
+
+
 class StubDiskAccessor(object):
     """
     A stub which allows testing without actually having real files
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120620/ee6b55f6/attachment.html>


More information about the calendarserver-changes mailing list