def registerDataStores(sharedDataStoreConfig, forInstallPurposeOnly, username,
                       password, dataDrive):

    successRegister = True

    sharedDBConfig = sharedDataStoreConfig
    sharedFolderConfig = sharedDataStoreConfig

    try:
        opsServer = OpsServerConfig.getOpsServerRootPath(dataDrive)
        environmentData = OpsServerConfig.getEnvDataRootPath(dataDrive)
        clientServerName = OpsServerConfig.publishingDBServer
        clientFolderPath = OpsServerConfig.publishingFolder
        clientFolderDSName = OpsServerConfig.dataFolderDStoreName
        installOnlyClientFolders = OpsServerConfig.installOnlyPublishingFolders
        dbsToRegister = OpsServerConfig.databasesToCreate

        print "\n\t-Register Data Stores with Site...\n"

        # ---------------------------------------------------------------------
        # Register Folders by just using paths
        # ---------------------------------------------------------------------
        if regFolders:

            if forInstallPurposeOnly:
                clientFolderPaths = installOnlyClientFolders
            else:
                clientFolderPaths = {clientFolderDSName: clientFolderPath}

            for registrationName, clientFolderPath in clientFolderPaths.items(
            ):

                # Create folder data store item
                if sharedFolderConfig:
                    sharedStr = "shared"
                    dsPath, dsItem = create_shared_folder_item(
                        registrationName, environmentData, serverName)

                else:
                    sharedStr = "replicated"
                    dsPath, dsItem = create_replicated_folder_item(
                        registrationName, clientFolderPath, environmentData)

# Register the data store item
                print "\t\t-Registering folder " + environmentData + " with site as " + registrationName + " (" + sharedStr + ")..."
                success, response = register(serverName,
                                             serverPort,
                                             username,
                                             password,
                                             dsItem,
                                             useSSL=False)
                if success:
                    print "\t\tDone.\n"
                else:
                    successRegister = False
                    print "ERROR:" + str(response)

        ## ---------------------------------------------------------------------
        ## Register databases
        ## (NOTE: Assumes database password is the same as that used to install
        ## arcgis server)
        ## ---------------------------------------------------------------------
        if regDatabases:

            for db in dbsToRegister:

                isManaged = dbsToRegister[db][0]
                registrationName = dbsToRegister[db][1]

                # Do not register managed database if it is for
                # install purposes only
                if isManaged and forInstallPurposeOnly:
                    continueRegister = False
                else:
                    continueRegister = True

                if continueRegister:

                    success, server_db_conn = create_postgresql_db_connection_str(
                        serverName,
                        serverPort,
                        username,
                        password,
                        serverName,
                        db,
                        'sde',
                        password,
                        useSSL=False,
                        token=None,
                        encrypt_dbpassword=False)
                    if not success:
                        successRegister = False
                        print "ERROR: error encountered while creating server database connection string -"
                        print str(server_db_conn)

                    if forInstallPurposeOnly:
                        registrationName = registrationName + "_InstallOnly"

                    managedStr = ""
                    if isManaged:
                        managedStr = "Managed"
                        dsPath, dsItem = create_managed_entdb_item(
                            registrationName, server_db_conn)

                    else:
                        managedStr = "Non-managed"
                        if sharedDBConfig:
                            managedStr = managedStr + " - shared"
                            dsPath, dsItem = create_shared_entdb_item(
                                registrationName, server_db_conn)

                        else:
                            managedStr = managedStr + " - replicated"

                            success, publisher_db_conn = create_postgresql_db_connection_str(
                                serverName,
                                serverPort,
                                username,
                                password,
                                clientServerName,
                                db,
                                'sde',
                                password,
                                useSSL=False,
                                token=None,
                                encrypt_dbpassword=False)
                            if not success:
                                successRegister = False
                                print "ERROR: error encountered while creating publisher database connection string -"
                                print str(publisher_db_conn)

                            dsPath, dsItem = create_replicated_entdb_item(
                                registrationName, publisher_db_conn,
                                server_db_conn)

                    print "\t\t-Registering " + db + " database with site as " + registrationName + " (" + managedStr + ")..."
                    success, response = register(serverName,
                                                 serverPort,
                                                 username,
                                                 password,
                                                 dsItem,
                                                 useSSL=False)
                    if success:
                        print "\t\tDone.\n"
                    else:
                        successRegister = False
                        print "ERROR:" + str(response)

    except:
        successRegister = False

        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]

        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(
            sys.exc_info()[1])

        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"

    finally:
        # Return success flag
        return successRegister
