#!/usr/bin/python
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re
import StringIO
import xml.etree.ElementTree as ET
import ConfigParser
import os, sys
from os.path import isfile, join, dirname, basename
from time import strftime, localtime
import shutil
import pwd, grp
import commands

globalDict = {}

if (not 'JAVA_HOME' in os.environ):
    print "ERROR: JAVA_HOME environment variable is not defined. Please define JAVA_HOME before running this script"
    sys.exit(1)

debugLevel = 1
generateXML = 0
# logFolderName = '/var/log/ranger'
initdDirName = '/etc/init.d'

rangerBaseDirName = '/etc/ranger'
usersyncBaseDirName = 'usersync'
confBaseDirName = 'conf'
confDistBaseDirName = 'conf.dist'
certBaseDirName = 'cert'
defaultCertFileName = 'unixauthservice.jks'

outputFileName = 'ranger-ugsync-site.xml'
installPropFileName = 'install.properties'
defaultSiteXMLFileName = 'ranger-ugsync-default.xml'
log4jFileName = 'log4j.properties'
install2xmlMapFileName = 'installprop2xml.properties'
templateFileName = 'ranger-ugsync-template.xml'
initdProgramName = 'ranger-usersync'
PROP2ALIASMAP = {'ranger.usersync.ldap.ldapbindpassword': 'ranger.usersync.ldap.bindalias',
                 'ranger.usersync.keystore.password': 'usersync.ssl.key.password',
                 'ranger.usersync.truststore.password': 'usersync.ssl.truststore.password'}

RANGER_USERSYNC_HOME = os.getenv("RANGER_USERSYNC_HOME")
if RANGER_USERSYNC_HOME is None:
    RANGER_USERSYNC_HOME = os.getcwd()

installTemplateDirName = join(RANGER_USERSYNC_HOME, 'templates')
confDistDirName = join(RANGER_USERSYNC_HOME, confDistBaseDirName)
# ugsyncLogFolderName = join(logFolderName, 'usersync')
nativeAuthFolderName = join(RANGER_USERSYNC_HOME, 'native')
localConfFolderName = join(RANGER_USERSYNC_HOME, confBaseDirName)

nativeAuthProgramName = join(nativeAuthFolderName, 'credValidator.uexe')
pamAuthProgramName = join(nativeAuthFolderName, 'pamCredValidator.uexe')

defaultKSPassword = 'UnIx529p'
defaultDNAME = 'cn=unixauthservice,ou=authenticator,o=mycompany,c=US'

unixUserProp = 'unix_user'
unixGroupProp = 'unix_group'

logFolderPermMode = 0770
rootOwnerId = 0
initPrefixList = ['S99', 'K00']

SYNC_SOURCE_KEY = 'SYNC_SOURCE'
SYNC_INTERVAL_NEW_KEY = 'ranger.usersync.sleeptimeinmillisbetweensynccycle'
SYNC_SOURCE_UNIX = 'unix'
SYNC_SOURCE_LDAP = 'ldap'
SYNC_SOURCE_LIST = [SYNC_SOURCE_UNIX, SYNC_SOURCE_LDAP]
SYNC_LDAP_BIND_PASSWORD_KEY = 'ranger.usersync.ldap.ldapbindpassword'
credUpdateClassName = 'org.apache.ranger.credentialapi.buildks'
ENV_LOGDIR_FILE = 'ranger-usersync-env-logdir.sh'

hadoopConfFileName = 'core-site.xml'
ENV_HADOOP_CONF_FILE = "ranger-usersync-env-hadoopconfdir.sh"
ENV_PID_FILE = 'ranger-usersync-env-piddir.sh'
ENV_CONF_FILE = 'ranger-usersync-env-confdir.sh'

def populate_global_dict():
    global globalDict
    read_config_file = open(join(RANGER_USERSYNC_HOME, 'install.properties'))
    for each_line in read_config_file.read().split('\n'):
        each_line = each_line.strip()
        if len(each_line) == 0:
            continue
        elif each_line[0] == "#":
            continue
        if re.search('=', each_line):
            key, value = each_line.split("=", 1)
            key = key.strip()
            if 'PASSWORD' in key:
                jceks_file_path = join(RANGER_USERSYNC_HOME, 'jceks', 'ranger_db.jceks')
                value = ''
            value = value.strip()
            globalDict[key] = value


