[CalendarServer-changes] [1471] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 11 10:48:13 PDT 2007


Revision: 1471
          http://trac.macosforge.org/projects/calendarserver/changeset/1471
Author:   dreid at apple.com
Date:     2007-04-11 10:48:12 -0700 (Wed, 11 Apr 2007)

Log Message:
-----------
twistedcaldav.pdmonster.PDClientAddressWrapper mutates all incoming requests to point to have the correct remoteAddr as determined by the Pydirector load 
balancer listening on a unix socket config.PythonDirector['ControlSocket'].  This lets us get the proper remoteAddr for the log files and for digest auth.

Modified Paths:
--------------
    CalendarServer/trunk/conf/caldavd-test.plist
    CalendarServer/trunk/twistedcaldav/cluster.py
    CalendarServer/trunk/twistedcaldav/config.py
    CalendarServer/trunk/twistedcaldav/tap.py

Added Paths:
-----------
    CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdamp.patch
    CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdconf.patch
    CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdmain.patch
    CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdnetworktwisted.patch
    CalendarServer/trunk/twistedcaldav/pdmonster.py

Modified: CalendarServer/trunk/conf/caldavd-test.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd-test.plist	2007-04-11 03:48:11 UTC (rev 1470)
+++ CalendarServer/trunk/conf/caldavd-test.plist	2007-04-11 17:48:12 UTC (rev 1471)
@@ -349,6 +349,9 @@
 
       <key>ConfigFile</key>
       <string>conf/pydir.xml</string>
+
+      <key>ControlSocket</key>
+      <string>logs/caldavd-pydir.sock</string>
   </dict>
 
   <key>ControlSocket</key>

Added: CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdamp.patch
===================================================================
--- CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdamp.patch	                        (rev 0)
+++ CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdamp.patch	2007-04-11 17:48:12 UTC (rev 1471)
@@ -0,0 +1,29 @@
+--- pydirector/pdamp.py	1969-12-31 16:00:00.000000000 -0800
++++ pydirector/pdamp.py	2007-04-10 17:25:22.000000000 -0700
+@@ -0,0 +1,26 @@
++from twisted.internet import protocol
++from twisted.protocols import amp
++
++class GetClientAddress(amp.Command):
++    arguments = [('host', amp.String()),
++                 ('port', amp.Integer())]
++
++    response = [('host', amp.String()),
++                ('port', amp.Integer())]
++
++
++class PDControlProtocol(amp.AMP):
++    def __init__(self, director):
++        self.director = director
++
++    def getClientAddress(self, host, port):
++        host, port = self.director.getClientAddress(host, port)
++        return {'host': host, 'port': port}
++    GetClientAddress.responder(getClientAddress)
++
++class PDControlFactory(protocol.ServerFactory):
++    def __init__(self, director):
++        self.director = director
++
++    def buildProtocol(self, addr):
++        return PDControlProtocol(self.director)

Added: CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdconf.patch
===================================================================
--- CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdconf.patch	                        (rev 0)
+++ CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdconf.patch	2007-04-11 17:48:12 UTC (rev 1471)
@@ -0,0 +1,30 @@
+--- pydirector/pdconf.py	2004-12-14 05:31:39.000000000 -0800
++++ pydirector/pdconf.py	2007-04-10 17:25:31.000000000 -0700
+@@ -174,7 +174,7 @@
+ 
+ 
+ class PDConfig(object):
+-    __slots__ = [ 'services', 'admin', 'dom' ]
++    __slots__ = [ 'services', 'admin', 'dom', 'socket' ]
+ 
+     def __init__(self, filename=None, xml=None):
+         import pdlogging
+@@ -186,7 +186,8 @@
+                                                                 dom.nodeName)
+         for item in dom.childNodes:
+             if item.nodeName in ("#text", "#comment"): continue
+-            if item.nodeName not in ( u'service', u'admin', u'logging' ):
++            if item.nodeName not in ( u'service', u'admin',
++                                      u'logging', u'control' ):
+                 raise ConfigError, \
+                     "expected 'service' or 'admin', got '%s'"%item.nodeName
+             if item.nodeName == u'service':
+@@ -198,6 +199,8 @@
+                     raise ConfigError, "only one 'admin' block allowed"
+             elif item.nodeName == u'logging':
+                 pdlogging.initlog(item.getAttribute('file'))
++            elif item.nodeName == u'control':
++                self.socket = item.getAttribute('socket')
+ 
+     def _loadDOM(self, filename, xml):
+         from xml.dom.minidom import parseString