Esempio n. 2
0
    print "\nThe drive specified for parameter <DataDriveLetter>" + " (" + dataDrive + ") is an invalid drive."
    goodParameters = False

if not doesDriveExist(cacheDrive):
    print "\nThe drive specified for parameter <CacheDriveLetter>" + " (" + cacheDrive + ") is an invalid drive."
    goodParameters = False

# Exit script if parameters are not valid.
if not goodParameters:
    print "\nInvalid script parameters. Exiting " + scriptName + "."
    sys.exit(1)


DestinationDBFolder = OpsServerConfig.getDBConnFileRootPath(dataDrive)
DestinationCacheFolder = OpsServerConfig.getCacheRootPath(cacheDrive)
DestinationFolder = OpsServerConfig.getEnvDataRootPath(dataDrive)

modifyOwnershipList = []
printMsg = True
totalCopySuccess = True
totalRepairMDSuccess = True


def copyDataFolders(srcRootPath, destRootPath, ownerAccount):
    copySuccess = True

    # Check if there is available space on destination drive
    # to copy folders.
    freeSpace = getFreeSpace(destRootPath, "GB")

    # Get total size of source folders
def repairMosaicDatasets(dataDrive):
    
    try:
        
        totalSuccess = True
        
        newPath = OpsServerConfig.getEnvDataRootPath(dataDrive)

        # "Create" RepairMosaicDatasetPaths GP tool Original Path/New Path
        # parameter string
        repairOrigNewPath = ""
        for regName in installOnlyPublishingFolders.keys():
            repairOrigNewPath = repairOrigNewPath + "; " + \
                    installOnlyPublishingFolders[regName] + " " + newPath
        # Remove leading semicolon
        repairOrigNewPath = repairOrigNewPath.replace("; ", "", 1)

        rootSearchPath = newPath
        
        # Get list of all folders ending in ".gdb"
        print
        print "Searching " + rootSearchPath + " looking for file geodatabases..."
        gdbList = findFolderPath(rootSearchPath, "*.gdb", False)
        
        # Ensure that list only contains entries that are local geodatabase
        # (file geodatabase); just in case there happens to be a folder with ".gdb"
        # that is not a geodatabase
        gdbList[:] = [gdb for gdb in gdbList if
                      arcpy.Describe(gdb).workspaceType.upper() == "LOCALDATABASE"]
        
        # Loop through all file geodatabases and repair paths for any non-referenced
        # mosaic datasets
        for gdb in gdbList:
            print
            print "Found file geodatabase: " + gdb
            print "\tChecking for existence of non-referenced mosaic datasets..."
            
            # Get any mosaic datasets in geodatabase
            arcpy.env.workspace = gdb
            mdList = arcpy.ListDatasets("*", "Mosaic")
            
            # Modify list to contain only non-reference mosaic datasets
            mdList[:] = [md for md in mdList if not arcpy.Describe(md).referenced]
            
            if len(mdList) == 0:
                print "\tNone found."
            else:
                print "\tFound " + str(len(mdList)) + " non-referenced mosaic dataset(s)."
            
            for md in mdList:
                print
                print "\tRepairing paths in mosaic dataset '" + md + "'..."
                results = repairMosaicDatasetPaths(md, repairOrigNewPath)
                success = checkResults(results, printMsg)
                if not success:
                    totalSuccess = success
    
    except:
        
        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]
     
        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
     
        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"
        
    finally:
        print
        print
        if totalSuccess:
            print "Done repairing mosaic dataset paths."
        else:
            print "ERROR occurred during mosaic dataset path repair."
        print
        
        return totalSuccess
