#
# Licensed 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. See accompanying LICENSE file.
#
import os
import sys
import errno
import logging
import zipfile
import ConfigParser
import StringIO
import subprocess
import fileinput
#import MySQLdb
import zipfile
import re
import shutil
import commands
from datetime import date
import getpass
import glob
import pprint
from subprocess import  Popen,PIPE

conf_dict={}


"""
################################################
            Helper routines
################################################
"""

def log(msg,type):
    if type == 'info':
        logging.info(" %s",msg)
    if type == 'error':
        logging.error(" %s",msg)
    if type == 'debug':
        logging.debug(" %s",msg)
    if type == 'warning':
        logging.warning(" %s",msg)
    if type == 'exception':
        logging.exception(" %s",msg)

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

def resolve_sym_link(path):
    path = os.path.realpath(path)
    base_dir = os.path.dirname(os.path.dirname(path))
    return path, base_dir

#prog = ["mysql", "-u", "ve", "--execute", 'insert into foo values ("snargle", 2)']

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    """This new implementation should work on all platforms."""
    """pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True, universal_newlines=True)
    "output, err = pipe.communicate()
    "sts = pipe.returncode
    """
    ret = subprocess.call(cmd, shell=True)
    print "------------------"
    print " cmd: " + str(cmd)
    #print " output: " + output
    print " ret: " + str(ret)
    print "------------------"
    return ret, ret
    #if sts is None:
    #    log("sts is None!!!! Manually setting to -1. PLEASE CHECK!!!!!!!!!!!!!!","info")
    #    sts = -1
    #return sts, output


def copy_files(source_dir,dest_dir):
    for dir_path, dir_names, file_names in os.walk(source_dir):
        for file_name in file_names:
            target_dir = dir_path.replace(source_dir, dest_dir, 1)
            if not os.path.exists(target_dir):
                os.mkdir(target_dir)
            src_file = os.path.join(dir_path, file_name)
            dest_file = os.path.join(target_dir, file_name)
            log("copying src: " + src_file + " dest: " + dest_file, "debug")
            shutil.copyfile(src_file, dest_file)



def ModConfig(File, Variable, Setting):
    """
    Modify Config file variable with new setting
    """
    VarFound = False
    AlreadySet = False
    V=str(Variable)
    S=str(Setting)
    # use quotes if setting has spaces #
    if ' ' in S:
        S = '"%s"' % S

    for line in fileinput.input(File, inplace = 1):
        # process lines that look like config settings #
        if not line.lstrip(' ').startswith('#') and '=' in line:
            _infile_var = str(line.split('=')[0].rstrip(' '))
            _infile_set = str(line.split('=')[1].lstrip(' ').rstrip())
            # only change the first matching occurrence #
            if VarFound == False and _infile_var.rstrip(' ') == V:
                VarFound = True
                # don't change it if it is already set #
                if _infile_set.lstrip(' ') == S:
                    AlreadySet = True
                else:
                    line = "%s = %s\n" % (V, S)

        sys.stdout.write(line)


    # Append the variable if it wasn't found #
    if not VarFound:
        log( "Variable '%s' not found.  Adding it to %s" % (V, File), "debug")
        with open(File, "a") as f:
            f.write("%s = %s\n" % (V, S))
    elif AlreadySet == True:
        log( "Variable '%s' unchanged" % (V) , "debug")
    else:
        log( "Variable '%s' modified to '%s'" % (V, S) , "debug")

    return


def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else:
            raise

def get_java_env():
    JAVA_HOME = os.getenv('JAVA_HOME')
    if JAVA_HOME:
        return os.path.join(JAVA_HOME, 'bin', 'java')
    else:
        log('java and jar commands are not available. Please configure JAVA_HOME','exception')
        os.sys.exit(1)

def get_class_path(paths):
    separator = ';' if sys.platform == 'win32' else ':';
    return separator.join(paths)

def get_jdk_options():
    global conf_dict
    return [os.getenv('RANGER_PROPERTIES', ''),"-Dlogdir="+os.getenv("RANGER_LOG_DIR"),
											' -Dcatalina.base=' + conf_dict['EWS_ROOT'] ]


"""
################################################
            Ranger Policy Manager routines
################################################
"""

def get_ranger_classpath():
    global conf_dict
    EWS_ROOT = conf_dict['EWS_ROOT']
    WEBAPP_ROOT = conf_dict['WEBAPP_ROOT']

    cp = [ os.path.join(WEBAPP_ROOT, "WEB-INF", "classes", "conf"), os.path.join(EWS_ROOT,"lib","*"), EWS_ROOT, os.path.join(os.getenv('JAVA_HOME'), 'lib', '*')]
    class_path = get_class_path(cp)
    return class_path

def populate_config_dict_from_env():
    global config_dict
    conf_dict['RANGER_ADMIN_DB_HOST'] = os.getenv("RANGER_ADMIN_DB_HOST")
    conf_dict['RANGER_AUDIT_DB_HOST'] = os.getenv("RANGER_AUDIT_DB_HOST")
    #conf_dict['MYSQL_BIN'] = 'mysql.exe'       #os.getenv("MYSQL_BIN")
    conf_dict['RANGER_DB_FLAVOR'] = os.getenv("RANGER_DB_FLAVOR")
    conf_dict['RANGER_AUDIT_DB_FLAVOR'] = os.getenv("RANGER_DB_FLAVOR")
    conf_dict['RANGER_ADMIN_DB_USERNAME'] = os.getenv("RANGER_ADMIN_DB_USERNAME")
    conf_dict['RANGER_ADMIN_DB_PASSWORD'] = os.getenv("RANGER_ADMIN_DB_PASSWORD")
    conf_dict['RANGER_ADMIN_DB_NAME'] = os.getenv("RANGER_ADMIN_DB_DBNAME")
    conf_dict['RANGER_AUDIT_DB_USERNAME'] = os.getenv("RANGER_AUDIT_DB_USERNAME")
    conf_dict['RANGER_AUDIT_DB_PASSWORD'] = os.getenv("RANGER_AUDIT_DB_PASSWORD")
    conf_dict['RANGER_AUDIT_DB_NAME'] = os.getenv("RANGER_AUDIT_DB_DBNAME")
    conf_dict['db_root_user'] = os.getenv("RANGER_DB_ROOT_USER")
    conf_dict['db_root_password'] = os.getenv("RANGER_ADMIN_DB_ROOT_PASSWORD")
    conf_dict['RANGER_ADMIN_DB_ROOT_PASSWORD'] = os.getenv("RANGER_ADMIN_DB_ROOT_PASSWORD")
    conf_dict['RANGER_AUDIT_DB_ROOT_PASSWORD'] = os.getenv("RANGER_AUDIT_DB_ROOT_PASSWORD")
    conf_dict['RANGER_ADMIN_HOME'] = os.getenv("RANGER_ADMIN_HOME")
    conf_dict['RANGER_AUTHENTICATION_METHOD'] = os.getenv("RANGER_AUTHENTICATION_METHOD")
    # LDAP Settings
    conf_dict['RANGER_LDAP_URL'] = os.getenv("RANGER_LDAP_URL")
    conf_dict['RANGER_LDAP_USERDNPATTERN'] = os.getenv("RANGER_LDAP_USERDNPATTERN")
    conf_dict['RANGER_LDAP_GROUPSEARCHBASE'] = os.getenv("RANGER_LDAP_GROUPSEARCHBASE")
    conf_dict['RANGER_LDAP_GROUPSEARCHFILTER'] = os.getenv("RANGER_LDAP_GROUPSEARCHFILTER")
    conf_dict['RANGER_ldap_GROUPROLEATTRIBUTE'] = os.getenv("RANGER_ldap_GROUPROLEATTRIBUTE")

    # AD Settings
    conf_dict['RANGER_LDAP_AD_DOMAIN'] = os.getenv("RANGER_LDAP_AD_DOMAIN")
    conf_dict['RANGER_LDAP_AD_URL'] = os.getenv("RANGER_LDAP_AD_URL")

