You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2021/11/18 07:19:47 UTC

[ranger] branch master updated: RANGER-3504 : Create framework to execute DB patch dependent on Java patch

This is an automated email from the ASF dual-hosted git repository.

pradeep pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new dc6dc62  RANGER-3504 : Create framework to execute DB patch dependent on Java patch
dc6dc62 is described below

commit dc6dc621fc99f1dbff355c2e2ac00472155a0baf
Author: Dineshkumar Yadav <di...@outlook.com>
AuthorDate: Tue Nov 16 19:06:13 2021 +0530

    RANGER-3504 : Create framework to execute DB patch dependent on Java patch
    
    Signed-off-by: pradeep <pr...@apache.org>
---
 security-admin/scripts/db_setup.py | 65 ++++++++++++++++++++++++++++++++------
 1 file changed, 55 insertions(+), 10 deletions(-)

diff --git a/security-admin/scripts/db_setup.py b/security-admin/scripts/db_setup.py
index 29f0743..6adad51 100644
--- a/security-admin/scripts/db_setup.py
+++ b/security-admin/scripts/db_setup.py
@@ -35,6 +35,9 @@ retryPatchAfterSeconds=120
 stalePatchEntryHoldTimeInMinutes=10
 java_patch_regex="^Patch.*?J\d{5}.class$"
 is_unix = os_name == "LINUX" or os_name == "DARWIN"
+pre_sql_prefix="PatchPreSql_"
+post_sql_prefix="PatchPostSql_"
+java_patch_version_regex="Patch.*?_J(.*).class"
 
 RANGER_ADMIN_HOME = os.getenv("RANGER_ADMIN_HOME")
 if RANGER_ADMIN_HOME is None:
@@ -177,6 +180,8 @@ class BaseDB(object):
 
 	def apply_patches(self, db_name, db_user, db_password, PATCHES_PATH):
 		#first get all patches and then apply each patch
+		global globalDict
+		xa_db_host = globalDict['db_host']
 		if not os.path.exists(PATCHES_PATH):
 			log("[I] No patches to apply!","info")
 		else:
@@ -186,7 +191,22 @@ class BaseDB(object):
 				sorted_files = sorted(files, key=lambda x: str(x.split('.')[0]))
 				for filename in sorted_files:
 					currentPatch = os.path.join(PATCHES_PATH, filename)
+					pre_dict = {}
+					post_dict = {}
+					version = filename.split('-')[0]
+					prefix_for_preSql_patch=pre_sql_prefix + version
+					prefix_for_postSql_patch=post_sql_prefix +version
+					#getting Java patch which needs to be run before this DB patch.
+					pre_dict = self.get_pre_post_java_patches(prefix_for_preSql_patch)
+					if pre_dict:
+						log ("[I] ruunig pre java patch:[{}]".format(pre_dict),"info")
+						self.execute_java_patches(xa_db_host, db_user, db_password, db_name, pre_dict)
 					self.import_db_patches(db_name, db_user, db_password, currentPatch)
+					#getting Java patch which needs to be run immediately after this DB patch.
+					post_dict = self.get_pre_post_java_patches(prefix_for_postSql_patch)
+					if post_dict:
+						log ("[I] ruunig post java patch:[{}]".format(post_dict),"info")
+						self.execute_java_patches(xa_db_host, db_user, db_password, db_name, post_dict)
 				self.update_applied_patches_status(db_name, db_user, db_password, "DB_PATCHES")
 			else:
 				log("[I] No patches to apply!","info")
@@ -357,6 +377,29 @@ class BaseDB(object):
 						log("[E] "+version + " import failed!","error")
 						sys.exit(1)
 
+	def get_pre_post_java_patches(self, patch_name_prefix):
+		my_dict = {}
+		version = ""
+		className = ""
+		app_home = os.path.join(RANGER_ADMIN_HOME,"ews","webapp")
+		javaFiles = os.path.join(app_home,"WEB-INF","classes","org","apache","ranger","patch")
+		if not os.path.exists(javaFiles):
+			log("[I] No java patches to apply!","info")
+		else:
+			files = os.listdir(javaFiles)
+			if files:
+				for filename in files:
+					f = re.match(java_patch_regex,filename)
+					if f:
+						if patch_name_prefix != "":
+							p = re.match(patch_name_prefix, filename)
+							if p:
+								version = re.match(java_patch_version_regex,filename)
+								version = version.group(1)
+								key3 = int(version)
+								my_dict[key3] = filename
+		return my_dict
+
 	def import_db_patches(self, db_name, db_user, db_password, file_name):
 		if self.XA_DB_FLAVOR == "POSTGRES":
 			self.create_language_plpgsql(db_user, db_password, db_name)
@@ -431,9 +474,9 @@ class BaseDB(object):
 						log("[E] "+name + " import failed!","error")
 						sys.exit(1)
 
-	def execute_java_patches(self, xa_db_host, db_user, db_password, db_name):
+
+	def execute_java_patches(self, xa_db_host, db_user, db_password, db_name, my_dict):
 		global globalDict
-		my_dict = {}
 		version = ""
 		className = ""
 		app_home = os.path.join(RANGER_ADMIN_HOME,"ews","webapp")
@@ -453,13 +496,14 @@ class BaseDB(object):
 		else:
 			files = os.listdir(javaFiles)
 			if files:
-				for filename in files:
-					f = re.match(java_patch_regex,filename)
-					if f:
-						version = re.match("Patch.*?_(.*).class",filename)
-						version = version.group(1)
-						key3 = int(version.strip("J"))
-						my_dict[key3] = filename
+				if not my_dict:
+					for filename in files:
+						f = re.match(java_patch_regex,filename)
+						if f:
+							version = re.match(java_patch_version_regex,filename)
+							version = version.group(1)
+							key3 = int(version)
+							my_dict[key3] = filename
 
 			keylist = list(my_dict)
 			keylist.sort()
@@ -1303,7 +1347,8 @@ def main(argv):
 				applyJavaPatches=xa_sqlObj.hasPendingPatches(db_name, db_user, db_password, "JAVA_PATCHES")
 				if applyJavaPatches == True:
 					log("[I] ----------------- Applying java patches ------------", "info")
-					xa_sqlObj.execute_java_patches(xa_db_host, db_user, db_password, db_name)
+					my_dict = {}
+					xa_sqlObj.execute_java_patches(xa_db_host, db_user, db_password, db_name, my_dict)
 					xa_sqlObj.update_applied_patches_status(db_name,db_user, db_password,"JAVA_PATCHES")
 				else:
 					log("[I] JAVA_PATCHES have already been applied","info")