Added: CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdmain.patch
===================================================================
--- CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdmain.patch	                        (rev 0)
+++ CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdmain.patch	2007-04-11 17:48:12 UTC (rev 1471)
@@ -0,0 +1,42 @@
+--- pydirector/pdmain.py	2004-12-14 05:31:39.000000000 -0800
++++ pydirector/pdmain.py	2007-04-10 17:25:12.000000000 -0700
+@@ -9,6 +9,9 @@
+ if sys.version_info < (2,2):
+     class object: pass
+ 
++from twisted.internet import reactor
++from pydirector import pdamp
++
+ class PythonDirector(object):
+ 
+     def __init__(self, config):
+@@ -17,8 +20,17 @@
+         self.schedulers = {}
+         self.manager = None
+         self.conf = pdconf.PDConfig(config)
++        self._connections = {}
+         self.createManager()
+         self.createListeners()
++        reactor.listenUNIX(self.conf.socket,
++                           pdamp.PDControlFactory(self))
++
++    def getClientAddress(self, host, port):
++        return self._connections[(host, port)]
++
++    def setClientAddress(self, host, peer):
++        self._connections[host] = peer
+ 
+     def start(self, profile=0):
+         import sys
+@@ -69,8 +81,9 @@
+             self.listeners[service.name] = []
+             for lobj in service.listen:
+                 l = pdnetwork.Listener(service.name,
+-                                   pdconf.splitHostPort(lobj),
+-                                   scheduler)
++                                       pdconf.splitHostPort(lobj),
++                                       scheduler,
++                                       self)
+                 self.listeners[service.name].append(l)
+ 
+     def enableGroup(self, serviceName, groupName):

Added: CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdnetworktwisted.patch
===================================================================
--- CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdnetworktwisted.patch	                        (rev 0)
+++ CalendarServer/trunk/lib-patches/PyDirector/pydirector.pdnetworktwisted.patch	2007-04-11 17:48:12 UTC (rev 1471)
@@ -0,0 +1,46 @@
+--- pydirector/pdnetworktwisted.py	2004-12-14 05:31:39.000000000 -0800
++++ pydirector/pdnetworktwisted.py	2007-04-10 17:25:44.000000000 -0700
+@@ -28,10 +28,13 @@
+         attribute .listening_address: read - a tuple of (host,port)
+     """
+ 
+-    def __init__(self, name, (bindhost, bindport), scheduler):
++    def __init__(self, name, (bindhost, bindport), scheduler, director):
+         self.name = name
+         self.listening_address = (bindhost, bindport)
+-        self.rfactory = ReceiverFactory((bindhost,bindport), scheduler)
++        self.director = director
++        self.rfactory = ReceiverFactory((bindhost,bindport),
++                                        scheduler,
++                                        self.director)
+         self.setScheduler(scheduler)
+         reactor.listenTCP(bindport, self.rfactory, interface=bindhost)
+ 
+@@ -79,6 +82,14 @@
+             it's ok to send any buffered data from the client.
+         """
+         #print "client connection",self.factory
++        #XXX: OMG THIS IS HORRIBLE
++        inSrc = self.receiver.transport.getPeer()
++        outSrc = self.transport.getHost()
++
++        self.receiver.factory.director.setClientAddress(
++            (outSrc.host, outSrc.port),
++            (inSrc.host, inSrc.port))
++
+         if self.receiver.receiverOk:
+             self.receiver.setSender(self)
+         else:
+@@ -197,10 +208,11 @@
+     protocol = Receiver
+     noisy = 0
+ 
+-    def __init__(self, (bindhost, bindport), scheduler):
++    def __init__(self, (bindhost, bindport), scheduler, director):
+         self.bindhost = bindhost
+         self.bindport = bindport
+         self.scheduler = scheduler
++        self.director = director
+ 
+     def setScheduler(self, scheduler):
+         self.scheduler = scheduler

Modified: CalendarServer/trunk/twistedcaldav/cluster.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cluster.py	2007-04-11 03:48:11 UTC (rev 1470)
+++ CalendarServer/trunk/twistedcaldav/cluster.py	2007-04-11 17:48:12 UTC (rev 1471)
@@ -44,6 +44,7 @@
 configTemplate = """
 <pdconfig>
     %(services)s
+    <control socket="%(controlSocket)s" />
 </pdconfig>
 """
 
