apply-profile.py revision 2d7019e19039fd083850f76e54b6b26a7b06a8f2
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer# -*- coding: utf-8 -*-
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer"""
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer Copyright © 2011 ForgeRock AS. All rights reserved.
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer The contents of this file are subject to the terms
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer of the Common Development and Distribution License
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer (the License). You may not use this file except in
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer compliance with the License.
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer You can obtain a copy of the License at
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer http://forgerock.org/license/CDDLv1.0.html
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer See the License for the specific language governing
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer permission and limitations under the License.
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer When distributing Covered Code, include this CDDL
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer Header Notice in each file and include the License file
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer at http://forgerock.org/license/CDDLv1.0.html
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer If applicable, add the following below the CDDL Header,
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer with the fields enclosed by brackets [] replaced by
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer your own identifying information:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer "Portions Copyrighted [year] [name of copyright owner]"
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer"""
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer"""
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer@author yaromin
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer"""
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzerimport os, json, re, sys, shutil;
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzerscriptDirectory = sys.path[0]
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzerhomeDir = os.path.expanduser('~')
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzerjsonPathSplitter = re.compile(r'/')
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzeropenidmDirectory = scriptDirectory + "/.."
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzerprofileDirectory = sys.argv[1]
4466604d78e5ffd017e69e6861f7d78242b351fbNoam MeltzerdefaultConfigFilePath = profileDirectory + "/profile-config.json"
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzerdef readSubstitutionConfig(configFilePath):
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer configFile = open(configFilePath)
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer fileContent = configFile.read()
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer configFile.close()
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer fileContent = re.sub("\${openidm-dir}",openidmDirectory,fileContent)
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer fileContent = re.sub("\${profile-dir}",profileDirectory,fileContent)
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer fileContent = re.sub("\${home-dir}",homeDir,fileContent)
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer #print fileContent;
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer return json.loads(fileContent)
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzerdef performRegexReplacement(srcFileContent, replacementConfig):
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer for i in replacementConfig[u'substitutions']:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer key = i[u'key']
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer value = i[u'value']
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "replacing text using regex " + key
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer replaceRegex=re.search(key,srcFileContent);
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer if replaceRegex and replaceRegex.groups() > 0:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer srcFileContent = srcFileContent[0:replaceRegex.start(1)] + value + srcFileContent[replaceRegex.end(1):len(srcFileContent)]
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "replaced by regex:" + key
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer else:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "matching string not found for regex:" + key
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer return srcFileContent
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzerdef performPropertiesReplacement(srcFileContent, replacementConfig):
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "properties replacement"
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer for i in replacementConfig[u'substitutions']:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer key = i[u'key']
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer value = i[u'value']
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "replacing property " + key
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer replaceRegex=re.search('\n[^#]*' + key + '=(.*)',srcFileContent);
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer if replaceRegex and replaceRegex.groups() > 0:
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer srcFileContent = srcFileContent[0:replaceRegex.start(1)] + value + srcFileContent[replaceRegex.end(1):len(srcFileContent)]
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer print "replaced property " + key
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer return srcFileContent
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzer
4466604d78e5ffd017e69e6861f7d78242b351fbNoam Meltzerdef performJsonReplacement(srcFileContent, replacementConfig):
jsonContent = json.loads(srcFileContent)
for i in replacementConfig[u'substitutions']:
key = i[u'key']
value = i[u'value']
print "replacing key " + key
splittedPath = jsonPathSplitter.split(key)
print "splittedPath " + ''.join(splittedPath);
splittedPath.remove('')
lastPathElement = splittedPath.pop()
currentContext = jsonContent
for j in splittedPath:
currentContext = currentContext[j]
print "replacing last path element " + lastPathElement
currentContext[lastPathElement]=value
return json.dumps(jsonContent, indent=4)
def performReplacement(replacementConfig):
replacementMethod = replacementConfig[u'replacementMethod']
filePath = replacementConfig[u'filePath']
print "opening file for text replacement " + filePath
srcFile = open(filePath, 'r')
srcFileContent = srcFile.read()
srcFile.close()
if(replacementMethod == 'json'):
result=performJsonReplacement(srcFileContent, replacementConfig)
elif(replacementMethod =='properties'):
result=performPropertiesReplacement(srcFileContent, replacementConfig)
elif(replacementMethod =='regex'):
result=performRegexReplacement(srcFileContent, replacementConfig)
else:
print "replacementMethod not recognized: " + replacementMethod
result=srcFileContent
targetFile = open(filePath, 'w')
targetFile.write(result);
targetFile.close()
def removeFile(removePath):
print "remove file/directory " + removePath
if os.path.exists(removePath):
if os.path.isdir(removePath):
try:
shutil.rmtree(removePath)
except OSError:
os.remove(removePath)
else:
os.remove(removePath)
else:
print "File hasn't been removed. File not found: " + removePath
def performFileRemoval(description):
removePath = description[u'path']
removeFile(removePath)
def performFileCopy(description):
sourcePath = description[u'sourcePath']
targetPath = description[u'targetPath']
print "copy file src:" + sourcePath + " target:" + targetPath
if os.path.exists(targetPath) and os.path.exists(sourcePath):
removeFile(targetPath)
if os.path.isdir(sourcePath):
shutil.copytree(sourcePath, targetPath);
else:
shutil.copyfile(sourcePath, targetPath);
def performFileMove(description):
sourcePath = description[u'sourcePath']
targetPath = description[u'targetPath']
print "move file src:" + sourcePath + " target:" + targetPath
if os.path.exists(targetPath) and os.path.exists(sourcePath):
removeFile(targetPath)
shutil.move(sourcePath,targetPath)
def performCreateSymlink(description):
symlinkPath = description[u'symlinkPath']
targetPath = description[u'targetPath']
os.symlink(targetPath, symlinkPath)
def performSubconfiguration(description):
configurationFilePath = description[u'configurationFilePath']
print "performing subconfiguration using file:" + configurationFilePath
performConfiguration(configurationFilePath)
def performConfiguration(configFilePath = defaultConfigFilePath):
substitutionConfig = readSubstitutionConfig(configFilePath)
#print substitutionConfig
for i in substitutionConfig[u'actions']:
action = i[u'action']
description = i[u'description']
if action == 'substituteInFile':
performReplacement(description)
elif action == 'removeFile':
performFileRemoval(description)
elif action == 'moveFile':
performFileMove(description)
elif action == 'copyFile':
performFileCopy(description)
elif action == 'subConfigure':
performSubconfiguration(description)
elif action == 'symlink':
performCreateSymlink(description)
else:
print "not recognized action:" + action
performConfiguration()