[CalendarServer-changes] [6920] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 14 09:19:00 PST 2011


Revision: 6920
          http://trac.macosforge.org/projects/calendarserver/changeset/6920
Author:   sagen at apple.com
Date:     2011-02-14 09:18:59 -0800 (Mon, 14 Feb 2011)
Log Message:
-----------
Adds calendarserver_bootstrap_database, a utility which creates a Postgres user for Calendar Server, creates a database, and installs the schema.

Modified Paths:
--------------
    CalendarServer/trunk/contrib/create_caldavd_db.sh
    CalendarServer/trunk/setup.py
    CalendarServer/trunk/support/Makefile.Apple
    CalendarServer/trunk/txdav/common/datastore/sql_schema_v1.sql

Added Paths:
-----------
    CalendarServer/trunk/bin/calendarserver_bootstrap_database
    CalendarServer/trunk/calendarserver/tools/bootstrapdatabase.py
    CalendarServer/trunk/doc/calendarserver_bootstrap_database.8

Added: CalendarServer/trunk/bin/calendarserver_bootstrap_database
===================================================================
--- CalendarServer/trunk/bin/calendarserver_bootstrap_database	                        (rev 0)
+++ CalendarServer/trunk/bin/calendarserver_bootstrap_database	2011-02-14 17:18:59 UTC (rev 6920)
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+##
+# Copyright (c) 2011 Apple 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.
+##
+
+import sys
+
+#PYTHONPATH
+
+if __name__ == "__main__":
+    if "PYTHONPATH" in globals():
+        sys.path.insert(0, PYTHONPATH)
+    else:
+        from os.path import dirname, abspath, join
+        from subprocess import Popen, PIPE
+
+        home = dirname(dirname(abspath(__file__)))
+        run = join(home, "run")
+
+        child = Popen((run, "-p"), stdout=PIPE)
+        path, stderr = child.communicate()
+
+        path = path.rstrip("\n")
+
+        if child.wait() == 0:
+            sys.path[0:0] = path.split(":")
+
+    from calendarserver.tools.bootstrapdatabase import main
+    main()


Property changes on: CalendarServer/trunk/bin/calendarserver_bootstrap_database
___________________________________________________________________
Added: svn:executable
   + *