def registerDataStores(sharedDataStoreConfig, forInstallPurposeOnly, username, password, dataDrive):
    
    successRegister = True
    
    sharedDBConfig = sharedDataStoreConfig
    sharedFolderConfig = sharedDataStoreConfig

    try:
        opsServer = OpsServerConfig.getOpsServerRootPath(dataDrive)
	environmentData = OpsServerConfig.getEnvDataRootPath(dataDrive)
        clientServerName = OpsServerConfig.publishingDBServer
        clientFolderPath = OpsServerConfig.publishingFolder
	clientFolderDSName = OpsServerConfig.dataFolderDStoreName
        installOnlyClientFolders = OpsServerConfig.installOnlyPublishingFolders
        dbsToRegister = OpsServerConfig.databasesToCreate
        
        print "\n\t-Register Data Stores with Site...\n"
        
        # ---------------------------------------------------------------------
        # Register Folders by just using paths
        # ---------------------------------------------------------------------
        if regFolders:
            
            if forInstallPurposeOnly:
                clientFolderPaths = installOnlyClientFolders
            else:
                clientFolderPaths = {clientFolderDSName: clientFolderPath}
            
            for registrationName, clientFolderPath in clientFolderPaths.items():
                
		# Create folder data store item
                if sharedFolderConfig:
                    sharedStr = "shared"
		    dsPath, dsItem = create_shared_folder_item(registrationName, environmentData, serverName)
		    
                else:
                    sharedStr = "replicated"
                    dsPath, dsItem = create_replicated_folder_item(registrationName, clientFolderPath, environmentData)

		# Register the data store item
		print "\t\t-Registering folder " + environmentData + " with site as " + registrationName + " (" + sharedStr + ")..."
		success, response = register(serverName, serverPort, username, password, dsItem, useSSL=False)
		if success:
		    print "\t\tDone.\n"
		else:
		    successRegister = False
		    print "ERROR:" + str(response)

        ## ---------------------------------------------------------------------
        ## Register databases
        ## (NOTE: Assumes database password is the same as that used to install
        ## arcgis server)
        ## ---------------------------------------------------------------------
	if regDatabases:
        
            for db in dbsToRegister:
                
                isManaged = dbsToRegister[db][0]
                registrationName = dbsToRegister[db][1]
                
                # Do not register managed database if it is for
                # install purposes only
                if isManaged and forInstallPurposeOnly:
                    continueRegister = False
                else:
                    continueRegister = True
                
                if continueRegister:
                    
		    success, server_db_conn = create_postgresql_db_connection_str(
                                        serverName, serverPort, username, password,
                                        serverName, db, 'sde', password, useSSL=False, token=None, encrypt_dbpassword=False)
		    if not success:
			successRegister = False
			print "ERROR: error encountered while creating server database connection string -"
			print str(server_db_conn)
		    
                    if forInstallPurposeOnly:
                        registrationName = registrationName + "_InstallOnly"
                    
                    managedStr = ""
                    if isManaged:
                        managedStr = "Managed"
			dsPath, dsItem = create_managed_entdb_item(registrationName, server_db_conn)
			
                    else:
                        managedStr = "Non-managed"
                        if sharedDBConfig:
                            managedStr = managedStr + " - shared"
			    dsPath, dsItem = create_shared_entdb_item(registrationName, server_db_conn)
			    
                        else:
                            managedStr = managedStr + " - replicated"
			    
			    success, publisher_db_conn = create_postgresql_db_connection_str(
                                        serverName, serverPort, username, password,
                                        clientServerName, db, 'sde', password, useSSL=False, token=None, encrypt_dbpassword=False)
			    if not success:
				successRegister = False
				print "ERROR: error encountered while creating publisher database connection string -"
				print str(publisher_db_conn)
			
			    dsPath, dsItem = create_replicated_entdb_item(registrationName, publisher_db_conn, server_db_conn)
			    
                    print "\t\t-Registering " + db + " database with site as " + registrationName + " (" + managedStr + ")..."
		    success, response = register(serverName, serverPort, username, password, dsItem, useSSL=False)
		    if success:
			print "\t\tDone.\n"
		    else:
			successRegister = False
			print "ERROR:" + str(response)
		    

    except:
        successRegister = False
        
        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]
     
        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
        
        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"
        
    finally:
        # Return success flag
        return successRegister
