[CalendarServer-changes] [4490] CalendarServer/trunk/calendarserver/tools/anonymize.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 7 14:27:48 PDT 2009


Revision: 4490
          http://trac.macosforge.org/projects/calendarserver/changeset/4490
Author:   sagen at apple.com
Date:     2009-08-07 14:27:48 -0700 (Fri, 07 Aug 2009)
Log Message:
-----------
Anonymizer now produces dsimport files for users/groups/locations/resources

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tools/anonymize.py

Modified: CalendarServer/trunk/calendarserver/tools/anonymize.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/anonymize.py	2009-08-06 23:45:51 UTC (rev 4489)
+++ CalendarServer/trunk/calendarserver/tools/anonymize.py	2009-08-07 21:27:48 UTC (rev 4490)
@@ -101,7 +101,9 @@
 
     directoryMap.printStats()
 
+    directoryMap.dumpDsImports(os.path.join(destDirectory, "dsimports"))
 
+
 def anonymizeRoot(directoryMap, sourceDirectory, destDirectory):
     # sourceDirectory and destDirectory are DocumentRoots
 
@@ -335,6 +337,12 @@
     def __init__(self, node):
 
         self.map = { }
+        self.byType = {
+            'users' : [],
+            'groups' : [],
+            'locations' : [],
+            'resources' : [],
+        }
         self.counts = {
             'users' : 0,
             'groups' : 0,
@@ -344,10 +352,10 @@
         }
 
         self.strings = {
-            'users' : ('Users', 'User'),
-            'groups' : ('Groups', 'Group'),
-            'locations' : ('Places', 'Place'),
-            'resources' : ('Resources', 'Resource'),
+            'users' : ('Users', 'user'),
+            'groups' : ('Groups', 'group'),
+            'locations' : ('Places', 'location'),
+            'resources' : ('Resources', 'resource'),
         }
 
         print "Fetching records from directory: %s" % (node,)
@@ -358,7 +366,7 @@
                 args = [
                     "/usr/bin/dscl", "-plist", node, "-readall",
                     "/%s" % (recordType,),
-                    "GeneratedUID", "RecordName", "EMailAddress",
+                    "GeneratedUID", "RecordName", "EMailAddress", "GroupMembers"
                 ],
                 stdout=PIPE, stderr=STDOUT,
             )
@@ -376,14 +384,16 @@
                         continue
                     origRecordNames = record['dsAttrTypeStandard:RecordName']
                     origEmails = record.get('dsAttrTypeStandard:EMailAddress', [])
+                    origMembers = record.get('dsAttrTypeStandard:GroupMembers', [])
                     self.addRecord(internalType=internalType, guid=origGUID,
-                        names=origRecordNames, emails=origEmails)
+                        names=origRecordNames, emails=origEmails,
+                        members=origMembers)
 
         print "Done."
         print ""
 
     def addRecord(self, internalType="users", guid=None, names=None,
-        emails=None, cua=None):
+        emails=None, members=None, cua=None):
 
         if cua:
             keys = [self.cua2key(cua)]
@@ -396,16 +406,21 @@
             count = self.counts[internalType]
 
             namePrefix = randomName(6)
+            typeStr = self.strings[internalType][1]
             record = {
                 'guid' : str(uuid.uuid4()).upper(),
-                'name' : "%s %s %d" % (namePrefix, self.strings[internalType][1], count,),
-                'recordName' : "%s%d" % (self.strings[internalType][1], count,),
-                'email' : ("%s_%s%d at example.com" % (namePrefix, internalType, count,)),
+                'name' : "%s %s%d" % (namePrefix, typeStr, count,),
+                'first' : namePrefix,
+                'last' : "%s%d" % (typeStr, count,),
+                'recordName' : "%s%d" % (typeStr, count,),
+                'email' : ("%s%d at example.com" % (typeStr, count,)),
                 'type' : self.strings[internalType][0],
                 'cua' : cua,
+                'members' : members,
             }
             for key in keys:
                 self.map[key] = record
