You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ga...@apache.org on 2016/04/07 05:49:48 UTC

incubator-ranger git commit: RANGER-910 : Improve db and java patches execution logic to make that more robust

Repository: incubator-ranger
Updated Branches:
  refs/heads/master 93e3bf1cd -> 093ea3da7


RANGER-910 : Improve db and java patches execution logic to make that more robust


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/093ea3da
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/093ea3da
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/093ea3da

Branch: refs/heads/master
Commit: 093ea3da796f3df488019e6eea66392fa5205cae
Parents: 93e3bf1
Author: Pradeep Agrawal <pr...@freestoneinfotech.com>
Authored: Wed Apr 6 11:35:11 2016 +0530
Committer: Gautam Borad <ga...@apache.org>
Committed: Thu Apr 7 09:19:40 2016 +0530

----------------------------------------------------------------------
 .../plugin/store/AbstractServiceStore.java      |   6 +-
 security-admin/scripts/db_setup.py              | 928 ++++++++++++++-----
 .../org/apache/ranger/biz/ServiceDBStore.java   |  11 +-
 .../java/org/apache/ranger/biz/UserMgr.java     |   2 +-
 .../java/org/apache/ranger/biz/XUserMgr.java    |  58 ++
 .../apache/ranger/biz/TestServiceDBStore.java   |   4 +-
 6 files changed, 777 insertions(+), 232 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
index f231b09..ebb4b78 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
@@ -301,7 +301,7 @@ public abstract class AbstractServiceStore implements ServiceStore {
 		}
 
 		if(tagServiceDef == null) {
-			LOG.error("AbstractServiceStore.updateTagServiceDefForUpdatingAccessTypes(" + serviceDef.getName() + "): could not fund TAG ServiceDef.. ");
+			LOG.error("AbstractServiceStore.updateTagServiceDefForUpdatingAccessTypes(" + serviceDef.getName() + "): could not find TAG ServiceDef.. ");
 
 			return;
 		}
@@ -417,12 +417,12 @@ public abstract class AbstractServiceStore implements ServiceStore {
 		try {
 			tagServiceDef = this.getServiceDef(EmbeddedServiceDefsUtil.instance().getTagServiceDefId());
 		} catch (Exception e) {
-			LOG.error("AbstractServiceStore.updateTagServiceDefForDeletingAccessTypes(" + serviceDefName + "): could not fund TAG ServiceDef.. ", e);
+			LOG.error("AbstractServiceStore.updateTagServiceDefForDeletingAccessTypes(" + serviceDefName + "): could not find TAG ServiceDef.. ", e);
 			throw e;
 		}
 
 		if(tagServiceDef == null) {
-			LOG.error("AbstractServiceStore.updateTagServiceDefForDeletingAccessTypes(" + serviceDefName + "): could not fund TAG ServiceDef.. ");
+			LOG.error("AbstractServiceStore.updateTagServiceDefForDeletingAccessTypes(" + serviceDefName + "): could not find TAG ServiceDef.. ");
 
 			return;
 		}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/security-admin/scripts/db_setup.py
----------------------------------------------------------------------
diff --git a/security-admin/scripts/db_setup.py b/security-admin/scripts/db_setup.py
index f2cc9b9..3d20fcd 100644
--- a/security-admin/scripts/db_setup.py
+++ b/security-admin/scripts/db_setup.py
@@ -24,6 +24,7 @@ import fileinput
 from os.path import basename
 from subprocess import Popen,PIPE
 from datetime import date
+import time
 import datetime
 from time import gmtime, strftime
 globalDict = {}
@@ -233,33 +234,66 @@ class MysqlConf(BaseDB):
 			if output.strip(version + " |"):
 				log("[I] Patch "+ name  +" is already applied" ,"info")
 			else:
-				get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
 				if os_name == "LINUX":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(shlex.split(query))
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 				elif os_name == "WINDOWS":
-					query = get_cmd + " -input %s -c ;" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(query)
-				if ret == 0:
-					log("[I] "+name + " patch applied","info")
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+				jisql_log(query, db_password)
+				output = check_output(query)
+				if output.strip(version + " |"):
+					while(output.strip(version + " |")):
+						log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+						time.sleep(300)
+						jisql_log(query, db_password)
+						output = check_output(query)
+				else:
 					if os_name == "LINUX":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', now(), user(), now(), user()) ;\"" %(version)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', now(), user(), now(), user(),'N') ;\"" %(version)
 						jisql_log(query, db_password)
 						ret = subprocess.call(shlex.split(query))
 					elif os_name == "WINDOWS":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', now(), user(), now(), user()) ;\" -c ;" %(version)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', now(), user(), now(), user(),'N') ;\" -c ;" %(version)
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] Patch version updated", "info")
+						log ("[I] Patch "+ name +" is being applied..","info")
 					else:
