def __init__(self, module):
        '''
        Constructor
        '''
        ActionBundle.__init__(self, module)

        # Initialize application server object
        # appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if Server is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, module.subModule.processIdentifier): die("\n\nThe " + module.subModule.name + " server at '" + module.targetDeploymentPath + "' is up. Installation will not continue\n")

        # Run script
        moduleDeployPath = module.targetDeploymentPath  + "/"  + module.subModule.name
        path2 = moduleDeployPath +  "/"  + module.subModule.installUpdateScript
        ChangePathPermissions(path2, 0744)
        path2=path2 + " CREATE YES "
        ExecuteOSCommand(path2, None)

        # Find version/revision info
        manifestFilePath=moduleDeployPath + "/META-INF/MANIFEST.MF"
        versionInfo = grepFile(module.versionInformationRegex, manifestFilePath)
        buildInfo = grepFile(module.buildInformationRegex, manifestFilePath)
        revisionInfo = grepFile(module.revisionInformationRegex, manifestFilePath)

        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        if buildInfo != None:
            buildInfo = (buildInfo.replace(module.buildInformationRegex, "")).strip()

        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback("emailNotificationSenderAddress", scriptGlobals.scriptVarSectionName, lib.OptParser.options.envprops, scriptGlobals.emailNotificationSenderAddress)
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = "MSM Installation: " + module.name + "@"+ getCurrentHostname() + " (" + module.friendlyServerName + ")"
        emailText = detailedCleanInstallationReportTemplate(module.subModule.name,
                                                    versionInfo,
                                                    lib.OptParser.options.action,
                                                    getCurrentHostname(),
                                                    os.getcwd(),
                                                    guid,
                                                    " ".join(platform.uname()),
                                                    getpass.getuser(),
                                                    buildInfo,
                                                    revisionInfo,
                                                    lib.OptParser.options.envprops,
                                                    scriptGlobals.workingDir)

        # Email all required parties
        SendEmail(emailSender,
                  emailRecipients,
                  emailSubject,
                  emailText,
                  scriptGlobals.smtpHost,
                  scriptGlobals.smtpPort)
    def __init__(self, module):
        '''
        Constructor
        '''
        
        ActionBundle.__init__(self, module)
  
        # Check if JBOSS is running
        if getProcessPIDByPath(module.targetDeploymentPath):die("The JBOSS server at '" + module.targetDeploymentPath + "' is up. Installation will not continue")    
        
        # Generate a unique ActionBundle execution id
        guid = generateGUID()    
        log.info("Unique ActionBundle execution ID generated: " + guid)    

        unzippedPackagePath = module.subModule.unzippedPackagePath

        # Import Clean DB script to Postgres DB
        dbUsername = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_OWNER", module.name, lib.OptParser.options.envprops)
        dbPassword = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_PASSWORD", module.name, lib.OptParser.options.envprops)
        dbHostName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_HOSTNAME", module.name, lib.OptParser.options.envprops)
        dbName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_NAME", module.name, lib.OptParser.options.envprops)
        dbPort = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_PORT", module.name, lib.OptParser.options.envprops)
        tmpC = "jdbc:postgresql://" + dbHostName + ":" + dbPort + "/" + dbName
        
        
        
        # Find version/revision info
        versionInfo = grepFile(module.versionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF")
        revisionInfo = grepFile(module.revisionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF")
        
        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()

        # Determine last executed script in DB
        dbUsername = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_OWNER", module.name, lib.OptParser.options.envprops)
        dbPassword = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_PASSWORD", module.name, lib.OptParser.options.envprops)
        dbHostName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_HOSTNAME", module.name, lib.OptParser.options.envprops)
        dbName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_NAME", module.name, lib.OptParser.options.envprops)
        dbPort = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_PORT", module.name, lib.OptParser.options.envprops)
        tmpC = "jdbc:postgresql://" + dbHostName + ":" + dbPort + "/" + dbName
        result = runPostgresScript("SELECT EXECUTED_SCRIPT FROM FIREWORKS_SCRIPT_LOG WHERE EXECUTED_ON IN (SELECT MAX(EXECUTED_ON) FROM FIREWORKS_SCRIPT_LOG);", dbUsername, dbPassword, tmpC)
        lastExecutedPath, lastExecutedFilename = os.path.split(result.strip());
        log.info("According to log table, the last script executed on '" + tmpC + "' was '" + lastExecutedFilename + "'")
        
        # Run scripts on DB
        ls = os.listdir(unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeDatabaseUpgradeFilePath)
        ls.sort()
        found = False
        for patch in ls:
            if found: 
                #Replace Owner
                exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeDatabaseUpgradeFilePath + scriptGlobals.osDirSeparator + patch
                ConfigureTemplateFile(module.name, lib.OptParser.options.envprops, exactExtractedLocation)
                CheckFileConfigurationIsComplete(exactExtractedLocation)
                #Run Script
                RunPostgresScriptFromFile(unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeDatabaseUpgradeFilePath + scriptGlobals.osDirSeparator + patch, dbUsername, dbPassword, tmpC)
                # Log executed scripts                
                RunPostgresScript("INSERT INTO FIREWORKS_SCRIPT_LOG (INSTALLATION_ID, ACTION, MODULE_NAME, MODULE_VERSION, MODULE_REVISION, EXECUTED_SCRIPT, EXECUTED_ON) VALUES ('" + guid + "', '" + lib.OptParser.options.action + "', '" + module.name + "', '" + versionInfo + "', '" + revisionInfo + "', '" + patch + "', CURRENT_TIMESTAMP);", dbUsername, dbPassword, tmpC)                
            if  lastExecutedFilename.find(patch) > -1: found = True
    def __init__(self, module):
        '''
        Constructor
        '''
        
        ActionBundle.__init__(self, module)
  
        # Check if JBOSS is running
        if getProcessPIDByPath(module.targetDeploymentPath):die("The JBOSS server at '" + module.targetDeploymentPath + "' is up. Installation will not continue")    
        
        # Generate a unique ActionBundle execution id
        guid = generateGUID()    
        log.info("Unique ActionBundle execution ID generated: " + guid)    

        unzippedPackagePath = module.subModule.unzippedPackagePath

        # Import Clean DB script to Postgres DB
        dbUsername = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_OWNER", module.name, lib.OptParser.options.envprops)
        dbPassword = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_PASSWORD", module.name, lib.OptParser.options.envprops)
        dbHostName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_HOSTNAME", module.name, lib.OptParser.options.envprops)
        dbName = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_DB_NAME", module.name, lib.OptParser.options.envprops)
        dbPort = readPropertyFromPropertiesFile("TARGET_POSTGRES_SRV_PORT", module.name, lib.OptParser.options.envprops)
        tmpC = "jdbc:postgresql://" + dbHostName + ":" + dbPort + "/" + dbName
        
        # Run DB init script(s)
        for dbInitScript in module.relativeDatabaseInitFiles:
            # Replace Owner on init scripts             
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + dbInitScript
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops, exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)
            RunPostgresScriptFromFile(unzippedPackagePath + scriptGlobals.osDirSeparator + dbInitScript, dbUsername, dbPassword, tmpC)
            
        # Replace Owner on postgresLogTemplate            
        ConfigureTemplateFile(module.name, lib.OptParser.options.envprops, scriptGlobals.postgresLogTemplateFile)
        # Add LOG table
        RunPostgresScriptFromFile(scriptGlobals.postgresLogTemplateFile, dbUsername, dbPassword, tmpC)
        
        # Find version/revision info
        versionInfo = grepFile(module.versionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF")
        revisionInfo = grepFile(module.revisionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF")
        
        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()

        # Add one row per script executed in LOG table        
        for dbInitScript in module.relativeDatabaseInitFiles:
            lastExecutedPath, lastExecutedFilename = os.path.split(dbInitScript) 
            RunPostgresScript("INSERT INTO FIREWORKS_SCRIPT_LOG (INSTALLATION_ID, ACTION, MODULE_NAME, MODULE_VERSION, MODULE_REVISION, EXECUTED_SCRIPT, EXECUTED_ON) VALUES ('" + guid + "', '" + lib.OptParser.options.action + "', '" + module.name + "', '" + versionInfo + "', '" + revisionInfo + "', '" + lastExecutedFilename + "', CURRENT_TIMESTAMP);", dbUsername, dbPassword, tmpC)        

        # Already existing upgrade scripts must be logged because in the upcoming upgrade we need to run from there on
        log.info("Existing SQL patches will be logged in the log table so that the script will not run them again if you decise to update this version to latest")
        ls = os.listdir(unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeDatabaseUpgradeFilePath)
        ls.sort()
        for patch in ls:               
            RunPostgresScript("INSERT INTO FIREWORKS_SCRIPT_LOG (INSTALLATION_ID, ACTION, MODULE_NAME, MODULE_VERSION, MODULE_REVISION, EXECUTED_SCRIPT, EXECUTED_ON) VALUES ('" + guid + "', '" + lib.OptParser.options.action + "', '" + module.name + "', '" + versionInfo + "', '" + revisionInfo + "', '" + patch + "', CURRENT_TIMESTAMP);", dbUsername, dbPassword, tmpC)                
    def __init__(self, module):
        '''
        Constructor
        '''
        ActionBundle.__init__(self, module)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if standalone is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, module.subModule.processIdentifier): die("\n\nThe " + module.subModule.name + " server at '" + module.targetDeploymentPath + "' is up. Configuration will not continue\n")

        # Check if module is already installed
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if not os.path.isdir(exactLocation):
                die(module.subModule.name + " is Not already installed to:" + module.targetDeploymentPath + ". Maybe you want to make a clean Installation !!")

        # Get Previous Hudson data
        previousManifilePath = module.targetDeploymentPath + scriptGlobals.osDirSeparator + module.subModule.name + scriptGlobals.osDirSeparator + "META-INF" + scriptGlobals.osDirSeparator + "MANIFEST.MF"
        previousVersionInfo = grepFile(module.versionInformationRegex, previousManifilePath)
        previousBuildInfo = grepFile(module.buildInformationRegex, previousManifilePath)
        previousRevisionInfo = grepFile(module.revisionInformationRegex, previousManifilePath)
        previousRevisionInfo = (previousRevisionInfo.replace(module.revisionInformationRegex, "")).strip()
        previousVersionInfo = (previousVersionInfo.replace(module.versionInformationRegex, "")).strip()
        if previousBuildInfo != None:
            previousBuildInfo = (previousBuildInfo.replace(module.buildInformationRegex, "")).strip()

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback("emailNotificationSenderAddress", scriptGlobals.scriptVarSectionName, lib.OptParser.options.envprops, scriptGlobals.emailNotificationSenderAddress)
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = "MSM Installation: " + module.name + "@"+ getCurrentHostname() + " (" + module.friendlyServerName + ")"
        emailText = detailedCleanInstallationReportTemplate(module.subModule.name,
                                                    previousVersionInfo,
                                                    lib.OptParser.options.action,
                                                    getCurrentHostname(),
                                                    os.getcwd(),
                                                    guid,
                                                    " ".join(platform.uname()),
                                                    getpass.getuser(),
                                                    previousBuildInfo,
                                                    previousRevisionInfo,
                                                    lib.OptParser.options.envprops,
                                                    scriptGlobals.workingDir)

        # Email all required parties
        SendEmail(emailSender,
                  emailRecipients,
                  emailSubject,
                  emailText,
                  scriptGlobals.smtpHost,
                  scriptGlobals.smtpPort)

        # end
    def __init__(self, module):
        '''
        Constructor
        '''
        
        ActionBundle.__init__(self, module)
        
        # Generate a unique ActionBundle execution id
        guid = generateGUID()    
        log.info("Unique ActionBundle execution ID generated: " + guid)        
        
        previousVersionBackupPath = module.subModule.previousVersionBackupPath 
        unzippedPackagePath = module.subModule.unzippedPackagePath

        # Backup marketing-admin-webapp.war from deploy/
        # Backup esb.jar from deploy/
        # Backup ROOT.WAR/crossdmain.xml from deploy/ROOT.WAR
        log.info("######################## COPY ALL COPYABLE FILES ########################")        
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v 
            exactBackupLocation = module.subModule.previousVersionBackupPath + scriptGlobals.osDirSeparator + k
            CopyDirOrFile2(exactLocation, exactBackupLocation)        

             
        # Backup marketing-suite-deployment.properties from conf
        # Backup mgage.properties from conf
        # Backup jboss-log4j.xml from conf
        # Backup web.xml from marketing-admin-webapp.war/WEB-INF        
        log.info("######################## COPY ALL COPYABLE FILES ########################")        
        for k, v in module.relativeConfigurationFiles.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v 
            exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
            CopyDirOrFile2(exactLocation, exactBackupLocation)        

      
        log.info("######################## END OF COPY ########################")        
        # Extract old MANIFEST.MF
        ExtractFileFromZipToDir(previousVersionBackupPath + scriptGlobals.osDirSeparator + module.subModule.relativeWarPath, module.relativeVersionInformationPath, previousVersionBackupPath)    

        # Compare current and new versions
        log.info("Version currently installed    : " + grepFile(module.versionInformationRegex, previousVersionBackupPath + scriptGlobals.osDirSeparator + "MANIFEST.MF"))
        log.info("Revision currently installed   : " + grepFile(module.revisionInformationRegex, previousVersionBackupPath + scriptGlobals.osDirSeparator + "MANIFEST.MF"))
        log.info("Version to be installed        : " + grepFile(module.versionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF"))        
        log.info("Revision to be installed       : " + grepFile(module.revisionInformationRegex, unzippedPackagePath + scriptGlobals.osDirSeparator + "MANIFEST.MF"))        
def getVersionInfoFromWar(warPath, relativeVersionInformationPath, versionInformationRegex, revisionInformationRegex, tmpPath):
    if os.path.isfile(warPath):
        #This is a war file
        i = rfind(relativeVersionInformationPath, scriptGlobals.osDirSeparator)
        if i > -1: 
            manifest = relativeVersionInformationPath[i+1:]
        else:
            manifest = relativeVersionInformationPath
        extractFileFromZipToDir(warPath, relativeVersionInformationPath, tmpPath)
        version = grepFile(versionInformationRegex, tmpPath + scriptGlobals.osDirSeparator + manifest)
        revision = grepFile(revisionInformationRegex, tmpPath + scriptGlobals.osDirSeparator + manifest)
    elif os.path.isdir(warPath):
        #This is a exploded war directory
        version = grepFile(versionInformationRegex, warPath + scriptGlobals.osDirSeparator + relativeVersionInformationPath)
        revision = grepFile(revisionInformationRegex, warPath + scriptGlobals.osDirSeparator + relativeVersionInformationPath)
    else:
        return "UNKNOWN", "UNKNOWN"
    version = (re.sub(versionInformationRegex,"",version)).strip() #(version.replace(versionInformationRegex, "")).strip()
    revision = (re.sub(revisionInformationRegex,"",revision)).strip() #(revision.replace(revisionInformationRegex, "")).strip()
    return version, revision    
    def __init__(self, module):
        """
        Constructor
        """
        # Initialize application server object
        appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Check if JBOSS is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, appServer.processIdentifier):
            die("The JBOSS server at '" + module.targetDeploymentPath + "' is up. Installation will not continue")

        # Since CRM is deployed on JBOSS some paths have an %s to allow a configurable
        # profile, so do a little sprintf to fix them
        sprintfOnDictionaryValues(module.relativeConfigurationFiles, module.targetDeploymentProfile)
        sprintfOnDictionaryValues(module.relativeCopyableFilesOrFolders, module.targetDeploymentProfile)

        # Prepare directory to keep backups
        previousVersionBackupPath = createDirectoriesRecursively(
            scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "previousVersionBackup"
        )

        # Backup crm-deployment.properties from conf
        # Backup mgage.properties from conf
        # Backup jboss-log4j.xml from conf
        for k, v in module.relativeConfigurationFiles.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
            copyDirOrFile(exactLocation, exactBackupLocation)  # we do not to have do/undo actions for such operation

        # Backup crm-dtds from docs/dtd
        # Backup crm.war from deploy
        # Backup esb.jar from deploy/
        # Backup ROOT.WAR/crossdmain.xml from deploy/ROOT.WAR
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
            copyDirOrFile(exactLocation, exactBackupLocation)  # we do not to have do/undo actions for such operation

        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(
            scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage"
        )

        # Extract CRM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)

        # Determine last executed script in DB
        dbUsername = readPropertyFromPropertiesFile("VNA_CRM_USERNAMEBASE", module.name, lib.OptParser.options.envprops)
        dbPassword = readPropertyFromPropertiesFile("VNA_CRM_PASSWORDBASE", module.name, lib.OptParser.options.envprops)

        tmpC = readPropertyFromPropertiesFile("DBConnectionString", module.name, lib.OptParser.options.envprops)

        # If string is Clustered string
        if tmpC.lower().find("description") > 0:
            dbConnectionString = tmpC
        else:
            dbHost = tmpC[0 : tmpC.find(":")]
            dbPort = tmpC[tmpC.find(":") + 1 : tmpC.rfind(":")]
            dbSID = tmpC[tmpC.rfind(":") + 1 : len(tmpC)]
            dbConnectionString = (
                "(DESCRIPTION=(LOAD_BALANCE=yes)(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%s))(CONNECT_DATA=(SID=%s)))"
                % (dbHost, dbPort, dbSID)
            )

        finalConnectionString = "%s/%s@%s" % (dbUsername, dbPassword, dbConnectionString)

        result = runOracleScript(
            "SELECT EXECUTED_SCRIPT FROM FIREWORKS_SCRIPT_LOG WHERE EXECUTED_ON IN (SELECT MAX(EXECUTED_ON) FROM FIREWORKS_SCRIPT_LOG);",
            finalConnectionString,
            False,
            True,
        )
        lastExecutedPath, lastExecutedFilename = os.path.split(result.strip())

        currentVersion = grepFile(
            module.versionInformationRegex,
            previousVersionBackupPath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        newVersion = grepFile(
            module.versionInformationRegex,
            unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        currentRevision = grepFile(
            module.revisionInformationRegex,
            previousVersionBackupPath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        newRevision = grepFile(
            module.revisionInformationRegex,
            unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )

        currentVersion = (currentVersion.replace(module.versionInformationRegex, "")).strip()
        newVersion = (newVersion.replace(module.versionInformationRegex, "")).strip()
        currentRevision = (currentRevision.replace(module.revisionInformationRegex, "")).strip()
        newRevision = (newRevision.replace(module.revisionInformationRegex, "")).strip()
        currentDirSize = getDirectoryRecursiveSize(previousVersionBackupPath)
        newDirSize = getDirectoryRecursiveSize(unzippedPackagePath)

        # Information Header
        log.info(informationAsciiHeader())

        labels = ("", "Currently Installed Module", "Module To Be Installed")
        data = """Version, %s, %s
           Revision, %s, %s
           Dir Size, %s, %s           
        """ % (
            currentVersion,
            newVersion,
            currentRevision,
            newRevision,
            currentDirSize,
            newDirSize,
        )

        rows = [row.strip().split(",") for row in data.splitlines()]
        log.info("\n\n" + indent([labels] + rows, hasHeader=True))
        log.info("Last script executed on '" + finalConnectionString + "' was '" + lastExecutedFilename + "'")
def getVersionAndRevisionInfo(versionRegex, revisionRegex, rootPath, versionRelativeInformationPath):
    # Find version/revision info
    versionInfo = grepFile(versionRegex, rootPath + scriptGlobals.osDirSeparator + versionRelativeInformationPath)
    revisionInfo = grepFile(revisionRegex, rootPath + scriptGlobals.osDirSeparator + versionRelativeInformationPath)

    return (versionInfo.replace(versionRegex, "")).strip(), (revisionInfo.replace(revisionRegex, "")).strip()
    def __init__(self, module):
        """
        Constructor
        """
        ActionBundle.__init__(self, module)

        # Initialize application server object
        appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Since MSM is deployed on JBOSS some paths have an %s to allow a configurable
        # profile, so do a little sprintf to fix them
        sprintfOnDictionaryValues(module.relativeConfigurationFiles, module.targetDeploymentProfile)
        sprintfOnDictionaryValues(module.relativeCopyableFilesOrFolders, module.targetDeploymentProfile)

        # For JbosswebappPath = "/server/" + module.targetDeploymentProfile + "/deploy/" + module.subModule.name + ".war"
        # for Tomcat webappPath =  "/webapps/" + module.subModule.name
        webappPath = "/webapps/" + module.subModule.name

        # Check if module exists.
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if exactTargetLocation.find(webappPath) != -1:
                if not os.path.isdir(exactTargetLocation):
                    die(
                        "\n\n"
                        + module.subModule.name
                        + " is not installed under:"
                        + module.targetDeploymentPath
                        + ". Please first run a clean installation"
                    )

        # Get Previous Hudson data
        previousManifilePath = module.targetDeploymentPath + webappPath + "/META-INF/MANIFEST.MF"
        previousVersionInfo = grepFile(module.versionInformationRegex, previousManifilePath)
        previousBuildInfo = grepFile(module.buildInformationRegex, previousManifilePath)
        previousRevisionInfo = grepFile(module.revisionInformationRegex, previousManifilePath)
        previousRevisionInfo = (previousRevisionInfo.replace(module.revisionInformationRegex, "")).strip()
        previousVersionInfo = (previousVersionInfo.replace(module.versionInformationRegex, "")).strip()
        if previousBuildInfo != None:
            previousBuildInfo = (previousBuildInfo.replace(module.buildInformationRegex, "")).strip()

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback(
            "emailNotificationSenderAddress",
            scriptGlobals.scriptVarSectionName,
            lib.OptParser.options.envprops,
            scriptGlobals.emailNotificationSenderAddress,
        )
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = (
            "MSM Installation: "
            + module.subModule.name
            + "@"
            + getCurrentHostname()
            + " ("
            + module.friendlyServerName
            + ")"
        )
        emailText = detailedCleanInstallationReportTemplate(
            module.subModule.name,
            previousVersionInfo,
            lib.OptParser.options.action,
            getCurrentHostname(),
            os.getcwd(),
            guid,
            " ".join(platform.uname()),
            getpass.getuser(),
            previousBuildInfo,
            previousRevisionInfo,
            lib.OptParser.options.envprops,
            scriptGlobals.workingDir,
        )

        # Email all required parties
        SendEmail(emailSender, emailRecipients, emailSubject, emailText, scriptGlobals.smtpHost, scriptGlobals.smtpPort)
    def __init__(self, module):
        """
        Constructor
        """
        ActionBundle.__init__(self, module)

        # Initialize application server object
        appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if Tomcat is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, appServer.processIdentifier):
            die("\n\nThe Jboss server at '" + module.targetDeploymentPath + "' is up. Installation will not continue")

        # Since MSM is deployed on JBOSS some paths have an %s to allow a configurable
        # profile, so do a little sprintf to fix them
        sprintfOnDictionaryValues(module.relativeConfigurationFiles, module.targetDeploymentProfile)
        sprintfOnDictionaryValues(module.relativeCopyableFilesOrFolders, module.targetDeploymentProfile)

        # For JbosswebappPath = "/server/" + module.targetDeploymentProfile + "/deploy/" + module.subModule.name + ".war"
        # for Tomcat webappPath =  "/webapps/" + module.subModule.name
        webappPath = "/webapps/" + module.subModule.name
        # Check if module exists.
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if exactTargetLocation.find(webappPath) != -1:
                if os.path.isdir(exactTargetLocation):
                    log.info(
                        "\n##############################################################\n"
                        + module.subModule.name
                        + " is already installed under:"
                        + module.targetDeploymentPath
                        + ". Please manually backup and remove to run a clean installation (unless you want to update)\n##############################################################"
                    )
                    die()

        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(
            scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage"
        )

        # Extract MSM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)
        CreateDirectory(unzippedPackagePath + "/bin/" + module.subModule.name)
        ExtractZipToDir(
            unzippedPackagePath + "/bin/" + module.subModule.name + ".war",
            unzippedPackagePath + "/bin/" + module.subModule.name,
        )

        # Configure xxx.properties in tmp/../conf using envprops
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops, exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)

        # Copy relativeCopyableFilesOrFolders to specified locations on Server (values)
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Copy tmp/../conf/xxx.properties to to specified locations on Server (values)
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Find version/revision info
        revisionInfo = grepFile(
            module.revisionInformationRegex,
            unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()
        versionInfo = grepFile(
            module.versionInformationRegex,
            unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        buildInfo = grepFile(
            module.buildInformationRegex,
            unzippedPackagePath + scriptGlobals.osDirSeparator + module.relativeVersionInformationPath,
        )
        if buildInfo != None:
            buildInfo = (buildInfo.replace(module.buildInformationRegex, "")).strip()

        # Run CREATE/UPDATE/UPGRADE script
        if module.subModule.installUpdateScript != "":
            path1 = module.targetDeploymentPath + webappPath + "/" + module.subModule.installUpdateScript
            ChangePathPermissions(path1, 0744)
            path1 = path1 + " CREATE YES "
            ExecuteOSCommand(path1, None)

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback(
            "emailNotificationSenderAddress",
            scriptGlobals.scriptVarSectionName,
            lib.OptParser.options.envprops,
            scriptGlobals.emailNotificationSenderAddress,
        )
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = (
            "MSM Installation: "
            + module.subModule.name
            + "@"
            + getCurrentHostname()
            + " ("
            + module.friendlyServerName
            + ")"
        )
        emailText = detailedCleanInstallationReportTemplate(
            module.subModule.name,
            versionInfo,
            lib.OptParser.options.action,
            getCurrentHostname(),
            os.getcwd(),
            guid,
            " ".join(platform.uname()),
            getpass.getuser(),
            buildInfo,
            revisionInfo,
            lib.OptParser.options.envprops,
            scriptGlobals.workingDir,
        )

        # Email all required parties
        SendEmail(emailSender, emailRecipients, emailSubject, emailText, scriptGlobals.smtpHost, scriptGlobals.smtpPort)
    def __init__(self, module):
        """
        Constructor
        """
        ActionBundle.__init__(self, module)

        # Initialize application server object
        appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if Tomcat is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, appServer.processIdentifier):
            die("\n\nThe Jboss server at '" + module.targetDeploymentPath + "' is up. Installation will not continue")

        # Since MSM is deployed on JBOSS some paths have an %s to allow a configurable
        # profile, so do a little sprintf to fix them
        sprintfOnDictionaryValues(module.relativeConfigurationFiles, module.targetDeploymentProfile)
        sprintfOnDictionaryValues(module.relativeCopyableFilesOrFolders, module.targetDeploymentProfile)

        # For JbosswebappPath = "/server/" + module.targetDeploymentProfile + "/deploy/" + module.subModule.name + ".war"
        # for Tomcat webappPath =  "/webapps/" + module.subModule.name
        webappPath = "/webapps/" + module.subModule.name

        # Check if module exists.
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if exactTargetLocation.find(webappPath) != -1:
                if not os.path.isdir(exactTargetLocation):
                    die(
                        "\n\n"
                        + module.subModule.name
                        + " is not installed under:"
                        + module.targetDeploymentPath
                        + ". Please first run a clean installation"
                    )

        # Get Previous Hudson data
        previousManifilePath = module.targetDeploymentPath + webappPath + "/META-INF/MANIFEST.MF"
        previousVersionInfo = grepFile(module.versionInformationRegex, previousManifilePath)
        previousBuildInfo = grepFile(module.buildInformationRegex, previousManifilePath)
        previousRevisionInfo = grepFile(module.revisionInformationRegex, previousManifilePath)
        previousVersionInfo = (previousVersionInfo.replace(module.versionInformationRegex, "")).strip()
        if previousBuildInfo != None:
            previousBuildInfo = (previousBuildInfo.replace(module.buildInformationRegex, "")).strip()

        previousRevisionInfo = (previousRevisionInfo.replace(module.revisionInformationRegex, "")).strip()

        # Prepare directory to keep backups
        previousVersionBackupPath = createDirectoriesRecursively(
            scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "previousVersionBackup"
        )

        # Backup webapps
        if lib.OptParser.action != "install-nodb-nobackup":
            for k, v in module.relativeCopyableFilesOrFolders.items():
                exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
                exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
                CopyDirOrFile3(exactLocation, exactBackupLocation)

        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(
            scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage"
        )

        # Extract MSM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)
        CreateDirectory(unzippedPackagePath + "/bin/" + module.subModule.name)
        ExtractZipToDir(
            unzippedPackagePath + "/bin/" + module.subModule.name + ".war",
            unzippedPackagePath + "/bin/" + module.subModule.name,
        )

        # Configure xxx.properties in tmp/../conf using envprops
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops, exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)

        # Copy tmp/../conf/xxx.properties to to specified locations on Server (values)
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback(
            "emailNotificationSenderAddress",
            scriptGlobals.scriptVarSectionName,
            lib.OptParser.options.envprops,
            scriptGlobals.emailNotificationSenderAddress,
        )
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = (
            "MSM Installation: "
            + module.subModule.name
            + "@"
            + getCurrentHostname()
            + " ("
            + module.friendlyServerName
            + ")"
        )
        emailText = detailedUpdateInstallationReportTemplate(
            module.subModule.name,
            previousVersionInfo,
            lib.OptParser.options.action,
            getCurrentHostname(),
            os.getcwd(),
            guid,
            " ".join(platform.uname()),
            getpass.getuser(),
            previousBuildInfo,
            previousRevisionInfo,
            lib.OptParser.options.envprops,
            previousVersionInfo,
            previousBuildInfo,
            previousRevisionInfo,
            scriptGlobals.workingDir,
        )

        # Email all required parties
        SendEmail(emailSender, emailRecipients, emailSubject, emailText, scriptGlobals.smtpHost, scriptGlobals.smtpPort)
    def __init__(self, module):
        '''
        Constructor
        '''
        ActionBundle.__init__(self, module)

        # Initialize application server object
       # appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if Server is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, module.subModule.processIdentifier): die("\n\nThe " + module.subModule.name + " server at '" + module.targetDeploymentPath + "' is up. Installation will not continue\n")

        # Check if module exists.
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if os.path.isdir(exactTargetLocation):
                log.info("\n###############################################################################################\n" + module.subModule.name
                        + " is already installed under:" + module.targetDeploymentPath
                        + ". Please manually backup and remove to run a clean installation (unless you want to update)\n###############################################################################################")
                die()
					
        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage")

        # Extract MSM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)

        filenameToExtract = "META-INF/MANIFEST.MF"
        zipFilename = unzippedPackagePath +  "/bin/" + module.subModule.name + "/lib/" + module.subModule.name +".jar"
        location = unzippedPackagePath +  "/bin/" + module.subModule.name + "/META-INF"
        ExtractFileFromZipToDir(zipFilename, filenameToExtract, location)

        # Configure xxx.properties in tmp/../conf using envprops
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops,  exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)

        # Copy relativeCopyableFilesOrFolders to specified locations on Server (values)
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Copy tmp/../conf/xxx.properties to to specified locations on Server (values)
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        if (module.subModule.name == "mrouter"):
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + module._locations['relativeStartupScript']
            ChangePathPermissions(exactExtractedLocation, 0777)
            CopyDirOrFile2(exactExtractedLocation, module.targetDeploymentPath)

        # Find version/revision info
        versionInfo = grepFile(module.versionInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        revisionInfo = grepFile(module.revisionInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()
        buildInfo = grepFile(module.buildInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        if buildInfo != None:
            buildInfo = (buildInfo.replace(module.buildInformationRegex, "")).strip()


        moduleDeployPath = module.targetDeploymentPath  + "/"  + module.subModule.name
        path1 = moduleDeployPath +  "/bin"
        ChangePathPermissions(path1, 0744)
        path2 = moduleDeployPath +  "/"  + module.subModule.installUpdateScript
        path2=path2 + " CREATE YES "
        ExecuteOSCommand(path2, None)
  ##ExecuteOSCommandAndCaptureOutput(path1,"ERROR", None, None)
  ##THIS    ExecuteOSCommand(path1, None)
  ##ExecuteOSCommandAndCaptureOutput("cd " + path1, None, None)

        
        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback("emailNotificationSenderAddress", scriptGlobals.scriptVarSectionName, lib.OptParser.options.envprops, scriptGlobals.emailNotificationSenderAddress)        
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = "MSM Installation: " + module.name + "@"+ getCurrentHostname() + " (" + module.friendlyServerName + ")"
        emailText = detailedCleanInstallationReportTemplate(module.subModule.name,
                                                    versionInfo,
                                                    lib.OptParser.options.action,
                                                    getCurrentHostname(),
                                                    os.getcwd(),
                                                    guid,
                                                    " ".join(platform.uname()),
                                                    getpass.getuser(),
                                                    buildInfo,
                                                    revisionInfo,
                                                    lib.OptParser.options.envprops,
                                                    scriptGlobals.workingDir)
          
        # Email all required parties
        SendEmail(emailSender, 
                  emailRecipients,
                  emailSubject, 
                  emailText,
                  scriptGlobals.smtpHost, 
                  scriptGlobals.smtpPort)        
    def __init__(self, module):
        '''
        Constructor
        '''
        ActionBundle.__init__(self, module)

        # Initialize application server object
#        appServer = ApplicationServer(module, scriptGlobals.appsrvProperties)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if standalone is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, module.subModule.processIdentifier): die("\n\nThe " + module.subModule.name + " server at '" + module.targetDeploymentPath + "' is up. Installation will not continue\n")

        exists="true"
        # Check if module is already installed
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if not os.path.isdir(exactLocation):
                exists = "false"
                #die(module.subModule.name + " is Not already installed to:" + module.targetDeploymentPath + ". Maybe you want to make a clean Installation !!")

        previousVersionInfo=""
        previousBuildInfo=""
        previousRevisionInfo=""
        if (exists == "true"):
        # Get Previous Hudson data
            previousManifilePath = module.targetDeploymentPath + scriptGlobals.osDirSeparator + module.subModule.name + scriptGlobals.osDirSeparator + "META-INF" + scriptGlobals.osDirSeparator + "MANIFEST.MF"
            previousVersionInfo = grepFile(module.versionInformationRegex, previousManifilePath)
            previousBuildInfo = grepFile(module.buildInformationRegex, previousManifilePath)
            previousRevisionInfo = grepFile(module.revisionInformationRegex, previousManifilePath)
            previousVersionInfo = (previousVersionInfo.replace(module.versionInformationRegex, "")).strip()
            previousRevisionInfo = (previousRevisionInfo.replace(module.revisionInformationRegex, "")).strip()
            if previousBuildInfo != None:
                previousBuildInfo = (previousBuildInfo.replace(module.buildInformationRegex, "")).strip()

        # Prepare directory to keep backups
        previousVersionBackupPath = createDirectoriesRecursively(scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "previousVersionBackup")


        # Backup standalone
        if (lib.OptParser.action !="install-nodb-nobackup" and exists == "true"):
            for k, v in module.relativeCopyableFilesOrFolders.items():
                exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
                exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
                CopyDirOrFile3(exactLocation, exactBackupLocation)
                if  exactLocation.find(module.subModule.name) != -1 :
                    DeleteDirOrFile(exactLocation)

        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage")

        # Extract MSM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)
 #       CreateDirectory(unzippedPackagePath + "/bin/" + module.subModule.name)
 #       ExtractZipToDir(unzippedPackagePath + "/bin/" + module.subModule.name + ".war", unzippedPackagePath + "/bin/" + module.subModule.name)


        filenameToExtract = "META-INF/MANIFEST.MF"
        zipFilename = unzippedPackagePath +  "/bin/" + module.subModule.name + "/lib/" + module.subModule.name +".jar"
        location = unzippedPackagePath +  "/bin/" + module.subModule.name + "/META-INF"
        ExtractFileFromZipToDir(zipFilename, filenameToExtract, location)


        # Configure xxx.properties in tmp/../conf using envprops
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops,  exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)

        # Copy relativeCopyableFilesOrFolders to specified locations on Server (values)
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Copy tmp/../conf/xxx.properties to to specified locations on Server (values)
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        if (module.subModule.name == "mrouter"):
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + module._locations['relativeStartupScript']
            ChangePathPermissions(exactExtractedLocation, 0777)
            CopyDirOrFile2(exactExtractedLocation, module.targetDeploymentPath)

        path1 = module.targetDeploymentPath  + "/"  + module.subModule.name +  "/bin"
        ChangePathPermissions(path1, 0744)

        # Find version/revision info
        versionInfo = grepFile(module.versionInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        versionInfo = (versionInfo.replace(module.versionInformationRegex, "")).strip()
        revisionInfo = grepFile(module.revisionInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        revisionInfo = (revisionInfo.replace(module.revisionInformationRegex, "")).strip()
        buildInfo = grepFile(module.buildInformationRegex, unzippedPackagePath +  scriptGlobals.osDirSeparator + module.relativeVersionInformationPath)
        if buildInfo != None:
            buildInfo = (buildInfo.replace(module.buildInformationRegex, "")).strip()

        if (lib.OptParser.action == "install-update" or lib.OptParser.action == "_customUpgrade"):
            moduleDeployPath = module.targetDeploymentPath  + "/"  + module.subModule.name
            path1 = moduleDeployPath +  "/bin"
            ChangePathPermissions(path1, 0744)
            path2 = moduleDeployPath +  "/"  + module.subModule.installUpdateScript
            if (lib.OptParser.action == "_customUpgrade"):
                path2=path2 + " UPGRADE YES "
            else:
                path2=path2 + " UPDATE YES "
            ExecuteOSCommand(path2, None)

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback("emailNotificationSenderAddress", scriptGlobals.scriptVarSectionName, lib.OptParser.options.envprops, scriptGlobals.emailNotificationSenderAddress)
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = "MSM Installation: " + module.name + "@"+ getCurrentHostname() + " (" + module.friendlyServerName + ")"
        emailText = detailedUpdateInstallationReportTemplate(module.subModule.name,
                                                    versionInfo,
                                                    lib.OptParser.options.action,
                                                    getCurrentHostname(),
                                                    os.getcwd(),
                                                    guid,
                                                    " ".join(platform.uname()),
                                                    getpass.getuser(),
                                                    buildInfo,
                                                    revisionInfo,
                                                    lib.OptParser.options.envprops,
                                                    previousVersionInfo,
                                                    previousBuildInfo,
                                                    previousRevisionInfo,
                                                    scriptGlobals.workingDir)

        # Email all required parties
        SendEmail(emailSender,
                  emailRecipients,
                  emailSubject,
                  emailText,
                  scriptGlobals.smtpHost,
                  scriptGlobals.smtpPort)
    def __init__(self, module):
        '''
        Constructor
        '''
        ActionBundle.__init__(self, module)

        # Generate a unique ActionBundle execution id
        guid = generateGUID()
        log.info("Unique ActionBundle execution ID generated: " + guid)

        # Check if standalone is running
        if getProcessPIDByPathAndIdentifier(module.targetDeploymentPath, module.subModule.processIdentifier): die("\n\nThe " + module.subModule.name + " server at '" + module.targetDeploymentPath + "' is up. Configuration will not continue\n")

        # Check if module is already installed
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            if not os.path.isdir(exactLocation):
                die(module.subModule.name + " is Not already installed to:" + module.targetDeploymentPath + ". Maybe you want to make a clean Installation !!")

        # Get Previous Hudson data
        previousManifilePath = module.targetDeploymentPath + scriptGlobals.osDirSeparator + module.subModule.name + scriptGlobals.osDirSeparator + "META-INF" + scriptGlobals.osDirSeparator + "MANIFEST.MF"
        previousVersionInfo = grepFile(module.versionInformationRegex, previousManifilePath)
        previousBuildInfo = grepFile(module.buildInformationRegex, previousManifilePath)
        previousRevisionInfo = grepFile(module.revisionInformationRegex, previousManifilePath)
        previousVersionInfo = (previousVersionInfo.replace(module.versionInformationRegex, "")).strip()
        if previousBuildInfo != None:
            previousBuildInfo = (previousBuildInfo.replace(module.buildInformationRegex, "")).strip()

        previousRevisionInfo = (previousRevisionInfo.replace(module.revisionInformationRegex, "")).strip()

        # Prepare directory to keep backups
        previousVersionBackupPath = createDirectoriesRecursively(scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "previousVersionBackup")


        # Backup standalone
        for k, v in module.relativeCopyableFilesOrFolders.items():
            exactLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            exactBackupLocation = previousVersionBackupPath + scriptGlobals.osDirSeparator + k
            CopyDirOrFile3(exactLocation, exactBackupLocation)
        #    if  exactLocation.find(module.subModule.name) != -1 :
        #        DeleteDirOrFile(exactLocation)

        # Prepare directory to unpack package
        unzippedPackagePath = createDirectoriesRecursively(scriptGlobals.workingDir + scriptGlobals.osDirSeparator + "unzippedPackage")

        # Extract MSM package into tmp dir
        ExtractZipToDir(module.moduleFilename, unzippedPackagePath)

        filenameToExtract = "META-INF/MANIFEST.MF"
        zipFilename = unzippedPackagePath +  "/bin/" + module.subModule.name + "/lib/" + module.subModule.name +".jar"
        location = unzippedPackagePath +  "/bin/" + module.subModule.name + "/META-INF"
        ExtractFileFromZipToDir(zipFilename, filenameToExtract, location)


        # Configure xxx.properties in tmp/../conf using envprops
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            ConfigureTemplateFile(module.name, lib.OptParser.options.envprops,  exactExtractedLocation)
            CheckFileConfigurationIsComplete(exactExtractedLocation)

        # Copy tmp/../conf/xxx.properties to to specified locations on Server (values)
        for k, v in module.relativeConfigurationFiles.items():
            exactExtractedLocation = unzippedPackagePath + scriptGlobals.osDirSeparator + k
            exactTargetLocation = module.targetDeploymentPath + scriptGlobals.osDirSeparator + v
            CopyDirOrFile(exactExtractedLocation, exactTargetLocation)

        # Construct the email notification
        emailSender = readPropertyFromPropertiesFileWithFallback("emailNotificationSenderAddress", scriptGlobals.scriptVarSectionName, lib.OptParser.options.envprops, scriptGlobals.emailNotificationSenderAddress)
        emailRecipients = scriptGlobals.globalNotificationEmailList
        emailSubject = "MSM Installation: " + module.name + "@"+ getCurrentHostname() + " (" + module.friendlyServerName + ")"
        emailText = detailedUpdateInstallationReportTemplate(module.subModule.name,
                                                    previousVersionInfo,
                                                    lib.OptParser.options.action,
                                                    getCurrentHostname(),
                                                    os.getcwd(),
                                                    guid,
                                                    " ".join(platform.uname()),
                                                    getpass.getuser(),
                                                    previousBuildInfo,
                                                    previousRevisionInfo,
                                                    lib.OptParser.options.envprops,
                                                    previousVersionInfo,
                                                    previousBuildInfo,
                                                    previousRevisionInfo,
                                                    scriptGlobals.workingDir)

        # Email all required parties
        SendEmail(emailSender,
                  emailRecipients,
                  emailSubject,
                  emailText,
                  scriptGlobals.smtpHost,
                  scriptGlobals.smtpPort)
 def __call__(self): 
     if grepFile("\${", self.filename):
         self.reportText = "File '" + self.filename + "' contains values not contained in '" + lib.OptParser.options.envprops + "'"