Esempio n. 5
0
                " (" + dataDrive + ") is an invalid drive."
    goodParameters = False

if not doesDriveExist(cacheDrive):
    print "\nThe drive specified for parameter <CacheDriveLetter>" + \
                " (" + cacheDrive + ") is an invalid drive."
    goodParameters = False

# Exit script if parameters are not valid.
if not goodParameters:
    print "\nInvalid script parameters. Exiting " + scriptName + "."
    sys.exit(1)

DestinationDBFolder = OpsServerConfig.getDBConnFileRootPath(dataDrive)
DestinationCacheFolder = OpsServerConfig.getCacheRootPath(cacheDrive)
DestinationFolder = OpsServerConfig.getEnvDataRootPath(dataDrive)

modifyOwnershipList = []
printMsg = True
totalCopySuccess = True
totalRepairMDSuccess = True


def copyDataFolders(srcRootPath, destRootPath, ownerAccount):
    copySuccess = True

    # Check if there is available space on destination drive
    # to copy folders.
    freeSpace = getFreeSpace(destRootPath, "GB")

    # Get total size of source folders
def createDataStores(agsServerAccount, password, dataDrive):
    success = True
    
    try:
	
	opsServer = OpsServerConfig.getOpsServerRootPath(dataDrive)
	environmentData = OpsServerConfig.getEnvDataRootPath(dataDrive)
	dbConnFileRootPath = OpsServerConfig.getDBConnFileRootPath(dataDrive)
	
        print
        print "--Create Local Data Stores..."
	
        # Create local variables to use for both creating enterprise
        # geodatabases and creating connection files.
        dbPlatform = "POSTGRESQL"
        accountAuthentication = "DATABASE_AUTH"
        dbAdmin = "postgres"    #For PostgreSQL this is the postgres superuser
        gdbAdminName = "sde"    #For PostreSQL this must be 'sde'
	
	# 2/26/2013: Modified to dynamically search for keycodes file instead of
	# hardcoding to specific version of the software.
        #pathList = ["Program Files", "ESRI", "License10.1", "sysgen", "keycodes"]
	#authorizationFile = makePath("C", pathList)
	pathList = ["Program Files", "ESRI"]
	authorizationFile = findFilePath(makePath("C", pathList), "keycodes")
        

        # Create list of database names to create connection file.
	dbsToConnect = []
	for db in dbsToCreate:
	    dbsToConnect.append(db)
		
        # ---------------------------------------------------------------------
        # Create local environment data folders
        # ---------------------------------------------------------------------
        
        if createLocalEnvFolders:
            
            print "\n\t-Creating local environment data folders..."
            
            foldersToCreate = []
            foldersToCreate.append(environmentData)
	    foldersToCreate.append(dbConnFileRootPath)
		
            if not os.path.exists(environmentData):
                for folder in foldersToCreate:
                    print "\t\tCreating folder: " + folder
                    os.makedirs(folder)
                print "\t\tDone."
                print
                
		changeOwnership(opsServer, agsServerAccount)

        # ---------------------------------------------------------------------
        # Create local enterprise databases
        # ---------------------------------------------------------------------
        
        if createEnterpriseGDBs:
            
            print "\n\t-Creating local enterprise geodatabases" + \
                    " (this will take a few minutes)...\n"
	    
            for db in dbsToCreate:
                print "\t\tCreating geodatabase '" + db + "'..."
                arcpy.CreateEnterpriseGeodatabase_management(dbPlatform,
                                                            "localhost",
                                                            db,
                                                            accountAuthentication,
                                                            dbAdmin,
                                                            password,
                                                            "",
                                                            gdbAdminName,
                                                            password,
                                                            "",
                                                            authorizationFile)
		print "\t\tDone.\n"

        # ---------------------------------------------------------------------
        # Update PostgreSQL connection file to allow remote connections
        #   to environment databases
        # ---------------------------------------------------------------------
        
        if updatePostgreSQLConnectionFile:
	    connectionFilePath = findFilePath(rootPostgreSQLPath, "pg_hba.conf")
            
            print "\n\t-Updating PostgreSQL connection file to allow remote" + \
                    " connections to databases..."
            print "\t\tFile: " + connectionFilePath 
            	    
	    # Create list of PostgreSQL connection entries
	    postgreSQLConnEntries = []
	    postgreSQLConnEntries.append("host all all 0.0.0.0/0 md5")	#IPv4
	    postgreSQLConnEntries.append("host all all ::/0 md5")  	#IPv6
		
	    # Determine if connection entry already exists in file
	    for postgreSQLConnEntry in postgreSQLConnEntries:
		if findInFile(connectionFilePath, postgreSQLConnEntry):
		    #Entry already exists in file so remove entry from list
		    postgreSQLConnEntries.remove(postgreSQLConnEntry)	    

	    # Add connection entries
	    if len(postgreSQLConnEntries) > 0:
                hbaFile = open(connectionFilePath, 'a')
                for postgreSQLConnEntry in postgreSQLConnEntries:
                    hbaFile.write("{}\n".format(postgreSQLConnEntry))
                hbaFile.close()

                # Reload config file
                print "\n\t-Reloading connection file..."
		exeFile = findFilePath(rootPostgreSQLPath, "pg_ctl.exe")
		confFolder = os.path.dirname(connectionFilePath)
		exeCommand = "”" + exeFile + "” -D “" + confFolder + "” reload"
		os.popen(exeCommand)		
		
            print "\t\tDone."

        # ---------------------------------------------------------------------
        # Create SDE connection files to environment geodatabases
        # ---------------------------------------------------------------------
        
        if createSDEConnectionFiles:
            
            print "\n\t-Creating SDE connection files..."
            
            for db in dbsToCreate:
		outFile = dbsToCreate[db][1] + ".sde"
		
		# Set output folder location
		outFolder = dbConnFileRootPath
		sdeFilePath = os.path.join(outFolder, outFile)
		
		# If SDE connection file already exists, delete it.
		if os.path.exists(sdeFilePath):
		    print "\t\t* Deleting existing file " + sdeFilePath
		    os.remove(sdeFilePath)
		    print "\t\tRe-creating connection file " + sdeFilePath
		else:
		    print "\t\tCreating connection file " + sdeFilePath
		
		arcpy.CreateDatabaseConnection_management(outFolder,
							  outFile,
							  dbPlatform,
							  servername,
							  accountAuthentication,
							  gdbAdminName,
							  password,
							  "SAVE_USERNAME",
							  db.lower(),
							  "#",
							  "TRANSACTIONAL",
							  "sde.DEFAULT",
							  "#")
		    
		print "\t\tDone.\n"
		# Change ownership of sde file
		changeOwnership(sdeFilePath, agsServerAccount)

    except:
        success = False
        
        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]
     
        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
        msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages() + "\n"
        
        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"
        print msgs
        
    finally:
        # Return success flag
        return success