def populate_config_dict_from_file():
    global config_dict
    RANGER_ADMIN_HOME = os.getenv("RANGER_ADMIN_HOME")
    read_config_file = open(os.path.join(RANGER_ADMIN_HOME,'bin','install_config.properties'))
    library_path = os.path.join(RANGER_ADMIN_HOME,"cred","lib","*")
    for each_line in read_config_file.read().split('\n') :
        if len(each_line) == 0 : continue
        # print 'each_line = ' + each_line
        key , value = each_line.strip().split("=",1)
        key = key.strip()
        if 'PASSWORD' in key:
            jceks_file_path = os.path.join(os.getenv('RANGER_HOME'), 'jceks','ranger_db.jceks')
            statuscode,value = call_keystore(library_path,key,'',jceks_file_path,'get')
            if statuscode == 1:
                value = ''
        value = value.strip()
        conf_dict[key] = value
    #if os.getenv("MYSQL_BIN") is not None:
    #    conf_dict['MYSQL_BIN'] = os.getenv("MYSQL_BIN")
    #else:
    #    os.sys.exit('Please set MYSQL_BIN variable in environment settings.')


def init_variables(switch):
    global conf_dict

    if switch == 'service' :
        populate_config_dict_from_env()
    else:
        populate_config_dict_from_file()
    #INSTALL_DIR = os.path.join(conf_dict['RANGER_ADMIN_HOME'] , "app")
    INSTALL_DIR = conf_dict['RANGER_ADMIN_HOME']
    EWS_ROOT    = os.path.join(INSTALL_DIR , "ews")
    WEBAPP_ROOT = os.path.join(INSTALL_DIR , "ews" , "webapp")

    #if switch == "service":
    #    war_file_path = os.path.join(conf_dict['RANGER_ADMIN_HOME'] , "war", "security-admin-web-*.war")
    #    war_file_list = glob.glob(war_file_path)
    #    conf_dict['war_file']   = war_file_list[0]

    conf_dict['EWS_ROOT']   = EWS_ROOT
    conf_dict['WEBAPP_ROOT']= WEBAPP_ROOT
    conf_dict['INSTALL_DIR']= INSTALL_DIR
    conf_dict['JAVA_BIN']= os.path.join(os.getenv("JAVA_HOME"),'bin','java.exe')
    conf_dict['DB_FLAVOR'] = os.getenv("RANGER_DB_FLAVOR")
    conf_dict['RANGER_DB_FLAVOR'] = os.getenv("RANGER_DB_FLAVOR")
    conf_dict['RANGER_AUDIT_DB_FLAVOR'] = os.getenv("RANGER_DB_FLAVOR")	
    dir = os.path.join(os.getenv("RANGER_HOME"),"connector-jar")
    ews_dir = os.path.join(os.getenv("RANGER_ADMIN_HOME"),"ews","webapp","WEB-INF","lib")
    log(ews_dir,"info")
    if not os.path.exists(dir):
        os.makedirs(dir)
    layout_dir = os.path.dirname(os.getenv("HDP_LAYOUT"))
    files = os.listdir(layout_dir)
    if files:
        for filename in files:
            #log (filename,"info")
            if os.getenv("RANGER_DB_FLAVOR") == "MYSQL" or os.getenv("RANGER_AUDIT_DB_FLAVOR") == "MYSQL":
                f = re.match("^mysql-connector-java.*?.jar",filename)
            elif os.getenv("RANGER_DB_FLAVOR") == "ORACLE" or os.getenv("RANGER_AUDIT_DB_FLAVOR") == "ORACLE":    
                f = re.match("^ojdbc.*?.jar",filename)
            elif os.getenv("RANGER_DB_FLAVOR") == "POSTGRES" or os.getenv("RANGER_AUDIT_DB_FLAVOR") == "POSTGRES":    
                f = re.match("^postgresql-connector-jdbc.*?.jar",filename)    
            elif os.getenv("RANGER_DB_FLAVOR") == "MSSQL" or os.getenv("RANGER_AUDIT_DB_FLAVOR") == "MSSQL":
                f = re.match("^sqljdbc.*?.jar",filename)    
            if f:
                src = os.path.join(layout_dir,filename)
                shutil.copy2(src, dir)
                shutil.copy2(src, ews_dir)
                conf_dict['SQL_CONNECTOR_JAR'] = os.path.join(dir,filename)
				
                    				
    conf_dict['db_host']=os.getenv("RANGER_ADMIN_DB_HOST") + ":" + os.getenv("RANGER_ADMIN_DB_PORT")
    conf_dict['db_name']=os.getenv("RANGER_ADMIN_DB_DBNAME")
    conf_dict['db_user']=os.getenv("RANGER_ADMIN_DB_USERNAME")
    conf_dict['db_password']=os.getenv("RANGER_ADMIN_DB_PASSWORD")
    conf_dict['audit_db_name']=os.getenv("RANGER_AUDIT_DB_DBNAME")
    conf_dict['audit_db_user']=os.getenv("RANGER_AUDIT_DB_USERNAME")
    conf_dict['audit_db_password']=os.getenv("RANGER_AUDIT_DB_PASSWORD")
    conf_dict['RANGER_ADMIN_DB_PORT']=os.getenv("RANGER_ADMIN_DB_PORT")
    conf_dict['RANGER_AUDIT_DB_PORT']=os.getenv("RANGER_AUDIT_DB_PORT")
    db_dir = os.path.join(conf_dict['RANGER_ADMIN_HOME'] , "db")
    conf_dict['mysql_core_file']=os.path.join(db_dir,'mysql','xa_core_db.sql')
    conf_dict['mysql_audit_file']=os.path.join(db_dir,'mysql','xa_audit_db.sql')
    conf_dict['oracle_core_file']=os.path.join(db_dir,'oracle','xa_core_db_oracle.sql')
    conf_dict['oracle_audit_file']=os.path.join(db_dir,'oracle','xa_audit_db_oracle.sql')
    conf_dict['postgres_core_file']=os.path.join(db_dir,'postgres','xa_core_db_postgres.sql')
    conf_dict['postgres_audit_file']=os.path.join(db_dir,'postgres','xa_audit_db_postgres.sql')
    conf_dict['sqlserver_core_file']=os.path.join(db_dir,'sqlserver','xa_core_db_sqlserver.sql')
    conf_dict['sqlserver_audit_file']=os.path.join(db_dir,'sqlserver','xa_audit_db_sqlserver.sql')
    conf_dict['sqlanywhere_core_file']= os.path.join(db_dir,'sqlanywhere','xa_core_db_sqlanywhere.sql')
    conf_dict['sqlanywhere_audit_file']= os.path.join(db_dir, 'sqlanywhere','xa_audit_db_sqlanywhere.sql')
    #conf_dict['db_core_file']           = os.path.join(db_dir, "xa_core_db.sql")
    #conf_dict['db_create_user_file']    = os.path.join(db_dir, "create_dev_user.sql")
    #conf_dict['db_audit_file']          = os.path.join(db_dir, "xa_audit_db.sql")
    #conf_dict['db_asset_file']          = os.path.join(db_dir, "reset_asset.sql")

    #log("config is : " , "debug")
    #for x in conf_dict:
    #    log(x + " : " + conf_dict[x], "debug")

