[CalendarServer-changes] [147] CalendarServer/branches/users/cdaboo/quota

source_changes at macosforge.org source_changes at macosforge.org
Mon Sep 18 14:05:38 PDT 2006


Revision: 147
Author:   cdaboo at apple.com
Date:     2006-09-18 14:05:35 -0700 (Mon, 18 Sep 2006)

Log Message:
-----------
Access log support. Split logging into two files: access log (server.log) and error log (error.log). Access log
is Apache-style log, error log is what we had before. Error log still spews out request info for OK requests
so more work is required there to actually make it useful.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/quota/bin/caldavd
    CalendarServer/branches/users/cdaboo/quota/conf/caldavd-dev.plist
    CalendarServer/branches/users/cdaboo/quota/conf/caldavd.plist
    CalendarServer/branches/users/cdaboo/quota/conf/launchd.plist
    CalendarServer/branches/users/cdaboo/quota/twistedcaldav/logging.py

Modified: CalendarServer/branches/users/cdaboo/quota/bin/caldavd
===================================================================
--- CalendarServer/branches/users/cdaboo/quota/bin/caldavd	2006-09-18 19:47:33 UTC (rev 146)
+++ CalendarServer/branches/users/cdaboo/quota/bin/caldavd	2006-09-18 21:05:35 UTC (rev 147)
@@ -56,10 +56,14 @@
         self.keyfile = "/etc/certificates/Default.key"
         self.certfile = "/etc/certificates/Default.crt"
 
-        self.logfile = "/var/log/caldavd/server.log"
+        self.serverlogfile = "/var/log/caldavd/server.log"
+        self.errorlogfile = "/var/log/caldavd/error.log"
         self.pidfile = "/var/run/caldavd.pid"
         
         self.twistd = "/usr/share/caldavd/bin/twistd"
+
+        self.maxsize  =  1048576    # 1 Mb
+        self.quota    =  104857600  # 100 Mb
         
         self.action = None
     
@@ -83,9 +87,12 @@
         print "Only Use SSL:                     %s" % (self.onlyssl,)
         print "SSL Private Key File:             %s" % (self.keyfile,)
         print "SSL Certificate File:             %s" % (self.certfile,)
-        print "Log File:                         %s" % (self.logfile,)
+        print "Server Log File:                  %s" % (self.serverlogfile,)
+        print "Error Log File:                   %s" % (self.errorlogfile,)
         print "PID File:                         %s" % (self.pidfile,)
         print "twistd Location:                  %s" % (self.twistd,)