def repairMosaicDatasets(dataDrive):

    try:

        totalSuccess = True

        newPath = OpsServerConfig.getEnvDataRootPath(dataDrive)

        # "Create" RepairMosaicDatasetPaths GP tool Original Path/New Path
        # parameter string
        repairOrigNewPath = ""
        for regName in installOnlyPublishingFolders.keys():
            repairOrigNewPath = repairOrigNewPath + "; " + \
                    installOnlyPublishingFolders[regName] + " " + newPath
        # Remove leading semicolon
        repairOrigNewPath = repairOrigNewPath.replace("; ", "", 1)

        rootSearchPath = newPath

        # Get list of all folders ending in ".gdb"
        print
        print "Searching " + rootSearchPath + " looking for file geodatabases..."
        gdbList = findFolderPath(rootSearchPath, "*.gdb", False)

        # Ensure that list only contains entries that are local geodatabase
        # (file geodatabase); just in case there happens to be a folder with ".gdb"
        # that is not a geodatabase
        gdbList[:] = [
            gdb for gdb in gdbList
            if arcpy.Describe(gdb).workspaceType.upper() == "LOCALDATABASE"
        ]

        # Loop through all file geodatabases and repair paths for any non-referenced
        # mosaic datasets
        for gdb in gdbList:
            print
            print "Found file geodatabase: " + gdb
            print "\tChecking for existence of non-referenced mosaic datasets..."

            # Get any mosaic datasets in geodatabase
            arcpy.env.workspace = gdb
            mdList = arcpy.ListDatasets("*", "Mosaic")

            # Modify list to contain only non-reference mosaic datasets
            mdList[:] = [
                md for md in mdList if not arcpy.Describe(md).referenced
            ]

            if len(mdList) == 0:
                print "\tNone found."
            else:
                print "\tFound " + str(
                    len(mdList)) + " non-referenced mosaic dataset(s)."

            for md in mdList:
                print
                print "\tRepairing paths in mosaic dataset '" + md + "'..."
                results = repairMosaicDatasetPaths(md, repairOrigNewPath)
                success = checkResults(results, printMsg)
                if not success:
                    totalSuccess = success

    except:

        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]

        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(
            sys.exc_info()[1])

        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"

    finally:
        print
        print
        if totalSuccess:
            print "Done repairing mosaic dataset paths."
        else:
            print "ERROR occurred during mosaic dataset path repair."
        print

        return totalSuccess