-						log("[E] Updating patch version failed", "error")
+						log("[E] Patch "+ name +" failed", "error")
+						sys.exit(1)
+					if os_name == "LINUX":
+						query = get_cmd + " -input %s" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(shlex.split(query))
+					elif os_name == "WINDOWS":
+						query = get_cmd + " -input %s -c ;" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(query)
+					if ret == 0:
+						log("[I] "+name + " patch applied","info")
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] Patch version updated", "info")
+						else:
+							log("[E] Updating patch version failed", "error")
+							sys.exit(1)
+					else:
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
-				else:
-					log("[E] "+name + " import failed!","error")
-					sys.exit(1)
 
 	def import_auditdb_patches(self, xa_sqlObj,xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Checking XA_ACCESS_AUDIT table to apply audit db patches --------- ","info")
@@ -279,33 +313,67 @@ class MysqlConf(BaseDB):
 				if output.strip(version + " |"):
 					log("[I] Patch "+ name  +" is already applied" ,"info")
 				else:
-					get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
 					if os_name == "LINUX":
-						query = get_cmd2 + " -input %s" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(shlex.split(query))
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 					elif os_name == "WINDOWS":
-						query = get_cmd2 + " -input %s -c ;" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(query)
-					if ret == 0:
-						log("[I] "+name + " patch applied","info")
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+					jisql_log(query, db_password)
+					output = check_output(query)
+					if output.strip(version + " |"):
+						while(output.strip(version + " |")):
+							log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+							time.sleep(300)
+							jisql_log(query, db_password)
+							output = check_output(query)
+					else:
 						if os_name == "LINUX":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', now(), user(), now(), user()) ;\"" %(version)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', now(), user(), now(), user(),'N') ;\"" %(version)
 							jisql_log(query, db_password)
 							ret = subprocess.call(shlex.split(query))
 						elif os_name == "WINDOWS":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', now(), user(), now(), user()) ;\" -c ;" %(version)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', now(), user(), now(), user(),'N') ;\" -c ;" %(version)
 							jisql_log(query, db_password)
 							ret = subprocess.call(query)
 						if ret == 0:
-							log("[I] Patch version updated", "info")
+							log ("[I] Patch "+ name +" is being applied..","info")
 						else:
-							log("[E] Updating patch version failed", "error")
+							log("[E] Patch "+ name +" failed", "error")
+							sys.exit(1)
+						get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
+						if os_name == "LINUX":
+							query = get_cmd2 + " -input %s" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd2 + " -input %s -c ;" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] "+name + " patch applied","info")
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							if ret == 0:
+								log("[I] Patch version updated", "info")
+							else:
+								log("[E] Updating patch version failed", "error")
+								sys.exit(1)
+						else:
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							log("[E] "+name + " import failed!","error")
 							sys.exit(1)
-					else:
-						log("[E] "+name + " import failed!","error")
-						sys.exit(1)
 		else:
 			log("[I] Table XA_ACCESS_AUDIT does not exists in " +audit_db_name,"error")
 			sys.exit(1)
@@ -375,34 +443,76 @@ class MysqlConf(BaseDB):
 					if output.strip(version + " |"):
 						log("[I] Java patch "+ className  +" is already applied" ,"info")
 					else:
-						log ("[I] java patch "+ className +" is being applied..","info")
 						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 ,self.SQL_CONNECTOR_JAR)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\"" %(version)
 						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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
-						get_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
-						if os_name == "LINUX":
-							ret = subprocess.call(shlex.split(get_cmd))
-						elif os_name == "WINDOWS":
-							ret = subprocess.call(get_cmd)
-						if ret == 0:
-							get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c ;" %(version)
+						jisql_log(query, db_password)
+						output = check_output(query)
+						if output.strip(version + " |"):
+							while(output.strip(version + " |")):
+								log("[I] Java patch "+ className  +" is being applied by some other process" ,"info")
+								time.sleep(300)
+								jisql_log(query, db_password)
+								output = check_output(query)
+						else:
 							if os_name == "LINUX":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', now(), user(), now(), user()) ;\"" %(version)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', now(), user(), now(), user(),'N') ;\"" %(version)
 								jisql_log(query, db_password)
 								ret = subprocess.call(shlex.split(query))
 							elif os_name == "WINDOWS":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', now(), user(), now(), user()) ;\" -c ;" %(version)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', now(), user(), now(), user(),'N') ;\" -c ;" %(version)
 								jisql_log(query, db_password)
 								ret = subprocess.call(query)
 							if ret == 0:
-								log ("[I] java patch "+ className +" is applied..","info")
+								log ("[I] java patch "+ className +" is being applied..","info")
 							else:
 								log("[E] java patch "+ className +" failed", "error")
 								sys.exit(1)
-						else:
-							log("[E] applying java patch "+ className +" failed", "error")
-							sys.exit(1)
+							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 ,self.SQL_CONNECTOR_JAR)
+							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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
+							get_java_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
+							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:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\"" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								if ret == 0:
+									log ("[I] java patch "+ className +" is applied..","info")
+								else:
+									if os_name == "LINUX":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\"" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(shlex.split(query))
+									elif os_name == "WINDOWS":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(query)
+									log("[E] java patch "+ className +" failed", "error")
+									sys.exit(1)
+							else:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\"" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								log("[E] applying java patch "+ className +" failed", "error")
+								sys.exit(1)
+
+
 class OracleConf(BaseDB):
 	# Constructor
 	def __init__(self, host, SQL_CONNECTOR_JAR, JAVA_BIN):
@@ -528,33 +638,65 @@ class OracleConf(BaseDB):
 			if output.strip(version +" |"):
 				log("[I] Patch "+ name  +" is already applied" ,"info")
 			else:
-				get_cmd = self.get_jisql_cmd(db_user, db_password)
 				if os_name == "LINUX":
-					query = get_cmd + " -input %s -c /" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(shlex.split(query))
+					query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 				elif os_name == "WINDOWS":
-					query = get_cmd + " -input %s -c /" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(query)
-				if ret == 0:
-					log("[I] "+name + " patch applied","info")
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+				jisql_log(query, db_password)
+				output = check_output(query)
+				if output.strip(version +" |"):
+					while(output.strip(version + " |")):
+						log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+						time.sleep(300)
+						jisql_log(query, db_password)
+						output = check_output(query)
+				else:
 					if os_name == "LINUX":
