[CalendarServer-changes] [1302] CalendarServer/branches/users/cdaboo/en0-1298

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 2 08:56:35 PST 2007


Revision: 1302
          http://trac.macosforge.org/projects/calendarserver/changeset/1302
Author:   cdaboo at apple.com
Date:     2007-03-02 08:56:35 -0800 (Fri, 02 Mar 2007)

Log Message:
-----------
en0 or computer record GUID lookup of /Computers record.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd-test.plist
    CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd.plist
    CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/test/test_opendirectoryschema.py

Modified: CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd-test.plist
===================================================================
--- CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd-test.plist	2007-03-02 02:25:33 UTC (rev 1301)
+++ CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd-test.plist	2007-03-02 16:56:35 UTC (rev 1302)
@@ -116,6 +116,10 @@
       <string>/Search</string>
       <key>requireComputerRecord</key>
       <true/>
+      <!--
+      <key>computerRecordGUID</key>
+      <string></string>
+       -->
     </dict>
   </dict>
   -->

Modified: CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd.plist
===================================================================
--- CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd.plist	2007-03-02 02:25:33 UTC (rev 1301)
+++ CalendarServer/branches/users/cdaboo/en0-1298/conf/caldavd.plist	2007-03-02 16:56:35 UTC (rev 1302)
@@ -115,6 +115,10 @@
       <string>/Search</string>
       <key>requireComputerRecord</key>
       <true/>
+      <!--
+      <key>computerRecordGUID</key>
+      <string></string>
+       -->
     </dict>
   </dict>
 

Modified: CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/appleopendirectory.py	2007-03-02 02:25:33 UTC (rev 1301)
+++ CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/appleopendirectory.py	2007-03-02 16:56:35 UTC (rev 1302)
@@ -25,6 +25,7 @@
     "OpenDirectoryInitError",
 ]
 
+import os
 import sys
 
 import opendirectory
@@ -53,11 +54,13 @@
     def __repr__(self):
         return "<%s %r: %r>" % (self.__class__.__name__, self.realmName, self.node)
 
-    def __init__(self, node="/Search", requireComputerRecord=True, dosetup=True):
+    def __init__(self, node="/Search", requireComputerRecord=True, computerRecordGUID=None, dosetup=True):
         """
         @param node: an OpenDirectory node name to bind to.
         @param requireComputerRecord: C{True} if the directory schema is to be used to determine
             which calendar users are enabled.
+        @param computerRecordGUID: a C{str} containing the GUID for the computer record to lookup.
+            If it is the empty string or None then the lookup is done using the en0 interface address.
         @param dosetup: if C{True} then the directory records are initialized,
                         if C{False} they are not.
                         This should only be set to C{False} when doing unit tests.
@@ -72,6 +75,7 @@
         self.directory = directory
         self.node = node
         self.requireComputerRecord = requireComputerRecord
+        self.computerRecordGUID = computerRecordGUID
         self._records = {}
         self._delayedCalls = set()
 
@@ -115,8 +119,22 @@
                 % (self.realmName,)
             )
          
-        # Find a record in /Computers with an ENetAddress attribute value equal to the MAC address
-        # and return some useful attributes.
+        # We try either the current machine's en0 value, or the record GUID if supplied
+        if self.computerRecordGUID:
+            query_attr = dsattributes.kDS1AttrGeneratedUID
+            query_value = self.computerRecordGUID
+            query_type = dsattributes.eDSExact
+            query_description = "GUID: %s" % (query_value,)
+        else:
+            # Get MAC address for en0
+            macaddr = os.popen("/sbin/ifconfig en0|grep ether").read().replace("\n", "").split()[1]
+
+            query_attr = dsattributes.kDS1AttrENetAddress
+            query_value = macaddr
+            query_type = dsattributes.eDSExact
+            query_description = "MAC address: %s" % (query_value,)
+
+        # Return some useful attributes.
         attrs = [
             dsattributes.kDS1AttrGeneratedUID,
             dsattributes.kDSNAttrRecordName,
@@ -125,24 +143,30 @@
 
         records = opendirectory.queryRecordsWithAttribute(
             self.directory,
-            dsattributes.kDS1AttrXMLPlist,
-            vhostname,
-            dsattributes.eDSContains,
-            True,    # case insentive for hostnames
+            query_attr,
+            query_value,
+            query_type,
+            False,
             dsattributes.kDSStdRecordTypeComputers,
             attrs
         )
-        self._parseComputersRecords(records, vhostname)
 
-    def _parseComputersRecords(self, records, vhostname):
-        
         # Must have some results
         if len(records) == 0:
             raise OpenDirectoryInitError(
-                "Open Directory (node=%s) has no /Computers records with a virtual hostname: %s"
-                % (self.realmName, vhostname,)
+                "Open Directory (node=%s) has no /Computers records with %s"
+                % (self.realmName, query_description,)
             )
+        elif len(records) > 1:
+            raise OpenDirectoryInitError(
+                "Open Directory (node=%s) has multiple /Computers records with %s"
+                % (self.realmName, query_description,)
+            )
 
+        self._parseComputersRecords(records, vhostname, query_description)
+
+    def _parseComputersRecords(self, records, vhostname, query_description):
+        
         # Now find a single record that actually matches the hostname
         found = False
         for recordname, record in records.iteritems():
@@ -156,16 +180,16 @@
                 continue
             elif found:
                 raise OpenDirectoryInitError(
-                    "Open Directory (node=%s) multiple /Computers records found matching virtual hostname: %s"
-                    % (self.realmName, vhostname,)
+                    "Open Directory (node=%s) has multiple /Computers records with %s"
+                    % (self.realmName, query_description,)
                 )
             else:
                 found = True
                 
         if not found:
             raise OpenDirectoryInitError(
-                "Open Directory (node=%s) no /Computers records with an enabled and valid calendar service were found matching virtual hostname: %s"
-                % (self.realmName, vhostname,)
+                "Open Directory (node=%s) no /Computers records with an enabled and valid calendar service were found with %s"
+                % (self.realmName, query_description,)
             )
     
     def _parseXMLPlist(self, vhostname, recordname, plist, recordguid):

Modified: CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/test/test_opendirectoryschema.py
===================================================================
--- CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/test/test_opendirectoryschema.py	2007-03-02 02:25:33 UTC (rev 1301)
+++ CalendarServer/branches/users/cdaboo/en0-1298/twistedcaldav/directory/test/test_opendirectoryschema.py	2007-03-02 16:56:35 UTC (rev 1302)
@@ -918,7 +918,7 @@
             def _doParseRecords(recordlist, title):
                 service = OpenDirectoryService(node="/Search", dosetup=False)
                 try:
-                    service._parseComputersRecords(recordlist, "calendar.apple.com")
+                    service._parseComputersRecords(recordlist, "calendar.apple.com", "test description")
                     self.fail(msg="Record parse should have failed: %s" % (title,))
                 except OpenDirectoryInitError:
                     pass
@@ -941,7 +941,7 @@
             def _doParseRecords(recordlist, title):
                 service = OpenDirectoryService(node="/Search", dosetup=False)
                 try:
-                    service._parseComputersRecords(recordlist, "calendar.apple.com")
+                    service._parseComputersRecords(recordlist, "calendar.apple.com", "test description")
                 except OpenDirectoryInitError, ex:
                     self.fail(msg="Record parse should not have failed: \"%s\" with error: %s" % (title, ex))
                 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070302/3570c6b3/attachment.html


More information about the calendarserver-changes mailing list