def createDataStores(agsServerAccount, password, dataDrive):
    success = True

    try:

        opsServer = OpsServerConfig.getOpsServerRootPath(dataDrive)
        environmentData = OpsServerConfig.getEnvDataRootPath(dataDrive)
        dbConnFileRootPath = OpsServerConfig.getDBConnFileRootPath(dataDrive)

        print
        print "--Create Local Data Stores..."

        # Create local variables to use for both creating enterprise
        # geodatabases and creating connection files.
        dbPlatform = "POSTGRESQL"
        accountAuthentication = "DATABASE_AUTH"
        dbAdmin = "postgres"  #For PostgreSQL this is the postgres superuser
        gdbAdminName = "sde"  #For PostreSQL this must be 'sde'

        # 2/26/2013: Modified to dynamically search for keycodes file instead of
        # hardcoding to specific version of the software.
        #pathList = ["Program Files", "ESRI", "License10.1", "sysgen", "keycodes"]
        #authorizationFile = makePath("C", pathList)
        pathList = ["Program Files", "ESRI"]
        authorizationFile = findFilePath(makePath("C", pathList), "keycodes")

        # Create list of database names to create connection file.
        dbsToConnect = []
        for db in dbsToCreate:
            dbsToConnect.append(db)

    # ---------------------------------------------------------------------
    # Create local environment data folders
    # ---------------------------------------------------------------------

        if createLocalEnvFolders:

            print "\n\t-Creating local environment data folders..."

            foldersToCreate = []
            foldersToCreate.append(environmentData)
            foldersToCreate.append(dbConnFileRootPath)

            if not os.path.exists(environmentData):
                for folder in foldersToCreate:
                    print "\t\tCreating folder: " + folder
                    os.makedirs(folder)
                print "\t\tDone."
                print

                changeOwnership(opsServer, agsServerAccount)

    # ---------------------------------------------------------------------
    # Create local enterprise databases
    # ---------------------------------------------------------------------

        if createEnterpriseGDBs:

            print "\n\t-Creating local enterprise geodatabases" + \
                    " (this will take a few minutes)...\n"

            for db in dbsToCreate:
                print "\t\tCreating geodatabase '" + db + "'..."
                arcpy.CreateEnterpriseGeodatabase_management(
                    dbPlatform, "localhost", db, accountAuthentication,
                    dbAdmin, password, "", gdbAdminName, password, "",
                    authorizationFile)
                print "\t\tDone.\n"

    # ---------------------------------------------------------------------
    # Update PostgreSQL connection file to allow remote connections
    #   to environment databases
    # ---------------------------------------------------------------------

        if updatePostgreSQLConnectionFile:
            connectionFilePath = findFilePath(rootPostgreSQLPath,
                                              "pg_hba.conf")

            print "\n\t-Updating PostgreSQL connection file to allow remote" + \
                    " connections to databases..."
            print "\t\tFile: " + connectionFilePath

            # Create list of PostgreSQL connection entries
            postgreSQLConnEntries = []
            postgreSQLConnEntries.append("host all all 0.0.0.0/0 md5")  #IPv4
            postgreSQLConnEntries.append("host all all ::/0 md5")  #IPv6

            # Determine if connection entry already exists in file
            for postgreSQLConnEntry in postgreSQLConnEntries:
                if findInFile(connectionFilePath, postgreSQLConnEntry):
                    #Entry already exists in file so remove entry from list
                    postgreSQLConnEntries.remove(postgreSQLConnEntry)

            # Add connection entries
            if len(postgreSQLConnEntries) > 0:
                hbaFile = open(connectionFilePath, 'a')
                for postgreSQLConnEntry in postgreSQLConnEntries:
                    hbaFile.write("{}\n".format(postgreSQLConnEntry))
                hbaFile.close()

                # Reload config file
                print "\n\t-Reloading connection file..."
                exeFile = findFilePath(rootPostgreSQLPath, "pg_ctl.exe")
                confFolder = os.path.dirname(connectionFilePath)
                exeCommand = "”" + exeFile + "” -D “" + confFolder + "” reload"
                os.popen(exeCommand)

            print "\t\tDone."

    # ---------------------------------------------------------------------
    # Create SDE connection files to environment geodatabases
    # ---------------------------------------------------------------------

        if createSDEConnectionFiles:

            print "\n\t-Creating SDE connection files..."

            for db in dbsToCreate:
                outFile = dbsToCreate[db][1] + ".sde"

                # Set output folder location
                outFolder = dbConnFileRootPath
                sdeFilePath = os.path.join(outFolder, outFile)

                # If SDE connection file already exists, delete it.
                if os.path.exists(sdeFilePath):
                    print "\t\t* Deleting existing file " + sdeFilePath
                    os.remove(sdeFilePath)
                    print "\t\tRe-creating connection file " + sdeFilePath
                else:
                    print "\t\tCreating connection file " + sdeFilePath

                arcpy.CreateDatabaseConnection_management(
                    outFolder, outFile, dbPlatform, servername,
                    accountAuthentication, gdbAdminName, password,
                    "SAVE_USERNAME", db.lower(), "#", "TRANSACTIONAL",
                    "sde.DEFAULT", "#")

                print "\t\tDone.\n"
                # Change ownership of sde file
                changeOwnership(sdeFilePath, agsServerAccount)

    except:
        success = False

        # Get the traceback object
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]

        # Concatenate information together concerning the error into a message string
        pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(
            sys.exc_info()[1])
        msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages() + "\n"

        # Print Python error messages for use in Python / Python Window
        print
        print "***** ERROR ENCOUNTERED *****"
        print pymsg + "\n"
        print msgs

    finally:
        # Return success flag
        return success