Added: CalendarServer/trunk/calendarserver/tools/bootstrapdatabase.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/bootstrapdatabase.py	                        (rev 0)
+++ CalendarServer/trunk/calendarserver/tools/bootstrapdatabase.py	2011-02-14 17:18:59 UTC (rev 6920)
@@ -0,0 +1,251 @@
+##
+# Copyright (c) 2011 Apple 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.
+##
+
+from getopt import getopt, GetoptError
+import os
+import subprocess
+import sys
+
+CONNECTNAME   = "_postgres"
+USERNAME      = "caldav"
+DATABASENAME  = "caldav"
+SCHEMAFILE    = "/usr/share/caldavd/lib/python/txdav/common/datastore/sql_schema_v1.sql"
+SCHEMAVERSION = 3
+
+# Executables:
+CREATEDB      = "/usr/bin/createdb"
+CREATEUSER    = "/usr/bin/createuser"
+PSQL          = "/usr/bin/psql"
+
+def usage(e=None):
+    name = os.path.basename(sys.argv[0])
+    print "usage: %s [options] username" % (name,)
+    print ""
+    print " Bootstrap calendar server postgres database and schema"
+    print ""
+    print "options:"
+    print "  -h --help: print this help and exit"
+    print "  -v --verbose: print additional information"
+    print ""
+
+    if e:
+        sys.stderr.write("%s\n" % (e,))
+        sys.exit(64)
+    else:
+        sys.exit(0)
+
+def createUser(verbose=False):
+    """
+    Create the user which calendar server will use to access postgres.
+    Return True if user is created, False if user already existed.
+    Raise BootstrapError if there is an issue.
+    """
+
+    cmdArgs = [
+        CREATEUSER,
+        "--username=%s" % (CONNECTNAME,),
+        USERNAME,
+        "--no-superuser",
+        "--createdb",
+        "--no-createrole"
+    ]
+    try:
+        if verbose:
+            print "\nAttempting to create user..."
+            print "Executing: %s" % (" ".join(cmdArgs))
+        out = subprocess.check_output(cmdArgs, stderr=subprocess.STDOUT)
+        if verbose:
+            print out
+        return True
+    except subprocess.CalledProcessError, e:
+        if verbose:
+            print e.output
+        if "already exists" in e.output:
+            return False
+        raise BootstrapError(
+            "%s failed:\n%s (exit code = %d)" %
+            (CREATEUSER, e.output, e.returncode)
+        )
+
+
+def createDatabase(verbose=False):
+    """
+    Create the database which calendar server will use within postgres.
+    Return True if database is created, False if database already existed.
+    Raise BootstrapError if there is an issue.
+    """
+
+    cmdArgs = [
+        CREATEDB,
+        "--username=%s" % (USERNAME,),
+        DATABASENAME,
+    ]
+    try:
+        if verbose:
+            print "\nAttempting to create database..."
+            print "Executing: %s" % (" ".join(cmdArgs))
+        out = subprocess.check_output(cmdArgs, stderr=subprocess.STDOUT)
+        if verbose:
+            print out
+        return True
+    except subprocess.CalledProcessError, e:
+        if verbose:
+            print e.output
+        if "already exists" in e.output:
+            return False
+        raise BootstrapError(
+            "%s failed:\n%s (exit code = %d)" %
+            (CREATEDB, e.output, e.returncode)
+        )
+
+
+def getSchemaVersion(verbose=False):
+    """
+    Return the version number for the schema installed in the database.
+    Raise BootstrapError if there is an issue.
+    """
+
+    cmdArgs = [
+        PSQL,
+        "-d", DATABASENAME,
+        "-U", USERNAME,
+        "-t",
+        "-c", "select value from calendarserver where name='VERSION';",
+    ]
+    try:
+        if verbose:
+            print "\nAttempting to read schema version..."
+            print "Executing: %s" % (" ".join(cmdArgs))
+        out = subprocess.check_output(cmdArgs, stderr=subprocess.STDOUT)
+        if verbose:
+            print out
+    except subprocess.CalledProcessError, e:
+        if verbose:
+            print e.output
+        raise BootstrapError(
+            "%s failed:\n%s (exit code = %d)" %
+            (PSQL, e.output, e.returncode)
+        )
+
+    try:
+        version = int(out)
+    except ValueError, e:
+        raise BootstrapError(
+            "Failed to parse schema version: %s" % (e,)
+        )
+    return version
+
+def installSchema(verbose=False):
+    """
+    Install the calendar server database schema.
+    Return True if database is created, False if database already existed.
+    Raise BootstrapError if there is an issue.
+    """
+
+    cmdArgs = [
+        PSQL,
+        "-U", USERNAME,
+        "-f", SCHEMAFILE,
+    ]
+    try:
+        if verbose:
+            print "Executing: %s" % (" ".join(cmdArgs))
+        out = subprocess.check_output(cmdArgs, stderr=subprocess.STDOUT)
+        if verbose:
+            print out
+        if "already exists" in out:
+            return False
+        return True
+    except subprocess.CalledProcessError, e:
+        if verbose:
+            print e.output
+        raise BootstrapError(
+            "%s failed:\n%s (exit code = %d)" %
+            (PSQL, e.output, e.returncode)
+        )
+
+
+class BootstrapError(Exception):
+    pass
+
+def error(s):
+    sys.stderr.write("%s\n" % (s,))
+    sys.exit(1)
+
+def main():
+    try:
+        (optargs, args) = getopt(
+            sys.argv[1:], "hv", [
+                "help",
+                "verbose",
+            ],
+        )
+    except GetoptError, e:
+        usage(e)
+
+    verbose = False
+
+    for opt, arg in optargs:
+        if opt in ("-h", "--help"):
+            usage()
+        elif opt in ("-v", "--verbose"):
+            verbose = True
+        else:
+            raise NotImplementedError(opt)
+
+
+    # Create the calendar server database user within postgres
+    try:
+        newlyCreated = createUser(verbose=verbose)
+        if newlyCreated:
+            print "Database user '%s' created" % (USERNAME,)
+        else:
+            print "Database User '%s' exists" % (USERNAME,)
+    except BootstrapError, e:
+        error("Failed to create database user '%s': %s" % (USERNAME, e))
+
+    # Create the calendar server database within postgres
+    try:
+        newlyCreated = createDatabase(verbose=verbose)
+        if newlyCreated:
+            print "Database '%s' created" % (DATABASENAME,)
+        else:
+            print "Database '%s' exists" % (DATABASENAME,)
+    except BootstrapError, e:
+        error("Failed to create database '%s': %s" % (DATABASENAME, e))
+
+    # Retrieve the version number of the installed schema
+    try:
+        version = getSchemaVersion(verbose=verbose)
+    except BootstrapError, e:
+        version = 0
+
+    if version == SCHEMAVERSION:
+        print "Latest schema version (%d) is installed" % (version,)
+
+    elif version == 0: # No schema installed
+        installSchema(verbose=verbose)
+        version = getSchemaVersion(verbose=verbose)
+        print "Successfully installed schema version %d" % (version,)
+
+    else: # upgrade needed
+        error(
+            "Schema needs to be upgraded from %d to %d" %
+            (version, SCHEMAVERSION)
+        )
+
+if __name__ == "__main__":
+    main()