@@ -235,6 +236,7 @@
 
         pdconfig = configTemplate % {
             'services': '\n'.join(services),
+            'controlSocket': config.PythonDirector["ControlSocket"],
             }
 
         fd, fname = tempfile.mkstemp(prefix='pydir')

Modified: CalendarServer/trunk/twistedcaldav/config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/config.py	2007-04-11 03:48:11 UTC (rev 1470)
+++ CalendarServer/trunk/twistedcaldav/config.py	2007-04-11 17:48:12 UTC (rev 1471)
@@ -163,6 +163,7 @@
     "PythonDirector": {
         "pydir": "/usr/share/caldavd/bin/pydir.py",
         "ConfigFile": "/etc/caldavd/pydir.xml",
+        "ControlSocket": "/var/run/caldavd-pydir.sock",
     },
 
     # Umask

Added: CalendarServer/trunk/twistedcaldav/pdmonster.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/pdmonster.py	                        (rev 0)
+++ CalendarServer/trunk/twistedcaldav/pdmonster.py	2007-04-11 17:48:12 UTC (rev 1471)
@@ -0,0 +1,47 @@
+from twisted.internet import protocol
+from twisted.internet import address
+from twisted.protocols import amp
+
+from twisted.web2.resource import WrapperResource
+
+from twistedcaldav import logging
+
+class PDClientAddressWrapper(WrapperResource):
+    def __init__(self, resource, socket):
+        super(PDClientAddressWrapper, self).__init__(resource)
+
+        self.socket = socket
+        self.client = None
+        self.protocol = None
+
+    def hook(self, request):
+        from twisted.internet import reactor
+
+        def _gotProtocol(proto):
+            self.protocol = proto
+
+            return self.hook(request)
+
+        def _gotAddress(result):
+            logging.debug('result = %r' % (result,))
+            request.remoteAddr = address.IPv4Address(
+                'TCP',
+                result['host'],
+                int(result['port']))
+
+        if self.protocol is not None:
+            host, port = request.remoteAddr.host, request.remoteAddr.port
+            logging.debug("GetClientAddress(host=%r, port=%r)" % (host, port))
+            d = self.protocol.callRemoteString("GetClientAddress",
+                                                  host=host,
+                                                  port=str(port))
+            d.addCallback(_gotAddress)
+            return d
+
+        else:
+            self.client = protocol.ClientCreator(reactor, amp.AMP)
+
+            d = self.client.connectUNIX(self.socket)
+            d.addCallback(_gotProtocol)
+
+            return d

Modified: CalendarServer/trunk/twistedcaldav/tap.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/tap.py	2007-04-11 03:48:11 UTC (rev 1470)
+++ CalendarServer/trunk/twistedcaldav/tap.py	2007-04-11 17:48:12 UTC (rev 1471)
@@ -63,6 +63,8 @@
 
 from twistedcaldav.static import CalendarHomeProvisioningFile
 
+from twistedcaldav import pdmonster
+
 try:
     from twistedcaldav.authkerb import NegotiateCredentialFactory
 except ImportError:
@@ -446,7 +448,7 @@
             (auth.IPrincipal,)
         )
 
-        site = Site(LogWrapperResource(authWrapper))
+        logWrapper = LogWrapperResource(authWrapper)
 
         #
         # Configure the service
@@ -454,13 +456,17 @@
 
         log.msg("Setting up service")
 
-        channel = http.HTTPFactory(site)
+        if config.ProcessType == 'Slave':
+            realRoot = pdmonster.PDClientAddressWrapper(
+                logWrapper,
+                config.PythonDirector['ControlSocket'])
 
-        if config.ProcessType == 'Slave':
             logObserver = logging.AMPCommonAccessLoggingObserver(
                 config.ControlSocket)
 
         elif config.ProcessType == 'Single':
+            realRoot = logWrapper
+
             logObserver = logging.RotatingFileAccessLoggingObserver(
                 config.AccessLogFile)
 
@@ -469,6 +475,10 @@
 
         service = CalDAVService(logObserver)
 
+        site = Site(realRoot)
+
+        channel = http.HTTPFactory(site)
+
         if not config.BindAddresses:
             config.BindAddresses = [""]
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070411/0f90e4e6/attachment.html


More information about the calendarserver-changes mailing list