-						query = get_cmd + " -c \; -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s');\"" %(version, db_user, db_user)
+						query = get_cmd + " -c \; -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by,active) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s','N');\"" %(version, db_user, db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(shlex.split(query))
 					elif os_name == "WINDOWS":
-						query = get_cmd + " -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s');\" -c ;" %(version, db_user, db_user)
+						query = get_cmd + " -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by,active) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s','N');\" -c ;" %(version, db_user, db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] Patch version updated", "info")
+						log ("[I] Patch "+ name +" is being applied..","info")
 					else:
-						log("[E] Updating patch version failed", "error")
+						log("[E] Patch "+ name +" failed", "error")
+					if os_name == "LINUX":
+						query = get_cmd + " -input %s -c /" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(shlex.split(query))
+					elif os_name == "WINDOWS":
+						query = get_cmd + " -input %s -c /" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(query)
+					if ret == 0:
+						log("[I] "+name + " patch applied","info")
+						if os_name == "LINUX":
+							query = get_cmd + " -c \; -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] Patch version updated", "info")
+						else:
+							log("[E] Updating patch version failed", "error")
+							sys.exit(1)
+					else:
+						if os_name == "LINUX":
+							query = get_cmd + " -c \; -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						log("[E] "+name + " Import failed!","error")
 						sys.exit(1)
-				else:
-					log("[E] "+name + " Import failed!","error")
-					sys.exit(1)
 
 	def import_auditdb_patches(self, xa_sqlObj,xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Checking XA_ACCESS_AUDIT table to apply audit db patches --------- ","info")
@@ -574,33 +716,66 @@ class OracleConf(BaseDB):
 				if output.strip(version +" |"):
 					log("[I] Patch "+ name  +" is already applied" ,"info")
 				else:
-					get_cmd2 = self.get_jisql_cmd(db_user, db_password)
 					if os_name == "LINUX":
-						query = get_cmd2 + " -input %s -c /" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(shlex.split(query))
+						query = get_cmd1 + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version)
 					elif os_name == "WINDOWS":
-						query = get_cmd2 + " -input %s -c /" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(query)
-					if ret == 0:
-						log("[I] "+name + " patch applied","info")
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version)
+					jisql_log(query, db_password)
+					output = check_output(query)
+					if output.strip(version +" |"):
+						while(output.strip(version + " |")):
+							log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+							time.sleep(300)
+							jisql_log(query, db_password)
+							output = check_output(query)
+					else:
 						if os_name == "LINUX":
-							query = get_cmd1 + " -c \; -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s');\"" %(version, db_user, db_user)
+							query = get_cmd1 + " -c \; -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by,active) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s','N');\"" %(version, db_user, db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(shlex.split(query))
 						elif os_name == "WINDOWS":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s');\" -c ;" %(version, db_user, db_user)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (id,version, inst_at, inst_by, updated_at, updated_by,active) values ( X_DB_VERSION_H_SEQ.nextval,'%s', sysdate, '%s', sysdate, '%s','N');\" -c ;" %(version, db_user, db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(query)
 						if ret == 0:
-							log("[I] Patch version updated", "info")
+							log ("[I] Patch "+ name +" is being applied..","info")
 						else:
-							log("[E] Updating patch version failed", "error")
+							log("[E] Patch "+ name +" failed", "error")
+						get_cmd2 = self.get_jisql_cmd(db_user, db_password)
+						if os_name == "LINUX":
+							query = get_cmd2 + " -input %s -c /" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd2 + " -input %s -c /" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] "+name + " patch applied","info")
+							if os_name == "LINUX":
+								query = get_cmd1 + " -c \; -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							if ret == 0:
+								log("[I] Patch version updated", "info")
+							else:
+								log("[E] Updating patch version failed", "error")
+								sys.exit(1)
+						else:
+							if os_name == "LINUX":
+								query = get_cmd1 + " -c \; -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							log("[E] "+name + " Import failed!","error")
 							sys.exit(1)
-					else:
-						log("[E] "+name + " Import failed!","error")
-						sys.exit(1)
 			else:
 				log("[I] Patch file not found","error")
 				sys.exit(1)
@@ -839,31 +1014,64 @@ class PostgresConf(BaseDB):
 				log("[I] Patch "+ name  +" is already applied" ,"info")
 			else:
 				if os_name == "LINUX":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(shlex.split(query))
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 				elif os_name == "WINDOWS":
-					query = get_cmd + " -input %s -c ;" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(query)
-				if ret == 0:
-					log("[I] "+name + " patch applied","info")
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+				jisql_log(query, db_password)
+				output = check_output(query)
+				if output.strip(version + " |"):
+					while(output.strip(version + " |")):
+						log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+						time.sleep(300)
+						jisql_log(query, db_password)
+						output = check_output(query)
+				else:
+					if os_name == "LINUX":
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\"" %(version,db_user,db_user)
+						jisql_log(query, db_password)
+						ret = subprocess.call(shlex.split(query))
+					elif os_name == "WINDOWS":
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\" -c ;" %(version,db_user,db_user)
+						jisql_log(query, db_password)
+						ret = subprocess.call(query)
+					if ret == 0:
+						log ("[I] Patch "+ name +" is being applied..","info")
+					else:
+						log("[E] Patch "+ name +" failed", "error")
 					if os_name == "LINUX":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', current_timestamp, '%s', current_timestamp, '%s') ;\"" %(version,db_user,db_user)
+						query = get_cmd + " -input %s" %file_name
 						jisql_log(query, db_password)
 						ret = subprocess.call(shlex.split(query))
 					elif os_name == "WINDOWS":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', current_timestamp, '%s', current_timestamp, '%s') ;\" -c ;" %(version,db_user,db_user)
+						query = get_cmd + " -input %s -c ;" %file_name
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] Patch version updated", "info")
+						log("[I] "+name + " patch applied","info")
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] Patch version updated", "info")
+						else:
+							log("[E] Updating patch version failed", "error")
+							sys.exit(1)
 					else:
-						log("[E] Updating patch version failed", "error")
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
-				else:
-					log("[E] "+name + " import failed!","error")
-					sys.exit(1)
 
 	def import_auditdb_patches(self, xa_sqlObj,xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Checking XA_ACCESS_AUDIT table to apply audit db patches --------- ","info")
@@ -884,33 +1092,66 @@ class PostgresConf(BaseDB):
 				if output.strip(version + " |"):
 					log("[I] Patch "+ name  +" is already applied" ,"info")
 				else:
-					get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
 					if os_name == "LINUX":
-						query = get_cmd2 + " -input %s" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(shlex.split(query))
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 					elif os_name == "WINDOWS":
-						query = get_cmd2 + " -input %s -c ;" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(query)
-					if ret == 0:
-						log("[I] "+name + " patch applied","info")
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+					jisql_log(query, db_password)
+					output = check_output(query)
+					if output.strip(version + " |"):
+						while(output.strip(version + " |")):
+							log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+							time.sleep(300)
+							jisql_log(query, db_password)
+							output = check_output(query)
+					else:
 						if os_name == "LINUX":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', current_timestamp, '%s', current_timestamp, '%s') ;\"" %(version,db_user,db_user)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\"" %(version,db_user,db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(shlex.split(query))
 						elif os_name == "WINDOWS":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', current_timestamp, '%s', current_timestamp, '%s') ;\" -c ;" %(version,db_user,db_user)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\" -c ;" %(version,db_user,db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(query)
 						if ret == 0:
-							log("[I] Patch version updated", "info")
+							log ("[I] Patch "+ name +" is being applied..","info")
 						else:
-							log("[E] Updating patch version failed", "error")
+							log("[E] Patch "+ name +" failed", "error")
+						get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
+						if os_name == "LINUX":
+							query = get_cmd2 + " -input %s" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd2 + " -input %s -c ;" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] "+name + " patch applied","info")
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							if ret == 0:
+								log("[I] Patch version updated", "info")
+							else:
+								log("[E] Updating patch version failed", "error")
+								sys.exit(1)
+						else:
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\"" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							log("[E] "+name + " import failed!","error")
 							sys.exit(1)
-					else:
-						log("[E] "+name + " import failed!","error")
-						sys.exit(1)
 		else:
 			log("[I] Table XA_ACCESS_AUDIT does not exists in " +audit_db_name,"error")
 			sys.exit(1)
@@ -981,36 +1222,76 @@ class PostgresConf(BaseDB):
 					jisql_log(query, db_password)
 					output = check_output(query)
 					if output.strip(version + " |"):
-						log("[I] java patch "+ className  +" is already applied" ,"info")
+						log("[I] Java patch "+ className  +" is already applied" ,"info")
 					else:
-						log ("[I] java patch "+ className +" is being applied..","info")
 						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 ,self.SQL_CONNECTOR_JAR)
-						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;%s")%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
-						get_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
-						if os_name == "LINUX":
-							ret = subprocess.call(shlex.split(get_cmd))
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\"" %(version)
 						elif os_name == "WINDOWS":
-							ret = subprocess.call(get_cmd)
-						if ret == 0:
-							get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c ;" %(version)
+						jisql_log(query, db_password)
+						output = check_output(query)
+						if output.strip(version + " |"):
+							while(output.strip(version + " |")):
+								log("[I] Java patch "+ className  +" is being applied by some other process" ,"info")
+								time.sleep(300)
+								jisql_log(query, db_password)
+								output = check_output(query)
+						else:
 							if os_name == "LINUX":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', current_timestamp, '%s', current_timestamp, '%s') ;\"" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\"" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(shlex.split(query))
 							elif os_name == "WINDOWS":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', current_timestamp, '%s', current_timestamp, '%s') ;\" -c ;" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', current_timestamp, '%s', current_timestamp, '%s','N') ;\" -c ;" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(query)
 							if ret == 0:
-								log("[I] java patch "+ className +" applied", "info")
+								log ("[I] java patch "+ className +" is being applied..","info")
 							else:
 								log("[E] java patch "+ className +" failed", "error")
 								sys.exit(1)
-						else:
-							log("[E] java patch "+ className +" failed", "error")
-							sys.exit(1)
+							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 ,self.SQL_CONNECTOR_JAR)
+							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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
+							get_java_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
+							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:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\"" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								if ret == 0:
+									log ("[I] java patch "+ className +" is applied..","info")
+								else:
+									if os_name == "LINUX":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\"" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(shlex.split(query))
+									elif os_name == "WINDOWS":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(query)
+									log("[E] java patch "+ className +" failed", "error")
+									sys.exit(1)
+							else:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\"" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								log("[E] applying java patch "+ className +" failed", "error")
+								sys.exit(1)
 
 
 class SqlServerConf(BaseDB):
@@ -1112,31 +1393,64 @@ class SqlServerConf(BaseDB):
 				log("[I] Patch "+ name  +" is already applied" ,"info")
 			else:
 				if os_name == "LINUX":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(shlex.split(query))
+					query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 				elif os_name == "WINDOWS":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(query)
-				if ret == 0:
-					log("[I] "+name + " patch applied","info")
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+				jisql_log(query, db_password)
+				output = check_output(query)
+				if output.strip(version + " |"):
+					while(output.strip(version + " |")):
+						log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+						time.sleep(300)
+						jisql_log(query, db_password)
+						output = check_output(query)
+				else:
 					if os_name == "LINUX":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\" -c \;" %(version,db_user,db_user)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(shlex.split(query))
 					elif os_name == "WINDOWS":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\" -c ;" %(version,db_user,db_user)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] Patch version updated", "info")
+						log ("[I] Patch "+ name +" is being applied..","info")
 					else:
