[CalendarServer-changes] [13445] CalendarServer/trunk/txdav/base/datastore/subpostgres.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon May 5 14:26:20 PDT 2014
Revision: 13445
http://trac.calendarserver.org//changeset/13445
Author: wsanchez at apple.com
Date: 2014-05-05 14:26:20 -0700 (Mon, 05 May 2014)
Log Message:
-----------
Use pipes.quote() to quote shell args to postgres -o
Modified Paths:
--------------
CalendarServer/trunk/txdav/base/datastore/subpostgres.py
Modified: CalendarServer/trunk/txdav/base/datastore/subpostgres.py
===================================================================
--- CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2014-05-05 16:30:29 UTC (rev 13444)
+++ CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2014-05-05 21:26:20 UTC (rev 13445)
@@ -23,17 +23,17 @@
import pwd
import re
import signal
-
from hashlib import md5
+from pipes import quote as shell_quote
+import pgdb
+
from twisted.python.procutils import which
from twisted.internet.protocol import ProcessProtocol
from twext.python.log import Logger
from twext.python.filepath import CachingFilePath
-import pgdb
-
from twisted.protocols.basic import LineReceiver
from twisted.internet.defer import Deferred
from txdav.base.datastore.dbapiclient import DBAPIConnector
@@ -87,7 +87,10 @@
def processEnded(self, reason):
- log.warn("postgres process ended with status {status}", status=reason.value.status)
+ log.warn(
+ "postgres process ended with status {status}",
+ status=reason.value.status
+ )
# If pg_ctl exited with zero, we were successful in starting postgres
# If pg_ctl exited with nonzero, we need to give up.
self.lineReceiver.connectionLost(reason)
@@ -164,21 +167,23 @@
class PostgresService(MultiService):
- def __init__(self, dataStoreDirectory, subServiceFactory,
- schema, resetSchema=False, databaseName='subpostgres',
- clusterName="cluster",
- logFile="postgres.log",
- logDirectory="",
- socketDir="",
- listenAddresses=[], sharedBuffers=30,
- maxConnections=20, options=[],
- testMode=False,
- uid=None, gid=None,
- spawnedDBUser="caldav",
- importFileName=None,
- pgCtl="pg_ctl",
- initDB="initdb",
- reactor=None):
+ def __init__(
+ self, dataStoreDirectory, subServiceFactory,
+ schema, resetSchema=False, databaseName="subpostgres",
+ clusterName="cluster",
+ logFile="postgres.log",
+ logDirectory="",
+ socketDir="",
+ listenAddresses=[], sharedBuffers=30,
+ maxConnections=20, options=[],
+ testMode=False,
+ uid=None, gid=None,
+ spawnedDBUser="caldav",
+ importFileName=None,
+ pgCtl="pg_ctl",
+ initDB="initdb",
+ reactor=None,
+ ):
"""
Initialize a L{PostgresService} pointed at a data store directory.
@@ -191,7 +196,8 @@
@param spawnedDBUser: the postgres role
@type spawnedDBUser: C{str}
- @param importFileName: path to SQL file containing previous data to import
+ @param importFileName: path to SQL file containing previous data to
+ import
@type importFileName: C{str}
"""
@@ -220,10 +226,13 @@
# Make logFile absolute in case the working directory of postgres is
# elsewhere:
self.logFile = os.path.abspath(logFile)
- self.logDirectory = os.path.abspath(logDirectory) if logDirectory else ""
+ if logDirectory:
+ self.logDirectory = os.path.abspath(logDirectory)
+ else:
+ self.logDirectory = ""
- # Always use our own configured socket dir in case the built-in postgres tries to use
- # a directory we don't have permissions for
+ # Always use our own configured socket dir in case the built-in
+ # postgres tries to use a directory we don't have permissions for
if not socketDir:
# Socket directory was not specified, so come up with one
# in /tmp and based on a hash of the data store directory
@@ -232,8 +241,14 @@
self.socketDir = CachingFilePath(socketDir)
if listenAddresses:
- self.host, self.port = listenAddresses[0].split(":") if ":" in listenAddresses[0] else (listenAddresses[0], None,)
- self.listenAddresses = [addr.split(":")[0] for addr in listenAddresses]
+ if ":" in listenAddresses[0]:
+ self.host, self.port = listenAddresses[0].split(":")
+ else:
+ self.host, self.port = (listenAddresses[0], None)
+
+ self.listenAddresses = [
+ addr.split(":")[0] for addr in listenAddresses
+ ]
else:
self.host = self.socketDir.path
self.port = None
@@ -302,16 +317,19 @@
databaseName = self.databaseName
if self.spawnedDBUser:
- dsn = "%s:dbname=%s:%s" % (self.host, databaseName, self.spawnedDBUser)
+ dsn = "{}:dbname={}:{}".format(
+ self.host, databaseName, self.spawnedDBUser
+ )
elif self.uid is not None:
- dsn = "%s:dbname=%s:%s" % (self.host, databaseName,
- pwd.getpwuid(self.uid).pw_name)
+ dsn = "{}:dbname={}:{}".format(
+ self.host, databaseName, pwd.getpwuid(self.uid).pw_name
+ )
else:
- dsn = "%s:dbname=%s" % (self.host, databaseName)
+ dsn = "{}:dbname={}".format(self.host, databaseName)
kwargs = {}
if self.port:
- kwargs["host"] = "%s:%s" % (self.host, self.port,)
+ kwargs["host"] = "{}:{}".format(self.host, self.port)
return DBAPIConnector(pgdb, postgresPreflight, dsn, **kwargs)
@@ -333,21 +351,22 @@
if self.resetSchema:
try:
createDatabaseCursor.execute(
- "drop database %s" % (self.databaseName)
+ "drop database {}".format(self.databaseName)
)
except pgdb.DatabaseError:
pass
try:
createDatabaseCursor.execute(
- "create database %s with encoding 'UTF8'" % (self.databaseName)
+ "create database {} with encoding 'UTF8'"
+ .format(self.databaseName)
)
except:
# database already exists
executeSQL = False
else:
- # database does not yet exist; if dump file exists, execute it, otherwise
- # execute schema
+ # database does not yet exist; if dump file exists, execute it,
+ # otherwise execute schema
executeSQL = True
sqlToExecute = self.schema
if self.importFileName:
@@ -367,7 +386,9 @@
if self.shutdownDeferred is None:
# Only continue startup if we've not begun shutdown
- self.subServiceFactory(self.produceConnection, self).setServiceParent(self)
+ self.subServiceFactory(
+ self.produceConnection, self
+ ).setServiceParent(self)
def pauseMonitor(self):
@@ -400,7 +421,7 @@
def createConnection():
createDatabaseConn = self.produceConnection(
- 'schema creation', 'postgres'
+ "schema creation", "postgres"
)
createDatabaseCursor = createDatabaseConn.cursor()
createDatabaseCursor.execute("commit")
@@ -412,25 +433,42 @@
options = []
options.append(
- "-c listen_addresses='%s'" % (",".join(self.listenAddresses))
+ "-c listen_addresses={}"
+ .format(shell_quote(",".join(self.listenAddresses)))
)
if self.socketDir:
- options.append("-k '%s'" % (self.socketDir.path,))
+ options.append(
+ "-k {}"
+ .format(shell_quote(self.socketDir.path))
+ )
if self.port:
- options.append("-c port=%s" % (self.port,))
- options.append("-c shared_buffers=%d" % (self.sharedBuffers,))
- options.append("-c max_connections=%d" % (self.maxConnections,))
+ options.append(
+ "-c port={}".format(shell_quote(self.port))
+ )
+ options.append(
+ "-c shared_buffers={:d}"
+ .format(shell_quote(self.sharedBuffers))
+ )
+ options.append(
+ "-c max_connections={:d}"
+ .format(shell_quote(self.maxConnections))
+ )
options.append("-c standard_conforming_strings=on")
options.append("-c unix_socket_permissions=0770")
options.extend(self.options)
if self.logDirectory: # tell postgres to rotate logs
- options.append("-c log_directory={}".format(self.logDirectory))
+ options.append(
+ "-c log_directory={}".format(shell_quote(self.logDirectory))
+ )
options.append("-c log_truncate_on_rotation=on")
options.append("-c log_filename=postgresql_%w.log")
options.append("-c log_rotation_age=1440")
options.append("-c logging_collector=on")
- log.warn("Requesting postgres start via {cmd} {opts}", cmd=pgCtl, opts=options)
+ log.warn(
+ "Requesting postgres start via {cmd} {opts}",
+ cmd=pgCtl, opts=options
+ )
self.reactor.spawnProcess(
monitor, pgCtl,
[
@@ -456,7 +494,7 @@
removed/renamed/unmounted.
"""
reResult = re.search("PID: (\d+)\D", result)
- if reResult != None:
+ if reResult is not None:
self._postgresPid = int(reResult.group(1))
self.ready(*createConnection())
self.deactivateDelayedShutdown()
@@ -515,20 +553,26 @@
PGHOST=self.host,
PGUSER=self.spawnedDBUser)
initdb = self.initdb()
+
if self.socketDir:
if not self.socketDir.isdir():
self.socketDir.createDirectory()
+
if self.uid and self.gid:
os.chown(self.socketDir.path, self.uid, self.gid)
+
if self.dataStoreDirectory.isdir():
self.startDatabase()
else:
self.dataStoreDirectory.createDirectory()
+
if not self.workingDir.isdir():
self.workingDir.createDirectory()
+
if self.uid and self.gid:
os.chown(self.dataStoreDirectory.path, self.uid, self.gid)
os.chown(self.workingDir.path, self.uid, self.gid)
+
dbInited = Deferred()
self.reactor.spawnProcess(
CapturingProcessProtocol(dbInited, None),
@@ -536,11 +580,16 @@
env=env, path=self.workingDir.path,
uid=self.uid, gid=self.gid,
)
+
def doCreate(result):
if result.find("FATAL:") != -1:
log.error(result)
- raise RuntimeError("Unable to initialize postgres database: %s" % (result,))
+ raise RuntimeError(
+ "Unable to initialize postgres database: {}"
+ .format(result)
+ )
self.startDatabase()
+
dbInited.addCallback(doCreate)
@@ -564,8 +613,9 @@
monitor = _PostgresMonitor()
pgCtl = self.pgCtl()
# FIXME: why is this 'logfile' and not self.logfile?
- self.reactor.spawnProcess(monitor, pgCtl,
- [pgCtl, '-l', 'logfile', 'stop'],
+ self.reactor.spawnProcess(
+ monitor, pgCtl,
+ [pgCtl, "-l", "logfile", "stop"],
env=self.env, path=self.workingDir.path,
uid=self.uid, gid=self.gid,
)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140505/ef0eabc1/attachment-0001.html>
More information about the calendarserver-changes
mailing list