def initvariable():
    global usersyncBaseDirFullName
    global confFolderName
    global certFolderName
    global defaultKSFileName
    global rangerBaseDirName
    try:
        ranger_base_dir = globalDict['ranger_base_dir']
        if (len(ranger_base_dir.strip()) > 1):
            rangerBaseDirName = ranger_base_dir
    except:
        info = sys.exc_info()
        print info[0], ":", info[1]

    usersyncBaseDirFullName = join(rangerBaseDirName, usersyncBaseDirName)
    confFolderName = join(usersyncBaseDirFullName, confBaseDirName)
    certFolderName = join(confFolderName, certBaseDirName)
    defaultKSFileName = join(certFolderName, defaultCertFileName)


def archiveFile(originalFileName):
    archiveDir = dirname(originalFileName)
    archiveFileName = "." + basename(originalFileName) + "." + (strftime("%d%m%Y%H%M%S", localtime()))
    movedFileName = join(archiveDir, archiveFileName)
    print "INFO: moving [%s] to [%s] ......." % (originalFileName, movedFileName)
    os.rename(originalFileName, movedFileName)


def getXMLConfigKeys(xmlFileName):
    ret = []
    tree = ET.parse(xmlFileName)
    root = tree.getroot()
    for config in root.iter('property'):
        name = config.find('name').text
        ret.append(name)
    return ret


def getXMLConfigMap(xmlFileName):
    ret = {}
    tree = ET.parse(xmlFileName)
    root = tree.getroot()
    for config in root.findall('property'):
        name = config.find('name').text
        val = config.find('value').text
        ret[name] = val
    return ret


def getPropertiesConfigMap(configFileName):
    ret = {}
    config = StringIO.StringIO()
    config.write('[dummysection]\n')
    config.write(open(configFileName).read())
    config.seek(0, os.SEEK_SET)
    fcp = ConfigParser.ConfigParser()
    fcp.optionxform = str
    fcp.readfp(config)
    for k, v in fcp.items('dummysection'):
        ret[k] = v
    return ret


def getPropertiesKeyList(configFileName):
    ret = []
    config = StringIO.StringIO()
    config.write('[dummysection]\n')
    config.write(open(configFileName).read())
    config.seek(0, os.SEEK_SET)
    fcp = ConfigParser.ConfigParser()
    fcp.optionxform = str
    fcp.readfp(config)
    for k, v in fcp.items('dummysection'):
        ret.append(k)
    return ret


def writeXMLUsingProperties(xmlTemplateFileName, prop, xmlOutputFileName):
    tree = ET.parse(xmlTemplateFileName)
    root = tree.getroot()
    prop_arr = ["ranger.usersync.ldap.ldapbindpassword", "ranger.usersync.keystore.password",
                "ranger.usersync.truststore.password", "ranger.usersync.policymgr"]
    for config in root.findall('property'):
        name = config.find('name').text
        if name in prop_arr:
            config.find('value').text = "_"
            continue
        if (name in prop.keys()):
            config.find('value').text = str(prop[name])
        # else:
        #    print "ERROR: key not found: %s" % (name)
    if isfile(xmlOutputFileName):
        archiveFile(xmlOutputFileName)
    tree.write(xmlOutputFileName)


def updatePropertyInJCKSFile(jcksFileName, propName, value):
    fn = jcksFileName
    if (value == ''):
        value = ' '
    cmd = "java -cp './lib/*' %s create '%s' -value '%s' -provider jceks://file%s 2>&1" % (
    credUpdateClassName, propName, value, fn)
    ret = os.system(cmd)
    if (ret != 0):
        print "ERROR: Unable update the JCKSFile(%s) for aliasName (%s)" % (fn, propName)
        sys.exit(1)
    return ret


def password_validation(password, userType):
    if password:
        if re.search("[\\\`'\"]", password):
            print "[E] " + userType + " property contains one of the unsupported special characters like \" ' \ `"
            sys.exit(1)
        else:
            print "[I] " + userType + " property is verified."
    else:
        print "[E] Blank password is not allowed for property " + userType + ",please enter valid password."
        sys.exit(1)