#TODO fix the base_dir part
def setup_install_files():
    global conf_dict

    EWS_ROOT = conf_dict['EWS_ROOT']
    INSTALL_DIR = conf_dict['INSTALL_DIR']
    WEBAPP_ROOT = conf_dict['WEBAPP_ROOT']

    EWS_LIB_DIR = os.path.join(EWS_ROOT,"lib")
    #EWS_LOG_DIR = os.path.join(EWS_ROOT,"logs")
    RANGER_ADMIN_HOME = os.getenv("RANGER_ADMIN_HOME")

    log("Setting up installation files and directory", "debug")

    if not os.path.isdir(INSTALL_DIR):
        log("creating Install dir : " + INSTALL_DIR, "debug")
        os.makedirs(INSTALL_DIR)

    if not os.path.isdir(EWS_ROOT):
        log("creating EWS dir : " + EWS_ROOT, "debug")
        os.makedirs(EWS_ROOT)

    if not os.path.isdir(WEBAPP_ROOT):
        log("creating WEBAPP dir : " + WEBAPP_ROOT, "debug")
        os.makedirs(WEBAPP_ROOT)

    if not os.path.isdir(os.path.join(WEBAPP_ROOT,"WEB-INF","classes","conf")):
        log("creating conf dir : " + WEBAPP_ROOT, "debug")
        os.makedirs(os.path.join(WEBAPP_ROOT,"WEB-INF","classes","conf"))

    if not os.path.isdir(EWS_LIB_DIR):
        log("creating EWS_LIB_DIR dir : " + EWS_LIB_DIR, "debug")
        os.makedirs(EWS_LIB_DIR)

    #if not os.path.isdir(EWS_LOG_DIR):
    #    log("creating EWS_LOG_DIR dir : " + EWS_LOG_DIR, "debug")
    #    os.makedirs(EWS_LOG_DIR)

    #log("copying libraries ", "debug")
    #copy_files(os.path.join(RANGER_ADMIN_HOME,"ews","lib"), EWS_LIB_DIR)

    #log("copying xapolicymgr.properties file", "debug")
    #shutil.copyfile(os.path.join(RANGER_ADMIN_HOME,"ews","xapolicymgr.properties"), os.path.join(EWS_ROOT,"xapolicymgr.properties"))

    log("copying conf.dist/ to conf/", "debug")
    copy_files(os.path.join(WEBAPP_ROOT,"WEB-INF","classes","conf.dist"), os.path.join(WEBAPP_ROOT,"WEB-INF","classes","conf"))
    log(" Setting up installation files and directory DONE", "info");
pass


def write_config_to_file():
    global conf_dict
    RANGER_ADMIN_HOME = os.getenv("RANGER_ADMIN_HOME")
    library_path = os.path.join(RANGER_ADMIN_HOME, 'cred', 'lib','*')
    jceks_file_path = os.path.join(os.getenv("RANGER_HOME"), "jceks")
    if not os.path.isdir(jceks_file_path):
        mkdir_p(jceks_file_path)
    jceks_file_path = os.path.join(jceks_file_path,'ranger_db.jceks')

    file_path = os.path.dirname(os.path.realpath(__file__))
    write_conf_to_file = os.path.join(file_path, "install_config.properties")
    open(write_conf_to_file,'wb')
    for key,value in conf_dict.items():
        if 'PASSWORD' in key :
            #call_keystore(library_path,key,value,jceks_file_path,'create')
            value=''
        ModConfig(write_conf_to_file , key,value)


def init_logfiles():
    FORMAT = '%(asctime)-15s %(message)s'
    logging.basicConfig(format=FORMAT, level=logging.DEBUG)


def sanity_check_configure_files():
    global conf_dict

    log("Checking MYSQL executable and db files!!", 'debug')
    db_core_file = conf_dict['db_core_file']
    db_create_user_file = conf_dict['db_create_user_file']
    db_audit_file = conf_dict['db_audit_file']
    db_asset_file = conf_dict['db_asset_file']

    #if os.path.isfile(MYSQL_BIN):
    #    log("MYSQL Client bin : " + MYSQL_BIN + " file found", 'info')
    #else:
    #    os.sys.exit('MYSQL_BIN: ' + MYSQL_BIN + ' file does not exist')

    if os.path.isfile(db_core_file):
        log("DB core file " + db_core_file + " file found", 'info')
    else:
        log('db_core_file: ' + db_core_file + ' file does not exist','exception')
        os.sys.exit(1)

    if os.path.isfile(db_create_user_file):
        log("DB create user file " + db_create_user_file + " file found", 'info')
    else:
        log('db_create_user_file: ' + db_create_user_file + ' file does not exist','exception')
        os.sys.exit(1)

    if os.path.isfile(db_audit_file):
        log("DB audit file " + db_audit_file + " file found", 'info')
    else:
        log('db_audit_file: ' + db_audit_file + ' file does not exist','exception')
        os.sys.exit(1)

    if os.path.isfile(db_asset_file):
        log("DB asset file " + db_asset_file + " file found", 'info')
    else:
        log('db_asset_file: ' + db_asset_file + ' file does not exist','exception')
        os.sys.exit(1)

def get_mysql_cmd(user, password, host):
    global conf_dict
    MYSQL_BIN = conf_dict["MYSQL_BIN"]

    cmdArr = [ MYSQL_BIN ,'-B' ,'--user=%s' %user, '--password=%s' %password, '--host=%s' %host , '--skip-column-names']
    return cmdArr

