[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