def convertInstallPropsToXML(props):
    directKeyMap = getPropertiesConfigMap(join(installTemplateDirName, install2xmlMapFileName))
    ret = {}
    for k, v in props.iteritems():
        if (k in directKeyMap.keys()):
            newKey = directKeyMap[k]
            ret[newKey] = v
        else:
            print "Direct Key not found:%s" % (k)

    ret['ranger.usersync.sink.impl.class'] = 'org.apache.ranger.unixusersync.process.PolicyMgrUserGroupBuilder'
    if (SYNC_SOURCE_KEY in ret):
        syncSource = ret[SYNC_SOURCE_KEY]
        if (syncSource == SYNC_SOURCE_UNIX):
            ret['ranger.usersync.source.impl.class'] = 'org.apache.ranger.unixusersync.process.UnixUserGroupBuilder'
            if (SYNC_INTERVAL_NEW_KEY not in ret or len(str(ret[SYNC_INTERVAL_NEW_KEY])) == 0):
                ret[SYNC_INTERVAL_NEW_KEY] = "300000"
            else:
                ret[SYNC_INTERVAL_NEW_KEY] = int(ret[SYNC_INTERVAL_NEW_KEY]) * 60000
            # for key in ret.keys():
            #	if (key.startswith("ranger.usersync.ldap") or key.startswith("ranger.usersync.group") or key.startswith("ranger.usersync.paged")):
            #		del ret[key]
        elif (syncSource == SYNC_SOURCE_LDAP):
            ret['ranger.usersync.ldap.deltasync'] = "true"
            ldapPass = ret[SYNC_LDAP_BIND_PASSWORD_KEY]
            password_validation(ldapPass, SYNC_LDAP_BIND_PASSWORD_KEY)
            ret['ranger.usersync.source.impl.class'] = 'org.apache.ranger.ldapusersync.process.LdapUserGroupBuilder'
            if (SYNC_INTERVAL_NEW_KEY not in ret or len(str(ret[SYNC_INTERVAL_NEW_KEY])) == 0):
                ret[SYNC_INTERVAL_NEW_KEY] = "3600000"
            else:
                ret[SYNC_INTERVAL_NEW_KEY] = int(ret[SYNC_INTERVAL_NEW_KEY]) * 60000
        else:
            print "ERROR: Invalid value (%s) defined for %s in install.properties. Only valid values are %s" % (
            syncSource, SYNC_SOURCE_KEY, SYNC_SOURCE_LIST)
            sys.exit(1)
        ret['ranger.usersync.sync.source'] = syncSource
        del ret['SYNC_SOURCE']
    else:
        print "ERROR: No value defined for SYNC_SOURCE in install.properties. valid values are %s" % (
        SYNC_SOURCE_KEY, SYNC_SOURCE_LIST)
        sys.exit(1)

    return ret


def createUser(username, groupname):
    checkuser = "grep ^" + username + ": /etc/passwd | awk -F: '{print $1}'|head -1 "
    (status, output) = commands.getstatusoutput(checkuser)
    if len(output) < 1:
        cmd = "useradd -g %s %s -m" % (groupname, username)
        ret = os.system(cmd)
        if (ret != 0):
            print "ERROR: os command execution (%s) failed. error code = %d " % (cmd, ret)
            sys.exit(1)
    try:
        ret = pwd.getpwnam(username).pw_uid
        return ret
    except KeyError, e:
        print "ERROR: Unable to create a new user account: %s with group %s - error [%s]" % (username, groupname, e)
        sys.exit(1)


def createGroup(groupname):
    checkgroup = "egrep ^" + groupname + ": /etc/group | awk -F: '{print $1}'|head -1 "
    (status, output) = commands.getstatusoutput(checkgroup)
    if len(output) < 1:
        cmd = "groupadd %s" % (groupname)
        ret = os.system(cmd)
        if (ret != 0):
            print "ERROR: os command execution (%s) failed. error code = %d " % (cmd, ret)
            sys.exit(1)
    try:
        ret = grp.getgrnam(groupname).gr_gid
        return ret
    except KeyError, e:
        print "ERROR: Unable to create a new group: %s" % (groupname, e)
        sys.exit(1)


def initializeInitD(ownerName):
    if (os.path.isdir(initdDirName)):
        fn = join(RANGER_USERSYNC_HOME, initdProgramName)
        initdFn = join(initdDirName, initdProgramName)
        shutil.copy(fn, initdFn)
        if (ownerName != 'ranger'):
            f = open(initdFn, 'r')
            filedata = f.read()
            f.close()
            find_str = "LINUX_USER=ranger"
            replace_str = "LINUX_USER=" + ownerName
            newdata = filedata.replace(find_str, replace_str)
            f = open(initdFn, 'w')
            f.write(newdata)
            f.close()
        os.chmod(initdFn, 0550)
        rcDirList = ["/etc/rc2.d", "/etc/rc3.d", "/etc/rc.d/rc2.d", "/etc/rc.d/rc3.d"]
        for rcDir in rcDirList:
            if (os.path.isdir(rcDir)):
                for prefix in initPrefixList:
                    scriptFn = prefix + initdProgramName
                    scriptName = join(rcDir, scriptFn)
                    if isfile(scriptName) or os.path.islink(scriptName):
                        os.remove(scriptName)
                    os.symlink(initdFn, scriptName)
        userSyncScriptName = "ranger-usersync-services.sh"
        localScriptName = os.path.abspath(join(RANGER_USERSYNC_HOME, userSyncScriptName))
        ubinScriptName = join("/usr/bin", initdProgramName)
        if isfile(ubinScriptName) or os.path.islink(ubinScriptName):
            os.remove(ubinScriptName)
        os.symlink(localScriptName, ubinScriptName)