def create_mysql_user(db_name, db_user, db_password, db_host, db_root_password):
    global conf_dict
    cmdArr = []

    MYSQL_BIN = conf_dict["MYSQL_BIN"]
    hosts_arr =["%", "localhost"]
    #check_mysql_password()
    ### From properties file
    log("\nCreating MySQL user "+db_user+" (using root priviledges)\n", 'debug')
    for host in hosts_arr:
		cmdArr = get_mysql_cmd('root', db_root_password, db_host)
		#subprocess.call(["mysql", "-u", username, "-p%s" % password, "-e", "SELECT @@hostname"]

		cmdArr.extend(["-e", "select count(*) from mysql.user where user='%s' and host='%s'" %(db_user, host)])
		output = subprocess.check_output(cmdArr)
		if output.strip("\n\r") is "1":
			log( "\nMYSQL User already exists!\n", "debug")
		else:
			cmdArr = get_mysql_cmd('root', db_root_password, db_host)
			if db_password == "":
				#cmdStr = '"' + MYSQL_BIN + '"' + ' -B -u root --password='+db_root_password+' -h '+db_host+' -e \'create user "'+db_user+'"@"'+db_host+'";\''
				cmdArr.extend(["-e", "create user %s@%s" %(db_user, host)])
			else:
				cmdArr.extend(["-e", "create user '%s'@'%s' identified by '%s' " %(db_user, host, db_password)])
				#cmdStr = '"' + MYSQL_BIN + '"' + ' -B -u root --password='+db_root_password+' -h '+db_host+' -e \'create user "'+db_user+'"@"'+db_host+'" identified by "'+db_password+'";\''
				ret = subprocess.check_call(cmdArr)
			if ret == 0:
				#mysqlquery="GRANT ALL ON "+db_name+".* TO \'"+db_user+"'@'"+db_host+"' ;\
				#grant all privileges on "+db_name+".* to '"+db_user+"'@'"+db_host+"' with grant option;\
				#FLUSH PRIVILEGES;"
				cmdArr = get_mysql_cmd('root', db_root_password, db_host)
				cmdArr.extend(["-e", "GRANT ALL ON *.* TO '%s'@'%s'; grant all privileges on *.* to '%s'@'%s' with grant option; FLUSH PRIVILEGES" %(db_user,host,db_user,host)])
				ret = subprocess.check_call(cmdArr)
				if ret == 0:
					log("\nCreating MySQL user '" + db_user + "' (using root priviledges for % hosts ) DONE\n", "info")
				else:
					log("\nCreating MySQL user '" + db_user + "' (using root priviledges) FAILED\n", "info")
					sys.exit(1)

def check_mysql_password ():
    global conf_dict
    db_root_password = conf_dict["RANGER_ADMIN_DB_ROOT_PASSWORD"]
    MYSQL_HOST = conf_dict['MYSQL_HOST']
    MYSQL_BIN = conf_dict['MYSQL_BIN']

    log("Checking MYSQL root password : **** ","debug")

    cmdStr = "\""+MYSQL_BIN+"\""+" -u root --password="+db_root_password+" -h "+MYSQL_HOST+" -s -e \"select version();\""
    status, output = getstatusoutput(cmdStr)
    print "Status: " + str(status)
    print "output: " + str(output)

    if status == 0:
        log("Checking MYSQL root password DONE", "info")
    else:
        log("COMMAND: mysql -u root --password=..... -h " + MYSQL_HOST + " : FAILED with error message:\n*********************************\n" + output + "\n*********************************\n", "exception")
        sys.exit(1)


#def check_mysql_user_password():
#    global conf_dict
#    db_user = conf_dict["RANGER_ADMIN_DB_USERNAME"]
#    db_password = conf_dict["RANGER_ADMIN_DB_PASSWORD"]
#    db_root_password = conf_dict["RANGER_ADMIN_DB_ROOT_PASSWORD"]
#    MYSQL_HOST = conf_dict['MYSQL_HOST']
#
#    db = MySQLdb.connect(host=MYSQL_HOST, user=db_user, passwd=db_password)
#    if db:
#        log("Checking MYSQL "+ db_user +" password DONE", "info")
#    else:
#        log("COMMAND: mysql -u " + db_user + " --password=..... -h " + MYSQL_HOST + " : FAILED with error message:\n*********************************\n" + {msg} + "\n*********************************\n", "exception")
#
#def check_mysql_audit_user_password():
#    global conf_dict
#    audit_db = conf_dict["RANGER_AUDIT_DB_NAME"]
#    audit_db_user = conf_dict["RANGER_AUDIT_DB_USERNAME"]
#    audit_db_password = conf_dict["RANGER_AUDIT_DB_PASSWORD"]
#    MYSQL_HOST = conf_dict['MYSQL_HOST']
#
#    try:
#        db = MySQLdb.connect(host=MYSQL_HOST, user=audit_db_user, passwd=audit_db_password, db=audit_db)
#    except MySQLdb.Error, e:
#     exceptnMsg =  "Error %d: %s" % (e.args[0], e.args[1])
#     log("COMMAND: mysql -u " + audit_db_user + " --password=..... -h " + MYSQL_HOST + " : FAILED with error message:\n*********************************\n" + exceptnMsg + "\n*********************************\n", "exception")
#     sys.exit (1)
#    if db:
#        log("Checking Ranger Audit Table owner password DONE", "info")

#def exec_sql_file(cursor, sql_file):
#    log( "[INFO] Executing SQL script file: " + sql_file, "debug")
#    statement = ""
#    for line in open(sql_file):
#        if re.match(r'--', line):  # ignore sql comment lines
#            continue
#        if not re.search(r'[^-;]+;', line):  # keep appending lines that don't end in ';'
#            statement = statement + line
#        else:  # when you get a line ending in ';' then exec statement and reset for next statement
#            statement = statement + line
#            #print "\n\n[DEBUG] Executing SQL statement:\n%s" % (statement)
#            try:
#                cursor.execute(statement)
#                print cursor
#            except MySQLdb.Error, e:
#                log( "[WARN] MySQLError during execute statement \n\tArgs: " + str(e.args), "debug")
#            statement = ""

def upgrade_db():
    global config_dict

    db_user = conf_dict["RANGER_ADMIN_DB_USERNAME"]
    db_password = conf_dict["RANGER_ADMIN_DB_PASSWORD"]
    db_root_password = conf_dict["RANGER_ADMIN_DB_ROOT_PASSWORD"]
    db_name = conf_dict["RANGER_ADMIN_DB_NAME"]
    MYSQL_BIN = conf_dict['MYSQL_BIN']
    MYSQL_HOST = conf_dict['RANGER_ADMIN_DB_HOST']

    log("\nCreating Baseline DB upgrade ... \n", "debug")
    DBVERSION_CATALOG_CREATION = os.path.join(conf_dict['RANGER_DB_DIR'], 'create_dbversion_catalog.sql')
    PATCHES_PATH = os.path.join(conf_dict['RANGER_DB_DIR'], 'patches')
    if os.path.isfile(DBVERSION_CATALOG_CREATION):
        #import sql file
        proc = subprocess.Popen([MYSQL_BIN, "--user=%s" % db_user, "--host=%s" %MYSQL_HOST, "--password=%s" % db_password, db_name],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE)
        out, err = proc.communicate(file(DBVERSION_CATALOG_CREATION).read())
        log("\nBaseline DB upgraded successfully\n", "info")

    #first get all patches and then apply each patch
    files = os.listdir(PATCHES_PATH)
    # files: coming from os.listdir() sorted alphabetically, thus not numerically
    sorted_files = sorted(files, key=lambda x: str(x.split('.')[0]))
    for filename in sorted_files:
        currentPatch = PATCHES_PATH + "/"+filename
        if os.path.isfile(currentPatch):
            #apply_patches(cursor,currentPatch)
            proc = subprocess.Popen([MYSQL_BIN, "--user=%s" % db_user, "--host=%s" %MYSQL_HOST, "--password=%s" % db_password, db_name],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE)
            out, err = proc.communicate(file(currentPatch).read())
            log( "\nPatch applied: " +  currentPatch +"\n", "debug")