-						log("[E] Updating patch version failed", "error")
+						log("[E] Patch "+ name +" failed", "error")
+					if os_name == "LINUX":
+						query = get_cmd + " -input %s" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(shlex.split(query))
+					elif os_name == "WINDOWS":
+						query = get_cmd + " -input %s" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(query)
+					if ret == 0:
+						log("[I] "+name + " patch applied","info")
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c \;"  %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] Patch version updated", "info")
+						else:
+							log("[E] Updating patch version failed", "error")
+							sys.exit(1)
+					else:
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c \;"  %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
-				else:
-					log("[E] "+name + " import failed!","error")
-					sys.exit(1)
 
 	def import_auditdb_patches(self, xa_sqlObj,xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Checking XA_ACCESS_AUDIT table to apply audit db patches --------- ","info")
@@ -1148,7 +1462,7 @@ class SqlServerConf(BaseDB):
 				log("[I] Executing patch on " + audit_db_name + " from file: " + name,"info")
 				get_cmd1 = xa_sqlObj.get_jisql_cmd(db_user, db_password, db_name)
 				if os_name == "LINUX":
-					query = get_cmd1 + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version)
+					query = get_cmd1 + " -c \; query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version)
 				elif os_name == "WINDOWS":
 					query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version)
 				jisql_log(query, db_password)
@@ -1156,36 +1470,70 @@ class SqlServerConf(BaseDB):
 				if output.strip(version + " |"):
 					log("[I] Patch "+ name  +" is already applied" ,"info")
 				else:
-					get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
 					if os_name == "LINUX":
-						query = get_cmd2 + " -input %s" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(shlex.split(query))
+						query = get_cmd1 + " -c \; query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 					elif os_name == "WINDOWS":
-						query = get_cmd2 + " -input %s" %file_name
-						jisql_log(query, db_password)
-						ret = subprocess.call(query)
-					if ret == 0:
-						log("[I] "+name + " patch applied","info")
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+					jisql_log(query, db_password)
+					output = check_output(query)
+					if output.strip(version + " |"):
+						while(output.strip(version + " |")):
+							log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+							time.sleep(300)
+							jisql_log(query, db_password)
+							output = check_output(query)
+					else:
+						get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
 						if os_name == "LINUX":
-							query = get_cmd1 + " -c \; -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\"" %(version,db_user,db_user)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(shlex.split(query))
 						elif os_name == "WINDOWS":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\" -c ;" %(version,db_user,db_user)
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
 							jisql_log(query, db_password)
 							ret = subprocess.call(query)
 						if ret == 0:
-							log("[I] Patch version updated", "info")
+							log ("[I] Patch "+ name +" is being applied..","info")
 						else:
-							log("[E] Updating patch version failed", "error")
+							log("[E] Patch "+ name +" failed", "error")
+						if os_name == "LINUX":
+							query = get_cmd2 + " -input %s" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd2 + " -input %s" %file_name
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] "+name + " patch applied","info")
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c \;"  %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							if ret == 0:
+								log("[I] Patch version updated", "info")
+							else:
+								log("[E] Updating patch version failed", "error")
+								sys.exit(1)
+						else:
+							if os_name == "LINUX":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c \;"  %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(shlex.split(query))
+							elif os_name == "WINDOWS":
+								query = get_cmd1 + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+								jisql_log(query, db_password)
+								ret = subprocess.call(query)
+							log("[E] "+name + " import failed!","error")
 							sys.exit(1)
-					else:
-						log("[E] "+name + " import failed!","error")
-						sys.exit(1)
 		else:
 			log("[I] Table XA_ACCESS_AUDIT does not exists in " +audit_db_name,"error")
 			sys.exit(1)
+
 	def auditdb_operation(self, xa_db_host, audit_db_host, db_name, audit_db_name,db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Check admin user connection --------- ","info")
 		self.check_connection(audit_db_name, db_user, db_password)
@@ -1236,36 +1584,76 @@ class SqlServerConf(BaseDB):
 					jisql_log(query, db_password)
 					output = check_output(query)
 					if output.strip(version + " |"):
-						log("[I] java patch "+ className  +" is already applied" ,"info")
+						log("[I] Java patch "+ className  +" is already applied" ,"info")
 					else:
-						log ("[I] java patch "+ className +" is being applied..","info")
 						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 ,self.SQL_CONNECTOR_JAR)
-						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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
-						get_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
-						if os_name == "LINUX":
-							ret = subprocess.call(shlex.split(get_cmd))
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c \;" %(version)
 						elif os_name == "WINDOWS":
-							ret = subprocess.call(get_cmd)
-						if ret == 0:
-							get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c ;" %(version)
+						jisql_log(query, db_password)
+						output = check_output(query)
+						if output.strip(version + " |"):
+							while(output.strip(version + " |")):
+								log("[I] Java patch "+ className  +" is being applied by some other process" ,"info")
+								time.sleep(300)
+								jisql_log(query, db_password)
+								output = check_output(query)
+						else:
 							if os_name == "LINUX":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\" -c \;" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(shlex.split(query))
 							elif os_name == "WINDOWS":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', CURRENT_TIMESTAMP, '%s', CURRENT_TIMESTAMP, '%s') ;\" -c ;" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(query)
 							if ret == 0:
-								log("[I] java patch "+ className  +" applied", "info")
+								log ("[I] java patch "+ className +" is being applied..","info")
 							else:
-								log("[E] java patch "+ className  +" failed", "error")
+								log("[E] java patch "+ className +" failed", "error")
+								sys.exit(1)
+							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 ,self.SQL_CONNECTOR_JAR)
+							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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
+							get_java_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
+							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:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c \;"  %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								if ret == 0:
+									log ("[I] java patch "+ className +" is applied..","info")
+								else:
+									if os_name == "LINUX":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c \;"  %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(shlex.split(query))
+									elif os_name == "WINDOWS":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(query)
+									log("[E] java patch "+ className +" failed", "error")
+									sys.exit(1)
+							else:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c \;"  %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								log("[E] applying java patch "+ className +" failed", "error")
 								sys.exit(1)
-						else:
-							log("[E] java patch "+ className  +" failed", "error")
-							sys.exit(1)
 
 class SqlAnywhereConf(BaseDB):
 	# Constructor
@@ -1366,31 +1754,64 @@ class SqlAnywhereConf(BaseDB):
 				log("[I] Patch "+ name  +" is already applied" ,"info")
 			else:
 				if os_name == "LINUX":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(shlex.split(query))
+					query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
 				elif os_name == "WINDOWS":
-					query = get_cmd + " -input %s" %file_name
-					jisql_log(query, db_password)
-					ret = subprocess.call(query)
-				if ret == 0:
-					log("[I] "+name + " patch applied","info")
+					query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+				jisql_log(query, db_password)
+				output = check_output(query)
+				if output.strip(version + " |"):
+					while output.strip(version + " |"):
+						log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+						time.sleep(300)
+						jisql_log(query, db_password)
+						output = check_output(query)
+				else:
 					if os_name == "LINUX":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c \;" %(version,db_user,db_user)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(shlex.split(query))
 					elif os_name == "WINDOWS":
-						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c ;" %(version,db_user,db_user)
+						query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] Patch version updated", "info")
+						log ("[I] Patch "+ name +" is being applied..","info")
 					else:
-						log("[E] Updating patch version failed", "error")
+						log("[E] Patch "+ name +" failed", "error")
+					if os_name == "LINUX":
+						query = get_cmd + " -input %s" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(shlex.split(query))
+					elif os_name == "WINDOWS":
+						query = get_cmd + " -input %s" %file_name
+						jisql_log(query, db_password)
+						ret = subprocess.call(query)
+					if ret == 0:
+						log("[I] "+name + " patch applied","info")
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c \;"  %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log("[I] Patch version updated", "info")
+						else:
+							log("[E] Updating patch version failed", "error")
+							sys.exit(1)
+					else:
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c \;"  %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
-				else:
-					log("[E] "+name + " import failed!","error")
-					sys.exit(1)
 
 	def import_auditdb_patches(self, xa_sqlObj,xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, file_name, TABLE_NAME):
 		log("[I] --------- Checking XA_ACCESS_AUDIT table to apply audit db patches --------- ","info")
@@ -1410,6 +1831,31 @@ class SqlAnywhereConf(BaseDB):
 				if output.strip(version + " |"):
 					log("[I] Patch "+ name  +" is already applied" ,"info")
 				else:
+					if os_name == "LINUX":
+						query = get_cmd1 + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'N';\"" %(version)
+					elif os_name == "WINDOWS":
+						query = get_cmd1 + " -query \"select version from x_db_version_h where version = '%s' and active = 'N';\" -c ;" %(version)
+					jisql_log(query, db_password)
+					output = check_output(query)
+					if output.strip(version + " |"):
+						while output.strip(version + " |"):
+							log("[I] Patch "+ name  +" is being applied by some other process" ,"info")
+							time.sleep(300)
+							jisql_log(query, db_password)
+							output = check_output(query)
+					else:
+						if os_name == "LINUX":
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
+						if ret == 0:
+							log ("[I] Patch "+ name +" is being applied..","info")
+						else:
+							log("[E] Patch "+ name +" failed", "error")
 					get_cmd2 = self.get_jisql_cmd(db_user, db_password, audit_db_name)
 					if os_name == "LINUX":
 						query = get_cmd2 + " -input %s" %file_name
@@ -1420,13 +1866,13 @@ class SqlAnywhereConf(BaseDB):
 						jisql_log(query, db_password)
 						ret = subprocess.call(query)
 					if ret == 0:
-						log("[I] "+name + " patch applied","info")
 						if os_name == "LINUX":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c \;" %(version,db_user,db_user)
+							log("[I] "+name + " patch applied","info")
+							query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c \;"  %(version)
 							jisql_log(query, db_password)
 							ret = subprocess.call(shlex.split(query))
 						elif os_name == "WINDOWS":
-							query = get_cmd1 + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c ;" %(version,db_user,db_user)
+							query = get_cmd1 + " -query \"update x_db_version_h set active='Y' where version='%s' and active='N';\" -c ;" %(version)
 							jisql_log(query, db_password)
 							ret = subprocess.call(query)
 						if ret == 0:
@@ -1435,6 +1881,14 @@ class SqlAnywhereConf(BaseDB):
 							log("[E] Updating patch version failed", "error")
 							sys.exit(1)
 					else:
+						if os_name == "LINUX":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c \;"  %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(shlex.split(query))
+						elif os_name == "WINDOWS":
+							query = get_cmd + " -query \"delete from x_db_version_h where version='%s' and active='N';\" -c ;" %(version)
+							jisql_log(query, db_password)
+							ret = subprocess.call(query)
 						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
 		else:
@@ -1491,36 +1945,76 @@ class SqlAnywhereConf(BaseDB):
 					jisql_log(query, db_password)
 					output = check_output(query)
 					if output.strip(version + " |"):
-						log("[I] java patch "+ className  +" is already applied" ,"info")
+						log("[I] Java patch "+ className  +" is already applied" ,"info")
 					else:
-						log ("[I] java patch "+ className +" is being applied..","info")
 						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 ,self.SQL_CONNECTOR_JAR)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c \;" %(version)
 						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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