+            self.byType[internalType].append(record)
             return record
         else:
             return None
@@ -463,7 +478,77 @@
         if unknown:
             print " Principals not found in directory: %d" % (unknown,)
 
+    def dumpDsImports(self, dirPath):
+        if not os.path.exists(dirPath):
+            os.makedirs(dirPath)
 
+        uid = 1000000
+        filePath = os.path.join(dirPath, "users.dsimport")
+        with open(filePath, "w") as out:
+            out.write("0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 12 dsAttrTypeStandard:RecordName dsAttrTypeStandard:AuthMethod dsAttrTypeStandard:Password dsAttrTypeStandard:UniqueID dsAttrTypeStandard:GeneratedUID dsAttrTypeStandard:PrimaryGroupID dsAttrTypeStandard:RealName dsAttrTypeStandard:FirstName dsAttrTypeStandard:LastName dsAttrTypeStandard:NFSHomeDirectory dsAttrTypeStandard:UserShell dsAttrTypeStandard:EMailAddress\n")
+            for record in self.byType['users']:
+                fields = []
+                fields.append(record['recordName'])
+                fields.append("dsAuthMethodStandard\\:dsAuthClearText")
+                fields.append("test") # password
+                fields.append(str(uid))
+                fields.append(record['guid'])
+                fields.append("20") # primary group id
+                fields.append(record['name'])
+                fields.append(record['first'])
+                fields.append(record['last'])
+                fields.append("/var/empty")
+                fields.append("/usr/bin/false")
+                fields.append(record['email'])
+                out.write(":".join(fields))
+                out.write("\n")
+                uid += 1
+
+        gid = 2000000
+        filePath = os.path.join(dirPath, "groups.dsimport")
+        with open(filePath, "w") as out:
+            out.write("0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Groups 5 dsAttrTypeStandard:RecordName dsAttrTypeStandard:PrimaryGroupID dsAttrTypeStandard:GeneratedUID dsAttrTypeStandard:RealName dsAttrTypeStandard:GroupMembership\n")
+            for record in self.byType['groups']:
+                fields = []
+                fields.append(record['recordName'])
+                fields.append(str(gid))
+                fields.append(record['guid'])
+                fields.append(record['name'])
+                anonMembers = []
+                for member in record['members']:
+                    memberRec = self.lookupCUA("urn:uuid:%s" % (member,))
+                    if memberRec:
+                        anonMembers.append(memberRec['guid'])
+                if anonMembers: # skip empty groups
+                    fields.append(",".join(anonMembers))
+                    out.write(":".join(fields))
+                    out.write("\n")
+                    gid += 1
+
+        filePath = os.path.join(dirPath, "resources.dsimport")
+        with open(filePath, "w") as out:
+            out.write("0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Resources 3 dsAttrTypeStandard:RecordName dsAttrTypeStandard:GeneratedUID dsAttrTypeStandard:RealName\n")
+            for record in self.byType['resources']:
+                fields = []
+                fields.append(record['recordName'])
+                fields.append(record['guid'])
+                fields.append(record['name'])
+                out.write(":".join(fields))
+                out.write("\n")
+
+        filePath = os.path.join(dirPath, "places.dsimport")
+        with open(filePath, "w") as out:
+            out.write("0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Places 3 dsAttrTypeStandard:RecordName dsAttrTypeStandard:GeneratedUID dsAttrTypeStandard:RealName\n")
+            for record in self.byType['locations']:
+                fields = []
+                fields.append(record['recordName'])
+                fields.append(record['guid'])
+                fields.append(record['name'])
+                out.write(":".join(fields))
+                out.write("\n")
+
+
+
 class DirectoryError(Exception):
     """
     Error trying to access dscl
@@ -506,5 +591,7 @@
     return "".join(l)
 
 
+
+
 if __name__ == "__main__":
     main()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090807/48d94e0e/attachment.html>


More information about the calendarserver-changes mailing list