def verify_db (db_user, db_password, db_name, db_host):
    global conf_dict
    MYSQL_BIN = conf_dict['MYSQL_BIN']

    log("\nVerifying Database: " + db_name+"\n","debug")

    cmdArr = get_mysql_cmd(db_user, db_password, db_host)
    cmdArr.extend(["-e", "show databases like '%s'" %(db_name)])
    output = subprocess.check_output(cmdArr)
    if output.strip('\r\n') == db_name:
        return True
    else:
        return False

def import_db ():

    global conf_dict

    db_user = conf_dict["RANGER_ADMIN_DB_USERNAME"]
    db_password = conf_dict["RANGER_ADMIN_DB_PASSWORD"]
    db_root_password = conf_dict["RANGER_ADMIN_DB_ROOT_PASSWORD"]
    db_name = conf_dict['RANGER_ADMIN_DB_NAME']
    MYSQL_HOST = conf_dict['RANGER_ADMIN_DB_HOST']

    db_core_file =  conf_dict['db_core_file']
    db_asset_file = conf_dict['db_asset_file']
    MYSQL_BIN = conf_dict['MYSQL_BIN']
    log ("\nImporting to Database: " + db_name,"debug");

    if verify_db(db_user, db_password, db_name, MYSQL_HOST):
        log("\nDatabase "+db_name + " already exists. Ignoring import_db\n","info")
    else:
        log("\nDatabase does not exist. Creating databse : \n" + db_name,"info")

        cmdArr = get_mysql_cmd('root', db_root_password, MYSQL_HOST)
        cmdArr.extend(["-e", "create database %s" %(db_name)])
        ret = subprocess.check_call(cmdArr)
        if ret != 0:
            log("\nDatabase creation failed!!\n","exception")
            sys.exit(1)

        ##execute each line from sql file to import DB
        if os.path.isfile(db_core_file):
            log("Importing database : " + db_name + " from file: " + db_core_file,"info")
            proc = subprocess.Popen([MYSQL_BIN, "--user=%s" % db_user, "--host=%s" %MYSQL_HOST, "--password=%s" % db_password, db_name],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE)
            out, err = proc.communicate(file(db_core_file).read())
            if (proc.returncode == 0):
                log("\nAdmin db file Imported successfully\n","info")
            else:
                log("\nAdmin db file Import failed!\n","info")
                sys.exit(1)
        else:
            log("\nImport sql file not found\n","exception")
            sys.exit(1)

        if os.path.isfile(db_asset_file):
            proc = subprocess.Popen([MYSQL_BIN, "--user=%s" % db_user, "--host=%s" %MYSQL_HOST, "--password=%s" % db_password, db_name],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE)
            out, err = proc.communicate(file(db_asset_file).read())
            if (proc.returncode == 0):
                log("\nAsset file Imported successfully\n","info")
            else:
                log("\nAsset file Import filed!\n","info")
                sys.exit(1)
        else:
            log("\nImport asset sql file not found\n","exception")
            sys.exit(1)

#def extract_war():
#    global conf_dict
#    war_file = conf_dict['war_file']
#    WEBAPP_ROOT = conf_dict['WEBAPP_ROOT']
#
#    if os.path.isfile(war_file):
#        log("Extract War file " + war_file + " to " + WEBAPP_ROOT,"info")
#    else:
#        log(war_file + " file not found!","exception")
#
#    if os.path.isdir(WEBAPP_ROOT):
#        with zipfile.ZipFile(war_file, "r") as z:
#            z.extractall(WEBAPP_ROOT)
#        log("Extract War file " + war_file + " to " + WEBAPP_ROOT + " DONE! ","info")
#        if os.path.isfile ( os.path.join(WEBAPP_ROOT, "WEB-INF", "log4j.xml.prod")) :
#            shutil.copyfile(os.path.join(WEBAPP_ROOT, "WEB-INF", "log4j.xml.prod"), os.path.join(WEBAPP_ROOT, "WEB-INF", "log4j.xml"))

# def copy_mysql_connector():
#     log("Copying MYSQL Connector to "+app_home+"/WEB-INF/lib ","info")
#     shutil.copyfile(MYSQL_CONNECTOR_JAR, app_home+"/WEB-INF/lib/"+MYSQL_CONNECTOR_JAR)
#     if os.path.isfile(app_home+"/WEB-INF/lib/"+MYSQL_CONNECTOR_JAR):
#         log("Copying MYSQL Connector to app_home/WEB-INF/lib DONE","info");
#     else:
#          log("Copying MYSQL Connector to "+app_home+"/WEB-INF/lib failed","exception")


#Update Properties to File
#1 -> propertyName 2 -> newPropertyValue 3 -> fileName
def updatePropertyToFile(propertyName, newPropertyValue, fileName):
    replaceStr = propertyName +"="+ newPropertyValue
    log("replaceStr: " + replaceStr, "debug")
    successMsg = "property : " + propertyName + " not found!"
    for line in fileinput.input(fileName, inplace = 1): # Does a list of files, and writes redirects STDOUT to the file in question
      if line.replace(propertyName, replaceStr):
        successMsg = "File " + fileName + " Updated successfully : "+ propertyName
    log(successMsg, "info")
pass

def update_xapolicymgr_properties():
    global conf_dict
    WEBAPP_ROOT = conf_dict['WEBAPP_ROOT']
    xapolicymgr_properties = os.path.join(WEBAPP_ROOT, "WEB-INF", "classes", "conf", "ranger_webserver.properties")
    log("xapolicymgr_properties: " + xapolicymgr_properties, "debug")
    ModConfig(xapolicymgr_properties,"xa.webapp.dir", WEBAPP_ROOT.replace('\\','/' ))

def updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file):
    ret = subprocess.call(['python', '%s\update_property.py' %os.getenv("RANGER_ADMIN_HOME"), propertyName ,newPropertyValue ,to_file])
    if ret == 0:
        log("Updated property for :"+to_file,"info")
    else:
        log("Update property failed for :"+to_file,"info")
        sys.exit(1)
	
