[CalendarServer-changes] [253] CalendarServer/trunk/bin/dircaldavd
source_changes at macosforge.org
source_changes at macosforge.org
Thu Oct 5 11:38:49 PDT 2006
Revision: 253
http://trac.macosforge.org/projects/calendarserver/changeset/253
Author: cdaboo at apple.com
Date: 2006-10-05 11:38:48 -0700 (Thu, 05 Oct 2006)
Log Message:
-----------
No longer needed after r252.
Removed Paths:
-------------
CalendarServer/trunk/bin/dircaldavd
Deleted: CalendarServer/trunk/bin/dircaldavd
===================================================================
--- CalendarServer/trunk/bin/dircaldavd 2006-10-05 18:23:24 UTC (rev 252)
+++ CalendarServer/trunk/bin/dircaldavd 2006-10-05 18:38:48 UTC (rev 253)
@@ -1,462 +0,0 @@
-#!/usr/bin/env python
-
-##
-# Copyright (c) 2005-2006 Apple Computer, 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.
-#
-# DRI: Cyrus Daboo, cdaboo at apple.com
-##
-
-import sys
-import os
-import getopt
-import signal
-from tempfile import mkstemp
-
-try:
- #
- # plistlib is only included in Mac OS distributions of Python.
- # This may change in Python 2.6, see:
- # https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1555501&group_id=5470
- #
- from plistlib import readPlist
-except ImportError:
- from twistedcaldav.py.plistlib import readPlist
-
-sys.path.insert(0, "/usr/share/caldavd/lib/python")
-
-"""
-Parse the command line and read in a configuration file and then launch the server.
-"""
-
-class caldavd(object):
- """
- Runs the caldav server.
- """
-
- def __init__(self):
- # Option defaults
- self.plistfile = "/etc/caldavd/caldavd.plist"
-
- self.verbose = False
- self.daemonize = True
- self.docroot = "/Library/CalendarServer/Documents"
-
- self.repo = "/etc/caldavd/repository.xml"
- self.doacct = False
- self.doacl = False
-
- self.port = 8008
- self.dossl = False
- self.sslport = 8443
- self.onlyssl = False
- self.keyfile = "/etc/certificates/Default.key"
- self.certfile = "/etc/certificates/Default.crt"
-
- 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
-
- def printit(self):
- """
- Print out details about the current configuration.
- """
-
- print "Current Configuration"
- print ""
- print "Configuration File: %s" % (self.plistfile,)
- print ""
- print "Run as daemon: %s" % (self.daemonize,)
- print "Document Root: %s" % (self.docroot,)
- print "Repository Configuration: %s" % (self.repo,)
- print "Generate Accounts in Repository: %s" % (self.doacct,)
- print "Reset ACLs on Generated Accounts: %s" % (self.doacl,)
- print "Non-ssl Port: %s" % (self.port,)
- print "Use SSL: %s" % (self.dossl,)
- print "SSL Port: %s" % (self.sslport,)
- print "Only Use SSL: %s" % (self.onlyssl,)
- print "SSL Private Key File: %s" % (self.keyfile,)
- print "SSL Certificate File: %s" % (self.certfile,)
- 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):
- """
- Run the caldavd server using the provided options and configuration.
-
- @raise: C:{ValueError} if options or configuration are wrong.
- """
-
- # Parse command line options and config file
- self.commandLine()
- if self.action is None:
- return
-
- # Dispatch action
- {"start": self.start,
- "stop": self.stop,
- "restart": self.restart}[self.action]()
-
- def start(self):
- """
- Start the caldavd server.
- """
-
- print "Starting CalDAV Server",
- try:
- fd, tac = mkstemp(prefix="caldav")
- os.write(fd, self.generateTAC())
- os.close(fd)
- except Exception, e:
- print " [Failed]"
- print "Unable to create temporary file for server configuration."
- print e
- sys.exit(1)
-
- # Create arguments for twistd
- args = [os.path.basename(sys.executable)]
- args.append(self.twistd)
- if not self.daemonize:
- args.append("-n")
- args.append("--logfile=%s" % (self.errorlogfile,))
- args.append("--pidfile=%s" % (self.pidfile,))
- args.append("-y")
- args.append(tac)
-
- # Create environment for twistd
- environment = dict(os.environ)
- environment["PYTHONPATH"] = ":".join(sys.path)
-
- # spawn the twistd python process
- try:
- os.spawnve(os.P_WAIT, sys.executable, args, environment)
- except OSError, why:
- print " [Failed]"
- print "Error: %s" % (why[1],)
-
- # Get rid of temp file
- try:
- os.unlink(tac)
- except:
- pass
- print " [Done]"
-
- def stop(self):
- """
- Stop the caldavd server.
- """
-
- if os.path.exists(self.pidfile):
- try:
- pid = int(open(self.pidfile).read())
- except ValueError:
- sys.exit("Pidfile %s contains non-numeric value" % self.pidfile)
- try:
- print "Stopping CalDAV Server",
- os.kill(pid, signal.SIGTERM)
- print " [Done]"
- except OSError, why:
- print " [Failed]"
- print "Error: %s" % (why[1],)
- else:
- print "CalDAV server is not running"
-
- def restart(self):
- """
- Restart the caldavd server.
- """
- self.stop()
- self.start()
-
- def commandLine(self):
- """
- Parse the command line options into the config object.
-
- @return: the C{str} for the requested action, or C{None} when
- immediate exit is called for.
- @raise: C{ValueError} when a problem occurs with the options.
- """
- options, args = getopt.getopt(sys.argv[1:], "hvf:XT:p")
-
- # Process the plist file first, then the options, so that command line
- # options get to override plist options
- pls = [p for p in options if p[0] == "-f"]
- if len(pls) == 1:
- self.plistfile = pls[0][1]
- if not os.path.exists(self.plistfile):
- print "Configuration file does not exist: %s" % (self.plistfile,)
- raise ValueError
- self.parsePlist()
-
- # Parse all the options
- do_print = False
- for option, value in options:
- if option == "-h":
- self.usage()
- return
- elif option == "-v":
- self.verbose = True
- elif option == "-f":
- # We should have handled this already
- pass
- elif option == "-X":
- self.daemonize = False
- elif option == "-T":
- self.twistd = value
- elif option == "-p":
- do_print = True
- else:
- print "Unrecognized option: %s" % (option,)
- self.usage()
- raise ValueError
-
- # Print out config if requested
- if do_print:
- self.printit()
- return
-
- # Process arguments
- if len(args) == 0:
- print "No arguments given. One of start, stop or restart must be present."
- self.usage()
- raise ValueError
- elif len(args) > 1:
- print "Too many arguments given. Only one of start, stop or restart must be present."
- self.usage()
- raise ValueError
- elif args[0] not in ("start", "stop", "restart"):
- print "Wrong arguments given: %s" % (args[0],)
- self.usage()
- raise ValueError
-
- # Verify that configuration is valid
- if not self.validate():
- raise ValueError
-
- self.action = args[0]
-
- def parsePlist(self):
- root = readPlist(self.plistfile)
-
- # 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",
- "ServerLogFile": "serverlogfile",
- "ErrorLogFile": "errorlogfile",
- "PIDFile": "pidfile",
- "Repository": "repo",
- "CreateAccounts": "doacct",
- "ResetAccountACLs": "doacl",
- "twistdLocation": "twistd",
- "MaximumAttachmentSizeBytes": "maxsize",
- "UserQuotaBytes": "quota",
- }
-
- for k,v in root.items():
- if mapper.has_key(k) and hasattr(self, mapper[k]):
- setattr(self, mapper[k], v)
-
- def validate(self):
-
- result = True
-
- if not os.path.exists(self.docroot):
- print "Document Root does not exist: %s" % (self.docroot,)
- result = False
-
- if not os.path.exists(self.repo):
- print "Repository File does not exist: %s" % (self.repo,)
- result = False
-
- if self.dossl and not os.path.exists(self.keyfile):
- print "SSL Private Key File does not exist: %s" % (self.keyfile,)
- result = False
-
- if self.dossl and not os.path.exists(self.certfile):
- print "SSL Certificate File does not exist: %s" % (self.certfile,)
- result = False
-
- if not self.dossl and self.onlyssl:
- self.dossl = True
-
- if not self.daemonize:
- self.errorlogfile = "-"
-
- if not os.path.exists(self.twistd):
- print "twistd does not exist: %s" % (self.twistd,)
- result = False
-
- return result
-
- def usage(self):
- default = caldavd()
- print """Usage: caldavd [options] start|stop|restart
-Options:
- -h Print this help and exit
- -v Be verbose
- -f config Specify path to configuration file [""" + default.plistfile + """]
- -X Do not daemonize
- -T twistd Specify path to twistd [""" + default.twistd + """]
- -p Print current configuration and exit
-"""
-
- def generateTAC(self):
- return """
-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
-maxsize = %(maxsize)d
-quota = %(quota)d
-serverlog = "%(serverlogfile)s"
-
-
-if not dossl and onlyssl:
- dossl = True
-
-if os.path.exists(docroot):
- print "Document root is: %%s" %% (docroot,)
-else:
- raise IOError("No such docroot: %%s" %% (docroot,))
-
-if os.path.exists(repo):
- print "Repository configuration is: %%s" %% (repo,)
-else:
- raise IOError("No such repo: %%s" %% (repo,))
-
-if dossl:
- if os.path.exists(keyfile):
- print "Using SSL private key file: %%s" %% (keyfile,)
- else:
- raise IOError("SSL Private Key file does not exist: %%s" %% (keyfile,))
-
- if os.path.exists(certfile):
- print "Using SSL certificate file: %%s" %% (certfile,)
- else:
- raise IOError("SSL Certificate file does not exist: %%s" %% (certfile,))
-
-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.web2.dav import davxml, auth
-from twisted.web2.log import LogWrapperResource
-from twisted.web2.server import Site
-from twisted.web2.channel.http import HTTPFactory
-from twistedcaldav.directory import DirectoryCredentialsChecker
-
-if dossl:
- from twisted.application.internet import SSLServer
- from twisted.internet.ssl import DefaultOpenSSLContextFactory
-
-from twistedcaldav.logging import RotatingFileAccessLoggingObserver
-from twistedcaldav.repository import RepositoryBuilder
-
-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(DirectoryCredentialsChecker())
-
-credentialFactories = (basic.BasicCredentialFactory(""),)
-
-loginInterfaces = (auth.IPrincipal,)
-
-site = Site(LogWrapperResource(auth.AuthenticationWrapper(rootresource,
- portal,
- credentialFactories,
- loginInterfaces)))
-
-factory = HTTPFactory(site)
-
-if not onlyssl:
- print "Starting http server"
- server = TCPServer(port, factory).setServiceParent(parent)
-
-if dossl:
- 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,
- "maxsize": self.maxsize,
- "quota": self.quota,
- "serverlogfile": self.serverlogfile}
-
-if __name__ == "__main__":
-
- try:
- caldavd().run()
- except Exception, e:
- sys.exit(str(e))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061005/e28999c5/attachment.html
More information about the calendarserver-changes
mailing list