def createJavaKeystoreForSSL(fn, passwd):
    cmd = "keytool -genkeypair -keyalg RSA -alias selfsigned -keystore '%s' -keypass '%s' -storepass '%s' -validity 3600 -keysize 2048 -dname '%s'" % (
    fn, passwd, passwd, defaultDNAME)
    ret = os.system(cmd)
    if (ret != 0):
        print "ERROR: unable to create JavaKeystore for SSL: file (%s)" % (fn)
        sys.exit(1)
    return ret


def write_env_files(exp_var_name, log_path, file_name):
    final_path = "{0}/{1}".format(confBaseDirName, file_name)
    if not os.path.isfile(final_path):
        print "Creating %s file" % file_name
    f = open(final_path, "w")
    f.write("export {0}={1}".format(exp_var_name, log_path))
    f.close()


def main():
    populate_global_dict()
    initvariable()
    logFolderName = globalDict['logdir']
    hadoop_conf = globalDict['hadoop_conf']
    pid_dir_path = globalDict['USERSYNC_PID_DIR_PATH']
    unix_user = globalDict['unix_user']
    rangerUsersync_password = globalDict['rangerUsersync_password']

    if globalDict['SYNC_SOURCE'].lower() == SYNC_SOURCE_LDAP and globalDict.has_key('ROLE_ASSIGNMENT_LIST_DELIMITER') \
     and globalDict.has_key('USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER') and globalDict.has_key('USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER'):
        roleAssignmentDelimiter = globalDict['ROLE_ASSIGNMENT_LIST_DELIMITER']
        userGroupAssignmentDelimiter= globalDict['USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER']
        userNameGroupNameAssignmentListDelimiter= globalDict['USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER'];
        if roleAssignmentDelimiter != "" :
            if roleAssignmentDelimiter == userGroupAssignmentDelimiter or roleAssignmentDelimiter == userNameGroupNameAssignmentListDelimiter :
                print "ERROR: All Delimiters ROLE_ASSIGNMENT_LIST_DELIMITER, USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER and USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER  should be different"
                sys.exit(1)
        if userGroupAssignmentDelimiter != "" :
            if roleAssignmentDelimiter == userGroupAssignmentDelimiter or userGroupAssignmentDelimiter == userNameGroupNameAssignmentListDelimiter:
                print "ERROR: All Delimiters ROLE_ASSIGNMENT_LIST_DELIMITER, USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER and USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER  should be different"
                sys.exit(1)
        if userNameGroupNameAssignmentListDelimiter != "":
            if roleAssignmentDelimiter == userNameGroupNameAssignmentListDelimiter or userGroupAssignmentDelimiter == userNameGroupNameAssignmentListDelimiter:
                print "ERROR: All Delimiters ROLE_ASSIGNMENT_LIST_DELIMITER, USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER and USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER  should be different"
                sys.exit(1)

    if pid_dir_path == "":
        pid_dir_path = "/var/run/ranger"

    if logFolderName.lower() == "$pwd" or logFolderName == "":
        logFolderName = join(os.getcwd(), "logs")
    ugsyncLogFolderName = logFolderName

    dirList = [rangerBaseDirName, usersyncBaseDirFullName, confFolderName, certFolderName]
    for dir in dirList:
        if (not os.path.isdir(dir)):
            os.makedirs(dir, 0750)

    defFileList = [defaultSiteXMLFileName, log4jFileName]
    for defFile in defFileList:
        fn = join(confDistDirName, defFile)
        if (isfile(fn)):
            shutil.copy(fn, join(confFolderName, defFile))

    #
    # Create JAVA_HOME setting in confFolderName
    #
    java_home_setter_fn = join(confFolderName, 'java_home.sh')
    if isfile(java_home_setter_fn):
        archiveFile(java_home_setter_fn)
    jhf = open(java_home_setter_fn, 'w')
    str = "export JAVA_HOME=%s\n" % os.environ['JAVA_HOME']
    jhf.write(str)
    jhf.close()
    os.chmod(java_home_setter_fn, 0750)

    if (not os.path.isdir(localConfFolderName)):
        os.symlink(confFolderName, localConfFolderName)

    defaultProps = getXMLConfigMap(join(confFolderName, defaultSiteXMLFileName))
    installProps = getPropertiesConfigMap(join(RANGER_USERSYNC_HOME, installPropFileName))
    modifiedInstallProps = convertInstallPropsToXML(installProps)

    mergeProps = {}
    mergeProps.update(defaultProps)
    mergeProps.update(modifiedInstallProps)

    localLogFolderName = mergeProps['ranger.usersync.logdir']
    if localLogFolderName.lower() == "$pwd" or localLogFolderName == "":
        localLogFolderName = logFolderName
    if (not os.path.isdir(localLogFolderName)):
        if (localLogFolderName != ugsyncLogFolderName):
            os.symlink(ugsyncLogFolderName, localLogFolderName)

    if (not 'ranger.usersync.keystore.file' in mergeProps):
        mergeProps['ranger.usersync.keystore.file'] = defaultKSFileName

    ksFileName = mergeProps['ranger.usersync.keystore.file']

    if (not isfile(ksFileName)):
        mergeProps['ranger.usersync.keystore.password'] = defaultKSPassword
        createJavaKeystoreForSSL(ksFileName, defaultKSPassword)

    if ('ranger.usersync.keystore.password' not in mergeProps):
        mergeProps['ranger.usersync.keystore.password'] = defaultKSPassword

    fn = join(installTemplateDirName, templateFileName)
    outfn = join(confFolderName, outputFileName)

    if (os.path.isdir(logFolderName)):
        logStat = os.stat(logFolderName)
        logStat.st_uid
        logStat.st_gid
        ownerName = pwd.getpwuid(logStat.st_uid).pw_name
        groupName = pwd.getpwuid(logStat.st_uid).pw_name
    else:
        os.makedirs(logFolderName, logFolderPermMode)

    if (not os.path.isdir(ugsyncLogFolderName)):
        os.makedirs(ugsyncLogFolderName, logFolderPermMode)

    if (not os.path.isdir(pid_dir_path)):
        os.makedirs(pid_dir_path, logFolderPermMode)

    if (unixUserProp in mergeProps):
        ownerName = mergeProps[unixUserProp]
    else:
        mergeProps[unixUserProp] = "ranger"
        ownerName = mergeProps[unixUserProp]

    if (unixGroupProp in mergeProps):
        groupName = mergeProps[unixGroupProp]
    else:
        mergeProps[unixGroupProp] = "ranger"
        groupName = mergeProps[unixGroupProp]

    try:
        groupId = grp.getgrnam(groupName).gr_gid
    except KeyError, e:
        groupId = createGroup(groupName)

    try:
        ownerId = pwd.getpwnam(ownerName).pw_uid
    except KeyError, e:
        ownerId = createUser(ownerName, groupName)

    os.chown(logFolderName, ownerId, groupId)
    os.chown(ugsyncLogFolderName, ownerId, groupId)
    os.chown(rangerBaseDirName, ownerId, groupId)
    os.chown(usersyncBaseDirFullName, ownerId, groupId)

    initializeInitD(ownerName)

    #
    # Add password to crypt path
    #

    cryptPath = mergeProps['ranger.usersync.credstore.filename']

    for keyName, aliasName in PROP2ALIASMAP.iteritems():
        if (keyName in mergeProps):
            keyPassword = mergeProps[keyName]
            updatePropertyInJCKSFile(cryptPath, aliasName, keyPassword)
        else:
            updatePropertyInJCKSFile(cryptPath, aliasName, " ")

    os.chown(cryptPath, ownerId, groupId)

    if ('ranger.usersync.policymgr.keystore' not in mergeProps):
        mergeProps['ranger.usersync.policymgr.keystore'] = cryptPath

    ugsyncCryptPath = mergeProps['ranger.usersync.policymgr.keystore']

    if ('ranger.usersync.policymgr.username' not in mergeProps):
        mergeProps['ranger.usersync.policymgr.username'] = 'rangerusersync'

    if ('ranger.usersync.policymgr.alias' not in mergeProps):
        mergeProps['ranger.usersync.policymgr.alias'] = 'ranger.usersync.policymgr.password'

    if ('ranger.usersync.policymgr.password' not in mergeProps):
        mergeProps['ranger.usersync.policymgr.password'] = 'rangerusersync'

    usersyncKSPath = mergeProps['ranger.usersync.policymgr.keystore']
    pmgrAlias = mergeProps['ranger.usersync.policymgr.alias']
    pmgrPasswd = mergeProps['ranger.usersync.policymgr.password']

    updatePropertyInJCKSFile(usersyncKSPath, pmgrAlias, pmgrPasswd)
    os.chown(ugsyncCryptPath, ownerId, groupId)

    writeXMLUsingProperties(fn, mergeProps, outfn)
    
    hadoop_conf_full_path = join(hadoop_conf, hadoopConfFileName)
    usersync_conf_full_path = join(usersyncBaseDirFullName, confBaseDirName, hadoopConfFileName)
    if not isfile(hadoop_conf_full_path):
        print "WARN: core-site.xml file not found in provided hadoop conf path..."
        f = open(usersync_conf_full_path, "w")
        f.write("<configuration></configuration>")
        f.close()
        os.chown(usersync_conf_full_path, ownerId, groupId)
        os.chmod(usersync_conf_full_path, 0750)
    else:
        if os.path.islink(usersync_conf_full_path):
            os.remove(usersync_conf_full_path)

    fixPermList = [".", usersyncBaseDirFullName, confFolderName, certFolderName]

    for dir in fixPermList:
        for root, dirs, files in os.walk(dir):
            os.chown(root, ownerId, groupId)
            os.chmod(root, 0755)
            for obj in dirs:
                dn = join(root, obj)
                os.chown(dn, ownerId, groupId)
                os.chmod(dn, 0755)
            for obj in files:
                fn = join(root, obj)
                os.chown(fn, ownerId, groupId)
                os.chmod(fn, 0750)

    if isfile(nativeAuthProgramName):
        os.chown(nativeAuthProgramName, rootOwnerId, groupId)
        os.chmod(nativeAuthProgramName, 0750)
    else:
        print "WARNING: Unix Authentication Program (%s) is not available for setting chmod(4550), chown(%s:%s) " % (
        nativeAuthProgramName, "root", groupName)

    if isfile(pamAuthProgramName):
        os.chown(pamAuthProgramName, rootOwnerId, groupId)
        os.chmod(pamAuthProgramName, 0750)
    else:
        print "WARNING: Unix Authentication Program (%s) is not available for setting chmod(4550), chown(%s:%s) " % (
        pamAuthProgramName, "root", groupName)

    write_env_files("logdir", logFolderName, ENV_LOGDIR_FILE);
    write_env_files("RANGER_USERSYNC_HADOOP_CONF_DIR", hadoop_conf, ENV_HADOOP_CONF_FILE);
    write_env_files("USERSYNC_PID_DIR_PATH", pid_dir_path, ENV_PID_FILE);
    write_env_files("USERSYNC_CONF_DIR", confFolderName, ENV_CONF_FILE);
    os.chown(join(confBaseDirName, ENV_LOGDIR_FILE), ownerId, groupId)
    os.chmod(join(confBaseDirName, ENV_LOGDIR_FILE), 0755)
    os.chown(join(confBaseDirName, ENV_HADOOP_CONF_FILE), ownerId, groupId)
    os.chmod(join(confBaseDirName, ENV_HADOOP_CONF_FILE), 0755)
    os.chown(join(confBaseDirName, ENV_PID_FILE), ownerId, groupId)
    os.chmod(join(confBaseDirName, ENV_PID_FILE), 0755)
    os.chown(join(confBaseDirName, ENV_CONF_FILE), ownerId, groupId)
    os.chmod(join(confBaseDirName, ENV_CONF_FILE), 0755)

    f = open(join(confBaseDirName, ENV_PID_FILE), "a+")
    f.write("\nexport {0}={1}".format("UNIX_USERSYNC_USER", unix_user))
    f.close()

    if isfile(hadoop_conf_full_path) and not isfile(usersync_conf_full_path):
        os.symlink(hadoop_conf_full_path, usersync_conf_full_path)

    rangerUsersync_name ='rangerusersync'
    cmd = 'python updatepolicymgrpassword.py %s %s'  %(rangerUsersync_name, rangerUsersync_password)

    if rangerUsersync_password != "" :
        output = os.system(cmd)
        if (output == 0):
          print "[I] Successfully updated password of " + rangerUsersync_name +" user"
        else:
          print "[ERROR] Unable to change password of " + rangerUsersync_name +" user."

main()