Modified: CalendarServer/trunk/contrib/create_caldavd_db.sh
===================================================================
--- CalendarServer/trunk/contrib/create_caldavd_db.sh	2011-02-14 16:30:10 UTC (rev 6919)
+++ CalendarServer/trunk/contrib/create_caldavd_db.sh	2011-02-14 17:18:59 UTC (rev 6920)
@@ -1,12 +1,5 @@
 #!/bin/bash
 
-echo Creating caldav database user
-/usr/bin/createuser --username=_postgres caldav --no-superuser --createdb --no-createrole || exit 1
+/usr/sbin/calendarserver_bootstrap_database
 
-echo Creating caldav database
-/usr/bin/createdb --username=caldav caldav || exit 2
-
-echo Initializing caldav schema
-/usr/bin/psql -U caldav -f /usr/share/caldavd/lib/python/txdav/common/datastore/sql_schema_v1.sql || exit 3
-
 exit 0

Added: CalendarServer/trunk/doc/calendarserver_bootstrap_database.8
===================================================================
--- CalendarServer/trunk/doc/calendarserver_bootstrap_database.8	                        (rev 0)
+++ CalendarServer/trunk/doc/calendarserver_bootstrap_database.8	2011-02-14 17:18:59 UTC (rev 6920)
@@ -0,0 +1,41 @@
+.\"
+.\" Copyright (c) 2011 Apple 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.
+.\"
+.\" The following requests are required for all man pages.
+.Dd February 14, 2011
+.Dt CALENDARSERVER_BOOTSTRAP_DATABASE 8
+.Os
+.Sh NAME
+.Nm calendarserver_bootstrap_database
+.Nd Darwin Calendar Server database bootstrap utility
+.Sh SYNOPSIS
+.Nm
+.Op Fl -verbose
+.Op Fl -help
+.Sh DESCRIPTION
+.Nm
+is a tool which creates the Postgres user Calendar Server will use to connect, creates a database, and installs the schema.
+.Pp
+.Nm
+should be run as root.
+.Sh OPTIONS
+.Bl -tag -width flag
+.It Fl h, -help
+Display usage information
+.It Fl v, -verbose
+Print detailed information about what commands are being executed
+.El
+.Sh SEE ALSO
+.Xr caldavd 8

Modified: CalendarServer/trunk/setup.py
===================================================================
--- CalendarServer/trunk/setup.py	2011-02-14 16:30:10 UTC (rev 6919)
+++ CalendarServer/trunk/setup.py	2011-02-14 17:18:59 UTC (rev 6920)
@@ -125,6 +125,7 @@
                              "bin/calendarserver_purge_principals",
                              "bin/calendarserver_migrate_resources",
                              "bin/calendarserver_monitor_notifications",
+                             "bin/calendarserver_bootstrap_database",
                            ],
         data_files       = [ ("caldavd", ["conf/caldavd.plist"]), ],
         ext_modules      = extensions,

Modified: CalendarServer/trunk/support/Makefile.Apple
===================================================================
--- CalendarServer/trunk/support/Makefile.Apple	2011-02-14 16:30:10 UTC (rev 6919)
+++ CalendarServer/trunk/support/Makefile.Apple	2011-02-14 17:18:59 UTC (rev 6920)
@@ -89,6 +89,7 @@
 	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_command_gateway.8"   "$(DSTROOT)$(MANDIR)/man8"
 	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_purge_events.8"   "$(DSTROOT)$(MANDIR)/man8"
 	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_monitor_notifications.8"   "$(DSTROOT)$(MANDIR)/man8"
+	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_bootstrap_database.8"   "$(DSTROOT)$(MANDIR)/man8"
 	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_purge_attachments.8"   "$(DSTROOT)$(MANDIR)/man8"
 	$(_v) $(INSTALL_FILE) "$(Sources)/doc/calendarserver_purge_principals.8"   "$(DSTROOT)$(MANDIR)/man8"
 	$(_v) gzip -9 -f "$(DSTROOT)$(MANDIR)/man8/"*.[0-9]

Modified: CalendarServer/trunk/txdav/common/datastore/sql_schema_v1.sql
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_schema_v1.sql	2011-02-14 16:30:10 UTC (rev 6919)
+++ CalendarServer/trunk/txdav/common/datastore/sql_schema_v1.sql	2011-02-14 17:18:59 UTC (rev 6920)
@@ -468,3 +468,16 @@
 create index NOTIFICATION_OBJECT_REVISIONS_HOME_RESOURCE_ID
   on NOTIFICATION_OBJECT_REVISIONS(NOTIFICATION_HOME_RESOURCE_ID);
 
+
+--------------------
+-- Schema Version --
+--------------------
+
+create table CALENDARSERVER (
+  NAME                          varchar(255),
+  VALUE                         varchar(255),
+  unique(NAME)
+);
+
+insert into CALENDARSERVER values ('VERSION', '3');
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110214/989299a4/attachment-0001.html>


More information about the calendarserver-changes mailing list