def update_properties():
    global conf_dict
    sys_conf_dict={}

    RANGER_DB_FLAVOR = conf_dict["RANGER_DB_FLAVOR"]
    RANGER_AUDIT_DB_FLAVOR = conf_dict["RANGER_DB_FLAVOR"]
    MYSQL_HOST = conf_dict["RANGER_ADMIN_DB_HOST"]
    WEBAPP_ROOT = conf_dict["WEBAPP_ROOT"]
    db_user = conf_dict["RANGER_ADMIN_DB_USERNAME"]
    db_password = conf_dict["RANGER_ADMIN_DB_PASSWORD"]
    db_name = conf_dict["RANGER_ADMIN_DB_NAME"]
    RANGER_ADMIN_DB_PORT = conf_dict["RANGER_ADMIN_DB_PORT"]
    RANGER_AUDIT_DB_PORT = conf_dict["RANGER_AUDIT_DB_PORT"]

    audit_db_user = conf_dict["RANGER_AUDIT_DB_USERNAME"]
    audit_db_password = conf_dict["RANGER_AUDIT_DB_PASSWORD"]
    audit_db_name = conf_dict["RANGER_AUDIT_DB_NAME"]

    to_file_ranger = os.path.join(WEBAPP_ROOT, "WEB-INF", "classes", "conf", "ranger-admin-site.xml")
    newPropertyValue=''
    to_file_default = os.path.join(WEBAPP_ROOT, "WEB-INF", "classes", "conf", "ranger-admin-default-site.xml")
    if os.path.isfile(to_file_ranger):
        log("to_file_ranger: " + to_file_ranger + " file found", "info")
    else:
        log("to_file_ranger: " + to_file_ranger + " does not exists", "warning")
    if os.path.isfile(to_file_default):
        log("to_file_default: " + to_file_default + " file found", "info")
    else:
        log("to_file_default: " + to_file_default + " does not exists", "warning")	

    log("SQL_HOST is : " + MYSQL_HOST,"debug")
    if RANGER_DB_FLAVOR == "MYSQL":
        propertyName="ranger.jpa.jdbc.url"
        newPropertyValue="jdbc:log4jdbc:mysql://%s:%s/%s" %(MYSQL_HOST ,RANGER_ADMIN_DB_PORT, db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.user"
        newPropertyValue=db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.user"
        newPropertyValue=audit_db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.url"
        newPropertyValue="jdbc:log4jdbc:mysql://%s:%s/%s" %(MYSQL_HOST, RANGER_AUDIT_DB_PORT, audit_db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.MySQLPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.audit.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.MySQLPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.jdbc.driver"
        newPropertyValue="net.sf.log4jdbc.DriverSpy"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.driver"
        newPropertyValue="net.sf.log4jdbc.DriverSpy"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

    elif RANGER_DB_FLAVOR == "ORACLE":
        propertyName="ranger.jpa.jdbc.url"
        #if MYSQL_HOST.count(":") == 2:
        if MYSQL_HOST.count(":") == 2 or MYSQL_HOST.count(":") == 0:
            #jdbc:oracle:thin:@[HOST][:PORT]:SID or #jdbc:oracle:thin:@GL
            cstring="jdbc:oracle:thin:@%s" %(MYSQL_HOST)
        else:
            #jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
            cstring="jdbc:oracle:thin:@//%s" %(MYSQL_HOST)

        newPropertyValue=cstring
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.user"
        newPropertyValue=db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.user"
        newPropertyValue=audit_db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.url"
        newPropertyValue=cstring
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.OraclePlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.audit.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.OraclePlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.jdbc.driver"
        newPropertyValue="oracle.jdbc.OracleDriver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.driver"
        newPropertyValue="oracle.jdbc.OracleDriver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

    elif RANGER_DB_FLAVOR == "POSTGRES":
        propertyName="ranger.jpa.jdbc.url"
        newPropertyValue="jdbc:postgresql://%s:%s/%s" %(MYSQL_HOST, RANGER_ADMIN_DB_PORT, db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
		
        propertyName="ranger.jpa.jdbc.user"
        newPropertyValue=db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.user"
        newPropertyValue=audit_db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
		
        propertyName="ranger.jpa.audit.jdbc.url"
        newPropertyValue="jdbc:postgresql://%s:%s/%s" %(MYSQL_HOST, RANGER_AUDIT_DB_PORT, audit_db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.PostgreSQLPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.audit.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.PostgreSQLPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.jdbc.driver"
        newPropertyValue="org.postgresql.Driver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.driver"
        newPropertyValue="org.postgresql.Driver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
       

    elif RANGER_DB_FLAVOR == "MSSQL":
        propertyName="ranger.jpa.jdbc.url"
        newPropertyValue="jdbc:sqlserver://%s:%s;databaseName=%s" %(MYSQL_HOST, RANGER_ADMIN_DB_PORT, db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.user"
        newPropertyValue=db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.user"
        newPropertyValue=audit_db_user
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
		
        propertyName="ranger.jpa.audit.jdbc.url"
        newPropertyValue="jdbc:sqlserver://%s:%s;databaseName=%s" % (MYSQL_HOST, RANGER_AUDIT_DB_PORT, audit_db_name)
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.SQLServerPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.audit.jdbc.dialect"
        newPropertyValue="org.eclipse.persistence.platform.database.SQLServerPlatform"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.jdbc.driver"
        newPropertyValue="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.driver"
        newPropertyValue="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

    if (os.path.isfile(os.getenv("RANGER_ADMIN_CRED_KEYSTORE_FILE"))):
        propertyName="ranger.credential.provider.path"
        newPropertyValue=os.getenv("RANGER_ADMIN_CRED_KEYSTORE_FILE")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

        propertyName="ranger.jpa.jdbc.credential.alias"
        newPropertyValue="ranger.jpa.jdbc.password"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)

	propertyName="ranger.credential.provider.path"
	newPropertyValue=os.getenv("RANGER_ADMIN_CRED_KEYSTORE_FILE")
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.jpa.jdbc.password"
	newPropertyValue="_"
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
		
	propertyName="ranger.jpa.audit.jdbc.credential.alias"
        newPropertyValue="ranger.jpa.audit.jdbc.password"
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_default)
		
	propertyName="ranger.jpa.audit.jdbc.password"
	newPropertyValue="_"
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
		
    else:
        propertyName="ranger.jpa.jdbc.password"
        newPropertyValue=os.getenv("RANGER_ADMIN_DB_PASSWORD")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.jpa.audit.jdbc.password"
        newPropertyValue=os.getenv("RANGER_AUDIT_DB_PASSWORD")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

    if os.getenv("RANGER_AUTHENTICATION_METHOD") == "LDAP":

	password_validation(os.getenv("RANGER_LDAP_BIND_PASSWORD"), "LDAP_BIND")

        propertyName="ranger.authentication.method"
        newPropertyValue=os.getenv("RANGER_AUTHENTICATION_METHOD")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.url"
        newPropertyValue=os.getenv("RANGER_LDAP_URL")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.user.dnpattern"
        newPropertyValue=os.getenv("RANGER_LDAP_USERDNPATTERN")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.group.searchbase"
        newPropertyValue=os.getenv("RANGER_LDAP_GROUPSEARCHBASE")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.group.searchfilter"
        newPropertyValue=os.getenv("RANGER_LDAP_GROUPSEARCHFILTER")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.group.roleattribute"
        newPropertyValue=os.getenv("RANGER_LDAP_GROUPROLEATTRIBUTE")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
	
	propertyName="ranger.ldap.base.dn"
        newPropertyValue=os.getenv("RANGER_LDAP_BASE_DN")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.ldap.bind.dn"
	newPropertyValue=os.getenv("RANGER_LDAP_BIND_DN")
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
	
	propertyName="ranger.ldap.bind.password"
	newPropertyValue="_"
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
	
        propertyName="ranger.ldap.referral"
        newPropertyValue=os.getenv("RANGER_LDAP_REFERRAL")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.ldap.user.searchfilter"
	newPropertyValue=os.getenv("RANGER_LDAP_USERSEARCHFILTER")
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
         
    elif os.getenv("RANGER_AUTHENTICATION_METHOD") == "ACTIVE_DIRECTORY":

	password_validation(os.getenv("RANGER_LDAP_AD_BIND_PASSWORD"), "AD_BIND")

        propertyName="ranger.authentication.method"
        newPropertyValue=os.getenv("RANGER_AUTHENTICATION_METHOD")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.ad.domain"
        newPropertyValue=os.getenv("RANGER_LDAP_AD_DOMAIN")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

        propertyName="ranger.ldap.ad.url"
        newPropertyValue=os.getenv("RANGER_LDAP_AD_URL")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

     	propertyName="ranger.ldap.ad.base.dn"
        newPropertyValue=os.getenv("RANGER_LDAP_AD_BASE_DN")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.ldap.ad.bind.dn"
	newPropertyValue=os.getenv("RANGER_LDAP_AD_BIND_DN")
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.ldap.ad.bind.password"
	newPropertyValue="_"
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)
	
        propertyName="ranger.ldap.ad.referral"
        newPropertyValue=os.getenv("RANGER_LDAP_AD_REFERRAL")
        updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

	propertyName="ranger.ldap.ad.user.searchfilter"
	newPropertyValue=os.getenv("RANGER_LDAP_AD_USERSEARCHFILTER")
	updatePropertyToFilePy(propertyName ,newPropertyValue ,to_file_ranger)

def setup_authentication(authentication_method, xmlPath):
   if authentication_method == "UNIX":
       # log("Setting up UNIX authentication for : " + xmlPath,"debug")
       # appContextPath = xmlPath + "/META-INF/security-applicationContext.xml"
       # beanSettingPath = xmlPath + "/META-INF/contextXML/unix_bean_settings.xml"
       # secSettingPath = xmlPath + "/META-INF/contextXML/unix_security_settings.xml"
       # ## Logic is to find UNIX_BEAN_SETTINGS_START,UNIX_SEC_SETTINGS_START  from appContext xml file and append
       # ## the xml properties from unix bean settings file
       # if os.path.isfile(appContextPath) and os.path.isfile(unixSettingPath):
       #     beanStrToBeAppended =  open(beanSettingPath).read()
       #     secStrToBeAppended =  open(secSettingPath).read()
       #     fileObj = open(appContextPath)
       #     for line in fileObj.read().split(';\n'):
       #         beanLineToAppend = line.match("UNIX_BEAN_SETTINGS_START")
       #         beanLineToAppend.apend(beanStrToBeAppended)
       #         secLineToAppend = line.match("UNIX_SEC_SETTINGS_START")
       #         secLineToAppend.append(secStrToBeAppended)
       #
       #     fileObj.close()
       #     sys.exit(0);
       pass
   elif authentication_method == "LDAP":
       log("Setting up authentication for : " + xmlPath,"debug")

       log("Setting up "+authentication_method+" authentication for : " + xmlPath,"debug")

       appContextPath = os.path.join(xmlPath, "WEB-INF", "classes", "conf", "security-applicationContext.xml")
       beanSettingPath = os.path.join(xmlPath, "META-INF","contextXML","ldap_bean_settings.xml")
       secSettingPath = os.path.join(xmlPath , "META-INF","contextXML","ldap_security_settings.xml")
       ## Logic is to find LDAP_BEAN_SETTINGS_START,LDAP_SEC_SETTINGS_START  from appContext xml file and append
       ## the xml properties from unix bean settings file
       if os.path.isfile(appContextPath) and os.path.isfile(beanSettingPath):
           beanStrToBeAppended =  open(beanSettingPath).read()
           secStrToBeAppended =  open(secSettingPath).read()
           fileObj = open(appContextPath)
           data = ''
           for line in fileObj.read().split('\n'):
               if ("LDAP_BEAN_SETTINGS_START") in line:
                   line = line + '\n' + beanStrToBeAppended
               if ("LDAP_SEC_SETTINGS_START") in line:
                   line = line + '\n' + secStrToBeAppended
               if data == '':
                   data = line
               else:
                   data = data + '\n' + line
           fileObj.close()

           fileObj = open(appContextPath,'w')
           fileObj.writelines(data)
           fileObj.close()

   elif authentication_method == "ACTIVE_DIRECTORY":
       log("Setting up "+authentication_method+" authentication for : " + xmlPath,"debug")
       appContextPath = os.path.join(xmlPath, "WEB-INF", "classes", "conf", "security-applicationContext.xml")
       beanSettingPath = os.path.join(xmlPath , "META-INF","contextXML","ad_bean_settings.xml")
       secSettingPath = os.path.join(xmlPath , "META-INF","contextXML","ad_security_settings.xml")

       ## Logic is to find AD_BEAN_SETTINGS_START,AD_SEC_SETTINGS_START  from appContext xml file and append
       ## the xml properties from unix bean settings file
       if os.path.isfile(appContextPath) and os.path.isfile(beanSettingPath):
           beanStrToBeAppended =  open(beanSettingPath).read()
           secStrToBeAppended =  open(secSettingPath).read()
           fileObj = open(appContextPath)
           data = ''
           for line in fileObj.read().split('\n'):
               if ("AD_BEAN_SETTINGS_START") in line :
                    line = line + '\n'+  beanStrToBeAppended
               if ("AD_SEC_SETTINGS_START") in line:
                    line = line + '\n' + secStrToBeAppended
               if data == '':
                   data = line
               else:
                   data = data + '\n' + line
           fileObj.close()

           fileObj = open(appContextPath,'w')
           fileObj.writelines(data)
           fileObj.close()

   elif authentication_method == "NONE":
      log("Authentication Method: "+authentication_method+" authentication for : " + xmlPath,"debug")
#pass
#
def do_authentication_setup():
   global conf_dict
   webappRoot = conf_dict['WEBAPP_ROOT']
   sys_conf_dict={}
#    ##Written new function to perform authentication setup for all  cases
   authentication_method = conf_dict['RANGER_AUTHENTICATION_METHOD']
   log("Starting setup based on user authentication method = " + authentication_method,"debug")
   setup_authentication(authentication_method, webappRoot)
   # ldap_file=  os.path.join(webappRoot ,"WEB-INF","resources","xa_ldap.properties")
   ldap_file=  os.path.join(webappRoot, "WEB-INF", "classes", "conf", "xa_ldap.properties")
   if os.path.isfile(ldap_file):
       log(ldap_file + " file found", "info")
   else:
       log(ldap_file + " does not exists", "warning")
   """
   config = StringIO.StringIO()
   config.write('[LDAP_AD_CONF]\n')
   config.write(open(ldap_file).read())
   config.seek(0, os.SEEK_SET)
   ##Now parse using configparser
   cObj = ConfigParser.ConfigParser()
   cObj.optionxform = str
   cObj.readfp(config)
   options = cObj.options('LDAP_AD_CONF')
   for option in options:
       value = cObj.get('LDAP_AD_CONF', option)
       sys_conf_dict[option] = value
       cObj.set("LDAP_AD_CONF",option, value)
   log("LDAP file : "+ ldap_file + " file found", "info")
   """
   if authentication_method == "LDAP":
       log("Loading LDAP attributes and properties", "debug");
       newPropertyValue=''
       ##########
       propertyName="xa_ldap_url"
       newPropertyValue=conf_dict['RANGER_LDAP_URL']
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
       ###########
       propertyName="xa_ldap_userDNpattern"
       newPropertyValue=conf_dict['RANGER_LDAP_USERDNPATTERN']
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
       ###########
       propertyName="xa_ldap_groupSearchBase"
       newPropertyValue=conf_dict['RANGER_LDAP_GROUPSEARCHBASE']
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
       ###########
       propertyName="xa_ldap_groupSearchFilter"
       newPropertyValue=conf_dict['RANGER_LDAP_GROUPSEARCHFILTER']
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
       ###########
       propertyName="xa_ldap_groupRoleAttribute"
       newPropertyValue=conf_dict['RANGER_ldap_GROUPROLEATTRIBUTE']
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
       ###########
       propertyName="authentication_method"
       newPropertyValue=authentication_method
       # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
       ModConfig(ldap_file,propertyName,newPropertyValue)
   else:
       log( "LDAP file: "+ ldap_file +" does not exists","exception")
   if authentication_method == "ACTIVE_DIRECTORY":
       log("[I] Loading ACTIVE DIRECTORY attributes and properties", "debug")
       newPropertyValue=''
       ldap_file= os.path.join(webappRoot, "WEB-INF", "classes", "conf", "xa_ldap.properties")
       if os.path.isfile(ldap_file):
           log("LDAP file : "+ ldap_file + " file found", "info")
           propertyName="xa_ldap_ad_url"
           newPropertyValue=conf_dict['RANGER_LDAP_AD_URL']
           # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
           ModConfig(ldap_file,propertyName,newPropertyValue)
           ###########
           propertyName="xa_ldap_ad_domain"
           newPropertyValue=conf_dict['RANGER_LDAP_AD_DOMAIN']
           # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
           ModConfig(ldap_file,propertyName,newPropertyValue)
           ###########
           propertyName="authentication_method"
           newPropertyValue=authentication_method
           # cObj.set('LDAP_AD_CONF',propertyName,newPropertyValue)
           ModConfig(ldap_file,propertyName,newPropertyValue)
       else:
           log(ldap_file + " does not exists", "exception")

#   with open(ldap_file, 'wb') as configfile:
#       cObj.write(configfile)
#
#    #if authentication_method == "UNIX":
#        ## I think it is not needed for Windows
#        ##do_unixauth_setup
#    log("Finished setup based on user authentication method=authentication_method", "info")
#pass

def setup_audit_user_db():
    global conf_dict

    MYSQL_BIN = conf_dict['MYSQL_BIN']
    MYSQL_HOST = conf_dict['RANGER_AUDIT_DB_HOST']

    db_root_password = conf_dict["RANGER_AUDIT_DB_ROOT_PASSWORD"]
    audit_db_user = conf_dict["RANGER_AUDIT_DB_USERNAME"]
    audit_db_password = conf_dict["RANGER_AUDIT_DB_PASSWORD"]
    audit_db_name = conf_dict['RANGER_AUDIT_DB_NAME']
    db_audit_file =  conf_dict['db_audit_file']

    #check_mysql_audit_user_password()
    log("\n--------- Creating mysql audit user --------- \n","info")
    create_mysql_user(audit_db_name, audit_db_user, audit_db_password, MYSQL_HOST, db_root_password)
    log("\n--------- Creating mysql audit user DONE----- \n","info")

    log("\n--------- Importing Audit Database ---------\n","info")
    # Verify if audit db is present
    if verify_db(audit_db_user, audit_db_password, audit_db_name, MYSQL_HOST):
        log("\nDatabase "+audit_db_name + " already exists. Ignoring import_db\n","info")
    else:
        log("\nCreating Database " + audit_db_name, "info")
        # Create audit db is not present
        cmdArr = get_mysql_cmd('root', db_root_password, MYSQL_HOST)
        cmdArr.extend(["-e", "create database %s" %(audit_db_name)])
        ret = subprocess.check_call(cmdArr)
        if ret != 0:
            log("Database creation failed!!","error")
            sys.exit(1)
        else:
            log("Creating database "+audit_db_name+" succeeded", "info")
    # Check if audit table exists
    AUDIT_TABLE="xa_access_audit"
    log("Verifying table "+AUDIT_TABLE+" in audit database "+audit_db_name, "debug")

    cmdArr = get_mysql_cmd(audit_db_user, audit_db_password, MYSQL_HOST)
    cmdArr.extend([audit_db_name, "-e", "show tables like '%s'" %(AUDIT_TABLE)])
    output = subprocess.check_output(cmdArr)
    if output.strip('\r\n') != AUDIT_TABLE:
        # Import audit table
        log("\nImporting Audit Database file: " + db_audit_file,"debug")
        if os.path.isfile(db_audit_file):
            proc = subprocess.Popen([MYSQL_BIN, "--user=%s" % audit_db_user, "--host=%s" %MYSQL_HOST, "--password=%s" % audit_db_password, audit_db_name],
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE)
            out, err = proc.communicate(file(db_audit_file).read())
            if (proc.returncode == 0):
                log("\nAudit file Imported successfully\n","info")
            else:
                log("\nAudit file Import failed!\n","info")
                sys.exit(1)
        else:
            log("\nAudit file not found!\n","info")

    else:
        log("\nTable "+AUDIT_TABLE+" already exists in audit database "+audit_db_name +"\n","info")

    log("\n--------- Importing Audit Database DONE-----\n","info")


def setup_admin_db_user():
    global conf_dict

    MYSQL_HOST = conf_dict['RANGER_ADMIN_DB_HOST']

    db_user = conf_dict["RANGER_ADMIN_DB_USERNAME"]
    db_password = conf_dict["RANGER_ADMIN_DB_PASSWORD"]
    db_root_password = conf_dict["RANGER_ADMIN_DB_ROOT_PASSWORD"]
    db_name = conf_dict['RANGER_ADMIN_DB_NAME']

    log("--------- Creating mysql user --------- ","info")
    create_mysql_user(db_name, db_user, db_password, MYSQL_HOST, db_root_password)
    #log("--------- Creating mysql user DONE----- ","info")

    #log("--------- Importing Admin Database --------- ","info")
    import_db()
    #log("--------- Importing Admin Database DONE----- ","info")
    #log("--------- Applying patches --------------- ","info")
    upgrade_db()
    #log("--------- Applying patches DONE----------- ","info")


## Ranger Functions Ends here --------------------


def call_keystore(libpath,aliasKey,aliasValue , filepath,getorcreate):
    finalLibPath = libpath.replace('\\','/').replace('//','/')
    finalFilePath = 'jceks://file/'+filepath.replace('\\','/').replace('//','/')
    if getorcreate == 'create':
        commandtorun = ['java', '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'create', aliasKey, '-value', aliasValue, '-provider',finalFilePath]
        p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE)
        output, error = p.communicate()
        statuscode = p.returncode
        return statuscode
    elif getorcreate == 'get':
        commandtorun = ['java', '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'get', aliasKey, '-provider',finalFilePath]
        p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE)
        output, error = p.communicate()
        statuscode = p.returncode
        return statuscode, output
    else:
        print 'proper command not received for input need get or create'


# Entry point to script using --service
def run_setup(cmd):
    init_logfiles()
    log("--------- Running Ranger PolicyManager Install Script ---------","debug")
    #parse_config_file()
    init_variables("service")
    setup_install_files()
    write_config_to_file()
    #extract_war()
    update_properties()
    #do_authentication_setup()
    return

# Entry point to script using --configure
def configure():
    init_logfiles()
    log("--------- Running Ranger PolicyManager Configure Script --------- ","info")
    #parse_config_file()
    init_variables("configure")
    sanity_check_configure_files()
    #log(" --------- Importing DB --------- ","info")
    # copy_mysql_connector()
    #log(" --------- Creatin Audit DB --------- ","info")
    setup_admin_db_user()
    setup_audit_user_db()