+        print "Maximum Calendar Resource Size:   %d bytes" % (self.maxsize,)
+        print "Global per-user quota limit:      %d bytes" % (self.quota,)
 
     def run(self):
         """
@@ -125,7 +132,7 @@
         args.append(self.twistd)
         if not self.daemonize:
             args.append("-n")
-        args.append("--logfile=%s" % (self.logfile,))
+        args.append("--logfile=%s" % (self.errorlogfile,))
         args.append("--pidfile=%s" % (self.pidfile,))
         args.append("-y")
         args.append(tac)
@@ -247,21 +254,24 @@
         
         # dict that maps between plist keys and class attributes
         mapper = {
-                   "Verbose":             "verbose",
-                   "RunStandalone":       "daemonize",
-                   "DocumentRoot":        "docroot",
-                   "Port":                "port",
-                   "SSLEnable":           "dossl",
-                   "SSLPort":             "sslport",
-                   "SSLOnly":             "onlyssl",
-                   "SSLPrivateKey":       "keyfile",
-                   "SSLCertificate":      "certfile",
-                   "LogFile":             "logfile",
-                   "PIDFile":             "pidfile",
-                   "Repository":          "repo",
-                   "CreateAccounts":      "doacct",
-                   "ResetAccountACLs":    "doacl",
-                   "twistdLocation":      "twistd",
+                   "Verbose":                    "verbose",
+                   "RunStandalone":              "daemonize",
+                   "DocumentRoot":               "docroot",
+                   "Port":                       "port",
+                   "SSLEnable":                  "dossl",
+                   "SSLPort":                    "sslport",
+                   "SSLOnly":                    "onlyssl",
+                   "SSLPrivateKey":              "keyfile",
+                   "SSLCertificate":             "certfile",
+                   "ServerLogFile":              "serverlogfile",
+                   "ErrorLogFile":               "errorlogfile",
+                   "PIDFile":                    "pidfile",
+                   "Repository":                 "repo",
+                   "CreateAccounts":             "doacct",
+                   "ResetAccountACLs":           "doacl",
+                   "twistdLocation":             "twistd",
+                   "MaximumAttachmentSizeBytes": "maxsize",
+                   "UserQuotaBytes":             "quota",
                   }
         
         for k,v in root.items():
@@ -292,7 +302,7 @@
             self.dossl = True
 
         if not self.daemonize:
-            self.logfile = "-"
+            self.errorlogfile = "-"
 
         if not os.path.exists(self.twistd):
             print "twistd does not exist: %s" % (self.twistd,)
@@ -317,17 +327,21 @@
 import os
 from os.path import dirname, join
 
-docroot  = "%(docroot)s"
-repo     = "%(repo)s"
-doacct   =  %(doacct)s
-doacl    =  %(doacl)s
-dossl    =  %(dossl)s
-keyfile  = "%(keyfile)s"
-certfile = "%(certfile)s"
-onlyssl  =  %(onlyssl)s
-port     =  %(port)d
-sslport  =  %(sslport)d
+docroot   = "%(docroot)s"
+repo      = "%(repo)s"
+doacct    =  %(doacct)s
+doacl     =  %(doacl)s
+dossl     =  %(dossl)s
+keyfile   = "%(keyfile)s"
+certfile  = "%(certfile)s"
+onlyssl   =  %(onlyssl)s
+port      =  %(port)d
+sslport   =  %(sslport)d
+maxsize   =  %(maxsize)d
+quota     =  %(quota)d
+serverlog = "%(serverlogfile)s"
 
+
 if not dossl and onlyssl:
     dossl = True
 
@@ -352,26 +366,48 @@
     else:
         raise IOError("SSL Certificate file does not exist: %%s" %% (certfile,))
 
-from twisted.application.service  import Application, IServiceCollection
+from twisted.application.service  import Application, IServiceCollection, MultiService
 from twisted.application.internet import TCPServer
-from twisted.cred.portal 		  import Portal
-from twisted.web2.auth			  import basic
+from twisted.cred.portal          import Portal
+from twisted.web2.auth            import basic
 from twisted.web2.dav             import davxml, auth
+from twisted.web2.log             import LogWrapperResource
 from twisted.web2.server          import Site
 from twisted.web2.channel.http    import HTTPFactory
 
 if dossl:
     from twisted.application.internet import SSLServer
-    from twisted.internet.ssl import DefaultOpenSSLContextFactory
+    from twisted.internet.ssl         import DefaultOpenSSLContextFactory
 
+from twistedcaldav.logging    import RotatingFileAccessLoggingObserver
 from twistedcaldav.repository import RepositoryBuilder
 
-builder = RepositoryBuilder(docroot, doAccounts=doacct, resetACLs=doacl)
+class Web2Service(MultiService):
+    def __init__(self, logObserver):
+        self.logObserver = logObserver
+        MultiService.__init__(self)
+
+    def startService(self):
+        MultiService.startService(self)
+        self.logObserver.start()
+
+    def stopService(self):
+        MultiService.stopService(self)
+        self.logObserver.stop()
+
+builder = RepositoryBuilder(docroot,
+                            doAccounts=doacct,
+                            resetACLs=doacl,
+                            maxsize=maxsize,
+                            quota=quota)
 builder.buildFromFile(repo)
 rootresource = builder.docRoot.collection.resource
 
 application = Application("CalDAVServer")
 parent      = IServiceCollection(application)
+web2        = Web2Service(RotatingFileAccessLoggingObserver(serverlog))
+web2.setServiceParent(parent)
+parent = web2
 
 portal = Portal(auth.DavRealm())
 portal.registerChecker(auth.TwistedPropertyChecker())
@@ -380,10 +416,10 @@
 
 loginInterfaces = (auth.IPrincipal,)
 
-site = Site(auth.AuthenticationWrapper(rootresource, 
-                                            portal,
-                                            credentialFactories,
-                                            loginInterfaces))
+site = Site(LogWrapperResource(auth.AuthenticationWrapper(rootresource, 
+                                                          portal,
+                                                          credentialFactories,
+                                                          loginInterfaces)))
 
 factory     = HTTPFactory(site)
 
@@ -395,16 +431,19 @@
     print "Starting https server"
     sslContext = DefaultOpenSSLContextFactory(keyfile, certfile)
     sslserver  = SSLServer(sslport, factory, sslContext).setServiceParent(parent)
-""" % {"docroot":     self.docroot,
-       "repo":        self.repo,
-       "doacct":      self.doacct,
-       "doacl":       self.doacl,
-       "dossl":       self.dossl,
-       "keyfile":     self.keyfile,
-       "certfile":    self.certfile,
-       "onlyssl":     self.onlyssl,
-       "port":        self.port,
-       "sslport":     self.sslport}
+""" % {"docroot":       self.docroot,
+       "repo":          self.repo,
+       "doacct":        self.doacct,
+       "doacl":         self.doacl,
+       "dossl":         self.dossl,
+       "keyfile":       self.keyfile,
+       "certfile":      self.certfile,
+       "onlyssl":       self.onlyssl,
+       "port":          self.port,
+       "sslport":       self.sslport,
+       "maxsize":       self.maxsize,
+       "quota":         self.quota,
+       "serverlogfile": self.serverlogfile}
 
 if __name__ == "__main__":
 

Modified: CalendarServer/branches/users/cdaboo/quota/conf/caldavd-dev.plist
===================================================================
--- CalendarServer/branches/users/cdaboo/quota/conf/caldavd-dev.plist	2006-09-18 19:47:33 UTC (rev 146)
+++ CalendarServer/branches/users/cdaboo/quota/conf/caldavd-dev.plist	2006-09-18 21:05:35 UTC (rev 147)
@@ -47,9 +47,12 @@
   <key>SSLCertificate</key>
   <string>conf/server.pem</string>
 
-  <key>LogFile</key>
-  <string>bin/caldavd.log</string>
+  <key>ServerLogFile</key>
+  <string>bin/server.log</string>
 
+  <key>ErrorLogFile</key>
+  <string>bin/error.log</string>
+
   <key>PIDFile</key>
   <string>bin/twistd-caldavd.pid</string>
 

Modified: CalendarServer/branches/users/cdaboo/quota/conf/caldavd.plist
===================================================================
--- CalendarServer/branches/users/cdaboo/quota/conf/caldavd.plist	2006-09-18 19:47:33 UTC (rev 146)
+++ CalendarServer/branches/users/cdaboo/quota/conf/caldavd.plist	2006-09-18 21:05:35 UTC (rev 147)
@@ -47,9 +47,12 @@
   <key>SSLCertificate</key>
   <string>/etc/certificates/Default.crt</string>
 
-  <key>LogFile</key>
+  <key>ServerLogFile</key>
   <string>/var/log/caldavd/server.log</string>
 
+  <key>ErrorLogFile</key>
+  <string>/var/log/caldavd/error.log</string>
+
   <key>PIDFile</key>
   <string>/var/log/caldavd/caldavd.pid</string>
 

Modified: CalendarServer/branches/users/cdaboo/quota/conf/launchd.plist
===================================================================
--- CalendarServer/branches/users/cdaboo/quota/conf/launchd.plist	2006-09-18 19:47:33 UTC (rev 146)
+++ CalendarServer/branches/users/cdaboo/quota/conf/launchd.plist	2006-09-18 21:05:35 UTC (rev 147)
@@ -46,7 +46,7 @@
   <true/>
 
   <key>StandardOutPath</key>
-  <string>/var/log/caldavd/error.log</string>
+  <string>/var/log/caldavd/server.log</string>
 
   <key>StandardErrorPath</key>
   <string>/var/log/caldavd/error.log</string>

Modified: CalendarServer/branches/users/cdaboo/quota/twistedcaldav/logging.py
===================================================================
--- CalendarServer/branches/users/cdaboo/quota/twistedcaldav/logging.py	2006-09-18 19:47:33 UTC (rev 146)
+++ CalendarServer/branches/users/cdaboo/quota/twistedcaldav/logging.py	2006-09-18 21:05:35 UTC (rev 147)
@@ -22,12 +22,16 @@
 0    - no logging
 1    - errors only
 2    - errors and warnings only
-3    - errors, warnings and debug
+3    - errors, warnings and info
+3    - errors, warnings, info and debug
 """
 
+import datetime
+
 from twisted.python import log
+from twisted.web2.log import BaseCommonAccessLoggingObserver
 
-logtypes = {"none": 0, "info": 1, "warning": 2, "error": 3, "debug": 4}
+logtypes = {"none": 0, "error": 1, "warning": 2, "info": 3, "debug": 4}
 
 currentLogLevel = 1
 
@@ -85,3 +89,22 @@
     if canLog("debug"):
         log.msg(message, debug=True, **kwargs)
 
+class RotatingFileAccessLoggingObserver(BaseCommonAccessLoggingObserver):
+    """I log requests to a single logfile
+    """
+    
+    def __init__(self, logpath):
+        self.logpath = logpath
+                
+    def logMessage(self, message):
+        self.f.write(message + '\n')
+
+    def start(self):
+        super(RotatingFileAccessLoggingObserver, self).start()
+        self.f = open(self.logpath, 'a', 1)
+        self.logMessage("Log opened: [%s]." % (datetime.datetime.now().ctime(),))
+        
+    def stop(self):
+        self.logMessage("Log closed: [%s]." % (datetime.datetime.now().ctime(),))
+        super(RotatingFileAccessLoggingObserver, self).stop()
+        self.f.close()

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


More information about the calendarserver-changes mailing list