[CalendarServer-changes] [2944] CalendarServer/trunk/bin/proxyclean

source_changes at macosforge.org source_changes at macosforge.org
Sat Sep 6 13:05:24 PDT 2008


Revision: 2944
          http://trac.macosforge.org/projects/calendarserver/changeset/2944
Author:   cdaboo at apple.com
Date:     2008-09-06 13:05:24 -0700 (Sat, 06 Sep 2008)
Log Message:
-----------
Script to clean out invalid GUIDs from the proxy db.

Added Paths:
-----------
    CalendarServer/trunk/bin/proxyclean

Added: CalendarServer/trunk/bin/proxyclean
===================================================================
--- CalendarServer/trunk/bin/proxyclean	                        (rev 0)
+++ CalendarServer/trunk/bin/proxyclean	2008-09-06 20:05:24 UTC (rev 2944)
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+
+##
+# Copyright (c) 2008 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+from plistlib import readPlist
+import commands
+import getopt
+import os
+import sys
+try:
+    import opendirectory
+    import dsattributes
+except ImportError:
+    sys.path.append("/usr/share/caldavd/lib/python")
+    import opendirectory
+    import dsattributes
+
+def usage(e=None):
+    if e:
+        print e
+        print ""
+
+    name = os.path.basename(sys.argv[0])
+    print "usage: %s [-c] [-f FILE]" % (name,)
+    print ""
+    print "Tool to remove invalid OD record GUIDs from the proxy DB."
+    print ""
+    print "options:"
+    print "  -h: print this help"
+    print "  -c: change sqlite DB - without this just report what would happen"
+    print "  -f: caldavd.plist file to read (default: /etc/caldavd/caldavd.plist)"
+
+    if e:
+        sys.exit(64)
+    else:
+        sys.exit(0)
+
+def extractPlistPieces(plistdbpath):
+    
+    plist = readPlist(plistdbpath)
+
+    try:
+        dsnode = plist["DirectoryService"]["params"]["node"]
+    except KeyError:
+        raise ValueError("Unable to read DirectoryService/params/node key from plist: %s" % (plistdbpath,))
+    
+    try:
+        dataroot = plist["DataRoot"]
+    except KeyError:
+        raise ValueError("Unable to read DataRoot key from plist: %s" % (plistdbpath,))
+    
+    # Find the appropriate sqlite db
+    proxydbpath_data = os.path.join(dataroot, "calendaruserproxy.sqlite")
+    if not os.path.exists(proxydbpath_data):
+        try:
+            docroot = plist["DocumentRoot"]
+        except KeyError:
+            "Unable to read DocumentRoot key from plist: %s" % (plistdbpath,)
+            raise
+        proxydbpath_doc = os.path.join(docroot, "principals", ".db.calendaruserproxy")
+        if not os.path.exists(proxydbpath_doc):
+            raise("Unable to find proxy db at '%s' or '%s'" % (proxydbpath_data, proxydbpath_doc))
+        else:
+            proxydbpath = proxydbpath_doc 
+    else:
+        proxydbpath = proxydbpath_data
+    
+    print ""
+    print "Parsed:              %s" % (plistdbpath,)
+    print "Found DS Node:       %s" % (dsnode,)
+    print "Found proxy DB path: %s" % (proxydbpath)
+    print ""
+    return dsnode, proxydbpath
+
+def loadUserRecords(dsnode):
+
+    print "Loading /Users records from OD: %s" % (dsnode,)
+    od = opendirectory.odInit(dsnode)
+    results = opendirectory.listAllRecordsWithAttributes(
+        od,
+        dsattributes.kDSStdRecordTypeUsers,
+        [dsattributes.kDS1AttrGeneratedUID,]
+    )
+
+    result = set()
+    for record in results.itervalues():
+        guid = record.get(dsattributes.kDS1AttrGeneratedUID, None)
+        if guid:
+            result.add(guid)
+
+    print "Found %d /Users records" % (len(result),)
+    print ""
+            
+    return result
+        
+def cleanProxies(existing_guids, proxydbpath, do_changes):
+    
+    # Get proxy entries
+    print "Reading proxy DB: %s" % (proxydbpath,)
+    result = commands.getoutput("sqlite3 %s \"select * from GROUPS\"" % (proxydbpath,))
+    
+    lines = result.split("\n")
+    print "Found %d proxy DB records" % (len(lines),)
+
+    proxying = set()
+    proxying_total = 0
+    users = set()
+    users_total = 0
+    for line in lines:
+        proxy, user = line.split("|")
+        if proxy.split("#")[0] not in existing_guids:
+            proxying.add(proxy)
+            proxying_total += 1
+        if user not in existing_guids:
+            users.add(user)
+            users_total += 1
+
+    if do_changes:
+        print "Changes will be made to the proxy DB"
+    else:
+        print "Changes will not be made to the proxy DB"
+
+    print ""
+    print "Found %d invalid group names (total records %d)" % (len(proxying), proxying_total,)
+    print "============================"
+    for key in sorted(proxying):
+        print key
+        if do_changes:
+            commands.getoutput("sqlite3 %s \"delete from GROUPS where GROUPNAME = '%s'\"" % (proxydbpath, key,))
+    print "============================"
+    
+    print ""
+    print "Found %d invalid members (total records %d)" % (len(users), users_total,)
+    print "============================"
+    for key in sorted(users):
+        print key
+        if do_changes:
+            commands.getoutput("sqlite3 %s \"delete from GROUPS where MEMBER = '%s'\"" % (proxydbpath, key,))
+    print "============================"
+    print ""
+    print "Done."
+
+if __name__ == "__main__":
+    try:
+        (optargs, args) = getopt.getopt(sys.argv[1:], "cf:h", ["help"])
+    except getopt.GetoptError, e:
+        usage(e)
+
+    if len(args) != 0:
+        usage("Wrong number of arguments.")
+
+    plistdbpath = "/etc/caldavd/caldavd.plist"
+    do_changes = False
+
+    for opt, arg in optargs:
+        if opt in ("-h", "--help"):
+            usage()
+        elif opt == "-c":
+            do_changes = True
+        elif opt == "-f":
+            plistdbpath = arg
+
+    try:
+        print "CalendarServer proxy DB clean-up tool"
+        print "====================================="
+    
+        if not os.path.exists(plistdbpath):
+            raise ValueError("caldavd.plist file does not exist: %s" % (plistdbpath,))
+    
+        dsnode, proxydbpath = extractPlistPieces(plistdbpath)
+        guids = loadUserRecords(dsnode)
+        cleanProxies(guids, proxydbpath, do_changes)
+        sys.exit(0)
+    except ValueError, e:
+        print ""
+        print "Failed: %s" % (str(e),)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080906/29ebc3f3/attachment.html 


More information about the calendarserver-changes mailing list