-						get_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
-						if os_name == "LINUX":
-							ret = subprocess.call(shlex.split(get_cmd))
-						elif os_name == "WINDOWS":
-							ret = subprocess.call(get_cmd)
-						if ret == 0:
-							get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
+							query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'N';\" -c ;" %(version)
+						jisql_log(query, db_password)
+						output = check_output(query)
+						if output.strip(version + " |"):
+							while(output.strip(version + " |")):
+								log("[I] Java patch "+ className  +" is being applied by some other process" ,"info")
+								time.sleep(300)
+								jisql_log(query, db_password)
+								output = check_output(query)
+						else:
 							if os_name == "LINUX":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c \;" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c \;" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(shlex.split(query))
 							elif os_name == "WINDOWS":
-								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by) values ('J%s', GETDATE(), '%s', GETDATE(), '%s') ;\" -c ;" %(version,db_user,db_user)
+								query = get_cmd + " -query \"insert into x_db_version_h (version, inst_at, inst_by, updated_at, updated_by,active) values ('J%s', GETDATE(), '%s', GETDATE(), '%s','N') ;\" -c ;" %(version,db_user,db_user)
 								jisql_log(query, db_password)
 								ret = subprocess.call(query)
 							if ret == 0:
-								log("[I] java patch "+ className  +" applied", "info")
+								log ("[I] java patch "+ className +" is being applied..","info")
 							else:
-								log("[E] java patch "+ className  +" failed", "error")
+								log("[E] java patch "+ className +" failed", "error")
+								sys.exit(1)
+							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 ,self.SQL_CONNECTOR_JAR)
+							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;%s" )%(app_home ,app_home ,app_home, app_home, app_home, app_home ,app_home ,self.SQL_CONNECTOR_JAR)
+							get_java_cmd = "%s -Dlogdir=%s -Dlog4j.configuration=db_patch.log4j.xml -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,ranger_log,path,className)
+							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:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c \;"  %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"update x_db_version_h set active='Y' where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								if ret == 0:
+									log ("[I] java patch "+ className +" is applied..","info")
+								else:
+									if os_name == "LINUX":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c \;"  %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(shlex.split(query))
+									elif os_name == "WINDOWS":
+										query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+										jisql_log(query, db_password)
+										ret = subprocess.call(query)
+									log("[E] java patch "+ className +" failed", "error")
+									sys.exit(1)
+							else:
+								if os_name == "LINUX":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c \;"  %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(shlex.split(query))
+								elif os_name == "WINDOWS":
+									query = get_cmd + " -query \"delete from x_db_version_h where version='J%s' and active='N';\" -c ;" %(version)
+									jisql_log(query, db_password)
+									ret = subprocess.call(query)
+								log("[E] applying java patch "+ className +" failed", "error")
 								sys.exit(1)
-						else:
-							log("[E] java patch "+ className  +" failed", "error")
-							sys.exit(1)
 
 	def set_options(self, db_name, db_user, db_password, TABLE_NAME):
 		get_cmd = self.get_jisql_cmd(db_user, db_password, db_name)
@@ -1634,7 +2128,7 @@ def main(argv):
 
 	elif XA_DB_FLAVOR == "POSTGRES":
 		db_user=db_user.lower()
-        	db_name=db_name.lower()
+		db_name=db_name.lower()
 		POSTGRES_CONNECTOR_JAR = globalDict['SQL_CONNECTOR_JAR']
 		xa_sqlObj = PostgresConf(xa_db_host, POSTGRES_CONNECTOR_JAR, JAVA_BIN)
 		xa_db_version_file = os.path.join(RANGER_ADMIN_HOME , postgres_dbversion_catalog)
@@ -1678,7 +2172,7 @@ def main(argv):
 
 	elif AUDIT_DB_FLAVOR == "POSTGRES":
 		audit_db_user=audit_db_user.lower()
-	        audit_db_name=audit_db_name.lower()
+		audit_db_name=audit_db_name.lower()
 		POSTGRES_CONNECTOR_JAR = globalDict['SQL_CONNECTOR_JAR']
 		audit_sqlObj = PostgresConf(audit_db_host, POSTGRES_CONNECTOR_JAR, JAVA_BIN)
 		audit_db_file = os.path.join(RANGER_ADMIN_HOME , postgres_audit_file)
@@ -1735,6 +2229,6 @@ def main(argv):
 	if len(argv)>1:
 		for i in range(len(argv)):
 			if str(argv[i]) == "-javapatch":
-			        xa_sqlObj.execute_java_patches(xa_db_host, db_user, db_password, db_name)
+				xa_sqlObj.execute_java_patches(xa_db_host, db_user, db_password, db_name)
 
 main(sys.argv)

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index a8f063b..9d2e4c6 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -1256,16 +1256,12 @@ public class ServiceDBStore extends AbstractServiceStore {
 				if (xxUser != null) {
 					vXUser = xUserService.populateViewBean(xxUser);
 				} else {
-					vXUser = new VXUser();
-					vXUser.setName(userName);
-					vXUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
-
 					UserSessionBase usb = ContextUtil.getCurrentUserSession();
 					if (usb != null && !usb.isUserAdmin()) {
 						throw restErrorUtil.createRESTException("User does not exist with given username: ["
 								+ userName + "] please use existing user", MessageEnums.OPER_NO_PERMISSION);
 					}
-					vXUser = xUserMgr.createXUser(vXUser);
+					vXUser = xUserMgr.createServiceConfigUser(userName);
 				}
 			}
 
