#
# 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 re
import sys
import errno
import shlex
import logging
import subprocess
import platform
import fileinput
import getpass
import shutil
from xml.etree import ElementTree as ET
from os.path import basename
from subprocess import Popen,PIPE
from datetime import date
from datetime import datetime

os_name = platform.system()
os_name = os_name.upper()

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

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

def username_validation(username):
        if username:
                if re.search("[\\\`'\"]",username):
                        log("[E] username contains one of the unsupported special characters like \" ' \ `","error")
                        sys.exit(1)


def main(argv):
        FORMAT = '%(asctime)-15s %(message)s'
        logging.basicConfig(format=FORMAT, level=logging.DEBUG)
        ews_lib = os.path.join(RANGER_ADMIN_HOME,"ews","lib")
        app_home = os.path.join(RANGER_ADMIN_HOME,"ews","webapp")
        ranger_log = os.path.join(RANGER_ADMIN_HOME,"ews","logs")

        if os.environ['JAVA_HOME'] == "":
                log("[E] ---------- JAVA_HOME environment property not defined, aborting installation. ----------", "error")
                sys.exit(1)
        JAVA_BIN=os.path.join(os.environ['JAVA_HOME'],'bin','java')
        if os_name == "WINDOWS" :
                JAVA_BIN = JAVA_BIN+'.exe'
        if os.path.isfile(JAVA_BIN):
                pass
        else:
                while os.path.isfile(JAVA_BIN) == False:
                        log("Enter java executable path: :","info")
                        JAVA_BIN=raw_input()
        log("[I] Using Java:" + str(JAVA_BIN),"info")

        USERNAME = ''
        OLD_PASSWORD = ''
        NEW_USERNAME=''

        if len(argv)==4:
                userName=argv[1]
                oldPassword=argv[2]
                newUserName=argv[3]
        else:
                log("[E] Invalid argument list.", "error")
                log("[I] Usage : python changeusernameutil.py <loginID> <currentPassword> <newUserName>","info")
                sys.exit(1)

        while userName == "":
                print "Enter user name:"
                userName=raw_input()

        while oldPassword == "":
                oldPassword=getpass.getpass("Enter current password:")

        while newUserName == "":
                newUserName=getpass.getpass("Enter new user name:")

        if userName==newUserName:
                log("[E] Old User Name and New User Name argument are same. Exiting!!", "error")
                sys.exit(1)

        if userName != "" and oldPassword != "" and newUserName != "":
                username_validation(newUserName)
                if os_name == "LINUX":
                        path = os.path.join("%s","WEB-INF","classes","conf:%s","WEB-INF","classes","lib","*:%s","WEB-INF",":%s","META-INF",":%s","WEB-INF","lib","*:%s","WEB-INF","classes",":%s","WEB-INF","classes","META-INF:%s/*")%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home,ews_lib)
                elif os_name == "WINDOWS":
                        path = os.path.join("%s","WEB-INF","classes","conf;%s","WEB-INF","classes","lib","*;%s","WEB-INF",";%s","META-INF",";%s","WEB-INF","lib","*;%s","WEB-INF","classes",";%s","WEB-INF","classes","META-INF" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home)
                get_java_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.cliutil.%s %s %s %s"%(JAVA_BIN,ranger_log,path,'ChangeUserNameUtil',userName,oldPassword,newUserName)
                if os_name == "LINUX":
                        ret = subprocess.call(shlex.split(get_java_cmd))
                elif os_name == "WINDOWS":
                        ret = subprocess.call(get_java_cmd)
                if ret == 0:
                        log("[I] User name updated successfully","info")
                else:
                        log("[E] Unable to update user name of user:"+userName,"error")
                        sys.exit(1)
        else:
                log("[E] Input Error","error")

main(sys.argv)