@@ -1426,15 +1422,12 @@ public class ServiceDBStore extends AbstractServiceStore {
 				if (xxUser != null) {
 					vXUser = xUserService.populateViewBean(xxUser);
 				} else {
-					vXUser = new VXUser();
-					vXUser.setName(userName);
-					vXUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
 					UserSessionBase usb = ContextUtil.getCurrentUserSession();
 					if (usb != null && !usb.isUserAdmin()) {
 						throw restErrorUtil.createRESTException("User does not exist with given username: ["
 								+ userName + "] please use existing user", MessageEnums.OPER_NO_PERMISSION);
 					}
-					vXUser = xUserMgr.createXUser(vXUser);
+					vXUser = xUserMgr.createServiceConfigUser(userName);
 				}
 			}
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
index 3e5b30b..2d09591 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
@@ -1174,7 +1174,7 @@ public class UserMgr {
 		}
 	}
 
-	private VXPortalUser mapXXPortalUserToVXPortalUserForDefaultAccount(
+	protected VXPortalUser mapXXPortalUserToVXPortalUserForDefaultAccount(
 			XXPortalUser user) {
 
 		VXPortalUser userProfile = new VXPortalUser();

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 6f53a24..ae81b22 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.ranger.common.ContextUtil;
+import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.RangerCommonEnums;
 import org.apache.ranger.entity.XXGroupPermission;
 import org.apache.ranger.entity.XXModuleDef;
@@ -149,6 +150,9 @@ public class XUserMgr extends XUserMgrBase {
 	@Autowired
 	ServiceDBStore svcStore;
 
+	@Autowired
+	GUIDUtil guidUtil;
+
 	static final Logger logger = Logger.getLogger(XUserMgr.class);
 
 
@@ -1817,4 +1821,58 @@ public class XUserMgr extends XUserMgrBase {
 			throw restErrorUtil.generateRESTException(vXResponse);
 		}
 	}
+
+    protected VXUser createServiceConfigUser(String userName){
+        if (userName == null || "null".equalsIgnoreCase(userName) || userName.trim().isEmpty()) {
+                logger.error("User Name: "+userName);
+                throw restErrorUtil.createRESTException("Please provide a valid username.",MessageEnums.INVALID_INPUT_DATA);
+        }
+        VXUser vXUser = null;
+        VXPortalUser vXPortalUser=null;
+        XXUser xxUser = daoManager.getXXUser().findByUserName(userName);
+        XXPortalUser xXPortalUser = daoManager.getXXPortalUser().findByLoginId(userName);
+        String actualPassword = "";
+        if(xxUser!=null && xXPortalUser!=null){
+                vXUser = xUserService.populateViewBean(xxUser);
+                return vXUser;
+        }
+        if(xxUser==null){
+                vXUser=new VXUser();
+                vXUser.setName(userName);
+                vXUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
+                vXUser.setDescription(vXUser.getName());
+                actualPassword = vXUser.getPassword();
+        }
+        if(xXPortalUser==null){
+                vXPortalUser=new VXPortalUser();
+                vXPortalUser.setLoginId(userName);
+                vXPortalUser.setEmailAddress(guidUtil.genGUID());
+                vXPortalUser.setFirstName(vXUser.getFirstName());
+                vXPortalUser.setLastName(vXUser.getLastName());
+                vXPortalUser.setPassword(vXUser.getPassword());
+                vXPortalUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
+                ArrayList<String> roleList = new ArrayList<String>();
+                roleList.add(RangerConstants.ROLE_USER);
+                vXPortalUser.setUserRoleList(roleList);
+                xXPortalUser = userMgr.mapVXPortalUserToXXPortalUser(vXPortalUser);
+                xXPortalUser=userMgr.createUser(xXPortalUser, RangerCommonEnums.STATUS_ENABLED, roleList);
+        }
+        VXUser createdXUser=null;
+        if(xxUser==null && vXUser!=null){
+                createdXUser = xUserService.createResource(vXUser);
+        }
+        if(createdXUser!=null){
+                logger.info("User created: "+createdXUser.getName());
+                createdXUser.setPassword(actualPassword);
+                List<XXTrxLog> trxLogList = xUserService.getTransactionLog(createdXUser, "create");
+                String hiddenPassword = PropertiesUtil.getProperty("ranger.password.hidden", "*****");
+                createdXUser.setPassword(hiddenPassword);
+                xaBizUtil.createTrxLog(trxLogList);
+                if(xXPortalUser!=null){
+                        vXPortalUser=userMgr.mapXXPortalUserToVXPortalUserForDefaultAccount(xXPortalUser);
+                        assignPermissionToUser(vXPortalUser, true);
+                }
+        }
+        return createdXUser;
+}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/093ea3da/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
----------------------------------------------------------------------
diff --git a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
index 17da9be..61e13da 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
@@ -1168,7 +1168,7 @@ public class TestServiceDBStore {
 		Mockito.when(xUserDao.findByUserName(userName)).thenReturn(xUser);
 
 		Mockito.when(xUserService.populateViewBean(xUser)).thenReturn(vXUser);
-		Mockito.when(xUserMgr.createXUser(vXUser)).thenReturn(vXUser);
+		Mockito.when(xUserMgr.createServiceConfigUser(userName)).thenReturn(vXUser);
 
 		XXServiceConfigMap xConfMap = new XXServiceConfigMap();
 		Mockito.when(rangerAuditFields.populateAuditFields(xConfMap, xService))
@@ -1275,7 +1275,7 @@ public class TestServiceDBStore {
 		Mockito.when(xUserDao.findByUserName(name)).thenReturn(xUser);
 
 		Mockito.when(xUserService.populateViewBean(xUser)).thenReturn(vXUser);
-		Mockito.when(xUserMgr.createXUser(vXUser)).thenReturn(vXUser);
+		Mockito.when(xUserMgr.createServiceConfigUser(name)).thenReturn(vXUser);
 
 		Mockito.when(
 				(XXServiceConfigMap) rangerAuditFields.populateAuditFields(