RANGER-353: Make install script platform independent Signed-off-by: sneethiraj <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/cb2dc314 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/cb2dc314 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/cb2dc314 Branch: refs/heads/master Commit: cb2dc314688eb2d88526bb627d84c91508ee95f3 Parents: b3b7732 Author: Gautam Borad <[email protected]> Authored: Tue Apr 7 20:41:46 2015 +0530 Committer: sneethiraj <[email protected]> Committed: Wed Apr 8 02:14:40 2015 -0400 ---------------------------------------------------------------------- .../main/java/org/apache/util/sql/Jisql.java | 21 +- security-admin/scripts/db_setup.py | 660 +++++++++++++++---- security-admin/scripts/dba_script.py | 465 +++++++++---- security-admin/scripts/install.properties | 6 +- security-admin/scripts/restrict_permissions.py | 453 +++++++++++++ security-admin/scripts/setup.sh | 6 +- security-admin/src/bin/ranger_install.py | 104 ++- security-admin/src/bin/service_start.py | 16 +- 8 files changed, 1446 insertions(+), 285 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb2dc314/jisql/src/main/java/org/apache/util/sql/Jisql.java ---------------------------------------------------------------------- diff --git a/jisql/src/main/java/org/apache/util/sql/Jisql.java b/jisql/src/main/java/org/apache/util/sql/Jisql.java index b429499..b9453e8 100644 --- a/jisql/src/main/java/org/apache/util/sql/Jisql.java +++ b/jisql/src/main/java/org/apache/util/sql/Jisql.java @@ -277,7 +277,7 @@ public class Jisql { } public void run() throws Exception { - + boolean isExit=false; try { driver = (Driver) Class.forName(driverName).newInstance(); props = new Properties(); @@ -313,16 +313,23 @@ public class Jisql { } } catch (SQLException sqle) { - printAllExceptions(sqle); + printAllExceptions(sqle); + isExit=true; + } + catch (IOException ie) { + isExit=true; } catch (ClassNotFoundException cnfe) { + isExit=true; System.err.println("Cannot find the driver class \"" + driverName + "\" in the current classpath."); } catch (InstantiationException ie) { + isExit=true; System.err.println("Cannot instantiate the driver class \"" + driverName + "\""); ie.printStackTrace(System.err); } catch (IllegalAccessException iae) { + isExit=true; System.err.println("Cannot instantiate the driver class \"" + driverName + "\" because of an IllegalAccessException"); iae.printStackTrace(System.err); } @@ -334,6 +341,9 @@ public class Jisql { catch (SQLException ignore) { /* ignored */ } + if(isExit){ + System.exit(1); + } } } } @@ -347,7 +357,7 @@ public class Jisql { * if an exception occurs. * */ - public void doIsql() throws SQLException { + public void doIsql() throws IOException, SQLException { BufferedReader reader = null; Statement statement = null; ResultSet resultSet = null; @@ -359,9 +369,9 @@ public class Jisql { reader = new BufferedReader(new FileReader(inputFileName)); } catch (FileNotFoundException fnfe) { - System.err.println("Unable to open \"" + inputFileName + "\""); + System.err.println("Unable to open file \"" + inputFileName + "\""); fnfe.printStackTrace(System.err); - return; + throw fnfe; } } else { @@ -489,6 +499,7 @@ public class Jisql { printAllExceptions(sqle); statement.cancel(); statement.clearWarnings(); + throw sqle; } catch (Exception e) { e.printStackTrace(System.err); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb2dc314/security-admin/scripts/db_setup.py ---------------------------------------------------------------------- diff --git a/security-admin/scripts/db_setup.py b/security-admin/scripts/db_setup.py index 09a7b57..7e0d022 100644 --- a/security-admin/scripts/db_setup.py +++ b/security-admin/scripts/db_setup.py @@ -17,16 +17,30 @@ import re import sys import errno import shlex +import platform import logging import subprocess import fileinput from os.path import basename from subprocess import Popen,PIPE from datetime import date +import datetime +from time import gmtime, strftime globalDict = {} +os_name = platform.system() +os_name = os_name.upper() + +if os_name == "LINUX": + RANGER_ADMIN_HOME = os.getcwd() +elif os_name == "WINDOWS": + RANGER_ADMIN_HOME = os.getenv("RANGER_ADMIN_HOME") + def check_output(query): - p = subprocess.Popen(query, stdout=subprocess.PIPE) + if os_name == "LINUX": + p = subprocess.Popen(shlex.split(query), stdout=subprocess.PIPE) + elif os_name == "WINDOWS": + p = subprocess.Popen(query, stdout=subprocess.PIPE, shell=True) output = p.communicate ()[0] return output @@ -44,7 +58,11 @@ def log(msg,type): def populate_global_dict(): global globalDict - read_config_file = open(os.path.join(os.getcwd(),'install.properties')) + if os_name == "LINUX": + read_config_file = open(os.path.join(RANGER_ADMIN_HOME,'install.properties')) + elif os_name == "WINDOWS": + read_config_file = open(os.path.join(RANGER_ADMIN_HOME,'bin','install_config.properties')) + library_path = os.path.join(RANGER_ADMIN_HOME,"cred","lib","*") for each_line in read_config_file.read().split('\n') : if len(each_line) == 0 : continue if re.search('=', each_line): @@ -58,6 +76,23 @@ def populate_global_dict(): value = value.strip() globalDict[key] = value +def call_keystore(libpath,aliasKey,aliasValue , filepath,getorcreate): + finalLibPath = libpath.replace('\\','/').replace('//','/') + finalFilePath = 'jceks://file/'+filepath.replace('\\','/').replace('//','/') + if getorcreate == 'create': + commandtorun = ['java', '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'create', aliasKey, '-value', aliasValue, '-provider',finalFilePath] + p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + statuscode = p.returncode + return statuscode + elif getorcreate == 'get': + commandtorun = ['java', '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'get', aliasKey, '-provider',finalFilePath] + p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + statuscode = p.returncode + return statuscode, output + else: + print 'proper command not received for input need get or create' class BaseDB(object): @@ -84,14 +119,16 @@ class BaseDB(object): if files: sorted_files = sorted(files, key=lambda x: str(x.split('.')[0])) for filename in sorted_files: - currentPatch = PATCHES_PATH + "/"+filename + currentPatch = os.path.join(PATCHES_PATH, filename) self.import_db_patches(db_name, db_user, db_password, currentPatch) else: log("[I] No patches to apply!","info") - 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] ----------------- Create audit user ------------", "info") + 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] ----------------- Audit DB operations ------------", "info") + def execute_java_patches(xa_db_host, db_user, db_password, db_name): + log("[I] ----------------- Executing java patches ------------", "info") class MysqlConf(BaseDB): # Constructor @@ -101,14 +138,23 @@ class MysqlConf(BaseDB): self.JAVA_BIN = JAVA_BIN def get_jisql_cmd(self, user, password ,db_name): - jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver mysqlconj -cstring jdbc:mysql://%s/%s -u %s -p %s -noheader -trim -c \;" %(self.JAVA_BIN,self.SQL_CONNECTOR_JAR,self.host,db_name,user,password) + #path = os.getcwd() + path = RANGER_ADMIN_HOME + self.JAVA_BIN = self.JAVA_BIN.strip("'") + if os_name == "LINUX": + jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver mysqlconj -cstring jdbc:mysql://%s/%s -u %s -p %s -noheader -trim -c \;" %(self.JAVA_BIN,self.SQL_CONNECTOR_JAR,self.host,db_name,user,password) + elif os_name == "WINDOWS": + jisql_cmd = "%s -cp %s;%s\jisql\\lib\\* org.apache.util.sql.Jisql -driver mysqlconj -cstring jdbc:mysql://%s/%s -u %s -p %s -noheader -trim" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, path, self.host, db_name, user, password) return jisql_cmd def check_connection(self, db_name, db_user, db_password): log("[I] Checking connection..", "info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -query \"SELECT version();\"" - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"SELECT version();\"" + elif os_name == "WINDOWS": + query = get_cmd + " -query \"SELECT version();\" -c ;" + output = check_output(query) if output.strip('Production |'): log("[I] Checking connection passed.", "info") return True @@ -122,8 +168,12 @@ class MysqlConf(BaseDB): for host in hosts_arr: log("[I] ---------------Granting privileges TO '"+ audit_db_user + "' on '" + audit_db_name+"'-------------" , "info") get_cmd = self.get_jisql_cmd(db_user, db_password, audit_db_name) - query = get_cmd + " -query \"GRANT INSERT ON %s.%s TO '%s'@'%s';\"" %(audit_db_name,TABLE_NAME,audit_db_user,host) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"GRANT INSERT ON %s.%s TO '%s'@'%s';\"" %(audit_db_name,TABLE_NAME,audit_db_user,host) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT INSERT ON %s.%s TO '%s'@'%s';\" -c ;" %(audit_db_name,TABLE_NAME,audit_db_user,host) + ret = subprocess.call(query) if ret == 0: log("[I] Granting privileges to '" + audit_db_user+"' done on '"+ audit_db_name+"'", "info") else: @@ -135,8 +185,12 @@ class MysqlConf(BaseDB): if os.path.isfile(file_name): log("[I] Importing db schema to database " + db_name + " from file: " + name,"info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c ;" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " DB schema imported successfully","info") else: @@ -152,18 +206,29 @@ class MysqlConf(BaseDB): version = name.split('-')[0] log("[I] Executing patch on " + db_name + " from file: " + name,"info") 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 = '%s' and active = 'Y';\"" %(version) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) 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) - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c ;" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " patch applied","info") - 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) - ret = subprocess.check_call(shlex.split(query)) + 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) + 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) + ret = subprocess.call(query) if ret == 0: log("[I] Patch version updated", "info") else: @@ -178,8 +243,11 @@ class MysqlConf(BaseDB): def check_table(self, db_name, db_user, db_password, TABLE_NAME): get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -query \"show tables like '%s';\"" %(TABLE_NAME) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"show tables like '%s';\"" %(TABLE_NAME) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"show tables like '%s';\" -c ;" %(TABLE_NAME) + output = check_output(query) if output.strip(TABLE_NAME + " |"): log("[I] Table " + TABLE_NAME +" already exists in database '" + db_name + "'","info") return True @@ -196,6 +264,65 @@ class MysqlConf(BaseDB): self.import_db_file(audit_db_name ,db_user, db_password, file_name) self.grant_audit_db_user(db_user, audit_db_name, audit_db_user, audit_db_password, db_password,TABLE_NAME) + def execute_java_patches(self, xa_db_host, db_user, db_password, db_name): + my_dict = {} + version = "" + className = "" + app_home = os.path.join(os.getcwd(),"ews","webapp") + javaFiles = os.path.join(app_home,"WEB-INF","classes","org","apache","ranger","patch") + + if not os.path.exists(javaFiles): + log("[I] No patches to apply!","info") + else: + files = os.listdir(javaFiles) + if files: + for filename in files: + f = re.match("^Patch.*?.class$",filename) + if f: + className = re.match("(Patch.*?)_.*.class",filename) + className = className.group(1) + version = re.match("Patch.*?_(.*).class",filename) + version = version.group(1) + key3 = int(version.strip("J")) + my_dict[key3] = filename + + keylist = my_dict.keys() + keylist.sort() + for key in keylist: + #print "%s: %s" % (key, my_dict[key]) + version = str(key) + className = my_dict[key] + className = className.strip(".class") + if version != "": + get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) + if output.strip(version + " |"): + log("[I] Patch "+ className +" is already applied" ,"info") + else: + log ("[I] patch "+ className +" is being applied..","info") + 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 -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,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) + 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) + 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) + ret = subprocess.call(query) + if ret == 0: + log("[I] Patch version updated", "info") + else: + log("[E] Updating patch version failed", "error") + sys.exit(1) class OracleConf(BaseDB): # Constructor @@ -205,14 +332,24 @@ class OracleConf(BaseDB): self.JAVA_BIN = JAVA_BIN def get_jisql_cmd(self, user, password): - jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver oraclethin -cstring jdbc:oracle:thin:@%s -u '%s' -p '%s' -noheader -trim" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, self.host, user, password) + #path = os.getcwd() + path = RANGER_ADMIN_HOME + self.JAVA_BIN = self.JAVA_BIN.strip("'") + if os_name == "LINUX": + jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver oraclethin -cstring jdbc:oracle:thin:@%s -u '%s' -p '%s' -noheader -trim" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, self.host, user, password) + elif os_name == "WINDOWS": + jisql_cmd = "%s -cp %s;%s\jisql\\lib\\* org.apache.util.sql.Jisql -driver oraclethin -cstring jdbc:oracle:thin:@%s -u %s -p %s -noheader -trim" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, path, self.host, user, password) return jisql_cmd + def check_connection(self, db_name, db_user, db_password): log("[I] Checking connection", "info") get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -c \; -query \"select * from v$version;\"" - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"select * from v$version;\"" + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select * from v$version;\" -c ;" + output = check_output(query) if output.strip('Production |'): log("[I] Connection success", "info") return True @@ -222,16 +359,28 @@ class OracleConf(BaseDB): def grant_audit_db_user(self, audit_db_name ,db_user,audit_db_user,db_password,audit_db_password): get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -c \; -query 'GRANT CREATE SESSION TO %s;'" % (audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query 'GRANT CREATE SESSION TO %s;'" % (audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT CREATE SESSION TO %s;\" -c ;" % (audit_db_user) + ret = subprocess.call(query) if ret != 0: sys.exit(1) - query = get_cmd + " -c \; -query 'GRANT SELECT ON %s.XA_ACCESS_AUDIT_SEQ TO %s;'" % (db_user,audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query 'GRANT SELECT ON %s.XA_ACCESS_AUDIT_SEQ TO %s;'" % (db_user,audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT SELECT ON %s.XA_ACCESS_AUDIT_SEQ TO %s;\" -c ;" % (db_user,audit_db_user) + ret = subprocess.call(query) if ret != 0: sys.exit(1) - query = get_cmd + " -c \; -query 'GRANT INSERT ON %s.XA_ACCESS_AUDIT TO %s;'" % (db_user,audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query 'GRANT INSERT ON %s.XA_ACCESS_AUDIT TO %s;'" % (db_user,audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT INSERT ON %s.XA_ACCESS_AUDIT TO %s;\" -c ;" % (db_user,audit_db_user) + ret = subprocess.call(query) if ret != 0: sys.exit(1) @@ -240,8 +389,12 @@ class OracleConf(BaseDB): if os.path.isfile(file_name): log("[I] Importing script " + db_name + " from file: " + name,"info") get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -input %s -c \;" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s -c \;" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c ;" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " imported successfully","info") else: @@ -257,18 +410,29 @@ class OracleConf(BaseDB): version = name.split('-')[0] log("[I] Executing patch on " + db_name + " from file: " + name,"info") get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) if output.strip(version +" |"): log("[I] Patch "+ name +" is already applied" ,"info") else: get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -input %s -c /" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s -c /" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c /" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " patch applied","info") - 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) - ret = subprocess.check_call(shlex.split(query)) + 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) + 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) + ret = subprocess.call(query) if ret == 0: log("[I] Patch version updated", "info") else: @@ -283,16 +447,22 @@ class OracleConf(BaseDB): def check_table(self, db_name, db_user, db_password, TABLE_NAME): get_cmd = self.get_jisql_cmd(db_user ,db_password) - query = get_cmd + " -c \; -query 'select default_tablespace from user_users;'" - output = check_output(shlex.split(query)).strip() + if os_name == "LINUX": + query = get_cmd + " -c \; -query 'select default_tablespace from user_users;'" + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select default_tablespace from user_users;\" -c ;" + output = check_output(query).strip() output = output.strip(' |') db_name = db_name.upper() if output == db_name: log("[I] User name " + db_user + " and tablespace " + db_name + " already exists.","info") log("[I] Verifying table " + TABLE_NAME +" in tablespace " + db_name, "info") get_cmd = self.get_jisql_cmd(db_user, db_password) - query = get_cmd + " -c \; -query \"select UPPER(table_name) from all_tables where UPPER(tablespace_name)=UPPER('%s') and UPPER(table_name)=UPPER('%s');\"" %(db_name ,TABLE_NAME) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"select UPPER(table_name) from all_tables where UPPER(tablespace_name)=UPPER('%s') and UPPER(table_name)=UPPER('%s');\"" %(db_name ,TABLE_NAME) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select UPPER(table_name) from all_tables where UPPER(tablespace_name)=UPPER('%s') and UPPER(table_name)=UPPER('%s');\" -c ;" %(db_name ,TABLE_NAME) + output = check_output(query) if output.strip(TABLE_NAME.upper() + ' |'): log("[I] Table " + TABLE_NAME +" already exists in tablespace " + db_name + "","info") return True @@ -316,6 +486,66 @@ class OracleConf(BaseDB): log("[I] ---------------Granting privileges TO '"+ audit_db_user + "' on audit table-------------" , "info") self.grant_audit_db_user( audit_db_name ,db_user, audit_db_user, db_password,audit_db_password) + def execute_java_patches(self, xa_db_host, db_user, db_password, db_name): + my_dict = {} + version = "" + className = "" + app_home = os.path.join(os.getcwd(),"ews","webapp") + javaFiles = os.path.join(app_home,"WEB-INF","classes","org","apache","ranger","patch") + + if not os.path.exists(javaFiles): + log("[I] No patches to apply!","info") + else: + files = os.listdir(javaFiles) + if files: + for filename in files: + f = re.match("^Patch.*?.class$",filename) + if f: + className = re.match("(Patch.*?)_.*.class",filename) + className = className.group(1) + version = re.match("Patch.*?_(.*).class",filename) + version = version.group(1) + key3 = int(version.strip("J")) + my_dict[key3] = filename + + keylist = my_dict.keys() + keylist.sort() + for key in keylist: + #print "%s: %s" % (key, my_dict[key]) + version = str(key) + className = my_dict[key] + className = className.strip(".class") + if version != "": + get_cmd = self.get_jisql_cmd(db_user, db_password) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) + if output.strip(version + " |"): + log("[I] Patch "+ className +" is already applied" ,"info") + else: + log ("[I] patch "+ className +" is being applied..","info") + 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 -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,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) + 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,'J%s', sysdate, '%s', sysdate, '%s');\"" %(version, db_user, db_user) + 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,'J%s', sysdate, '%s', sysdate, '%s');\" -c ;" %(version, db_user, db_user) + ret = subprocess.call(query) + if ret == 0: + log("[I] Patch version updated", "info") + else: + log("[E] Updating patch version failed", "error") + sys.exit(1) + class PostgresConf(BaseDB): # Constructor def __init__(self, host, SQL_CONNECTOR_JAR, JAVA_BIN): @@ -325,14 +555,23 @@ class PostgresConf(BaseDB): def get_jisql_cmd(self, user, password, db_name): #TODO: User array for forming command - jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver postgresql -cstring jdbc:postgresql://%s:5432/%s -u %s -p %s -noheader -trim -c \;" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, self.host, db_name, user, password) + #path = os.getcwd() + path = RANGER_ADMIN_HOME + self.JAVA_BIN = self.JAVA_BIN.strip("'") + if os_name == "LINUX": + jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -driver postgresql -cstring jdbc:postgresql://%s:5432/%s -u %s -p %s -noheader -trim -c \;" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, self.host, db_name, user, password) + elif os_name == "WINDOWS": + jisql_cmd = "%s -cp %s;%s\jisql\\lib\\* org.apache.util.sql.Jisql -driver postgresql -cstring jdbc:postgresql://%s:5432/%s -u %s -p %s -noheader -trim" %(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, path, self.host, db_name, user, password) return jisql_cmd def check_connection(self, db_name, db_user, db_password): log("[I] Checking connection", "info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -query \"SELECT 1;\"" - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"SELECT 1;\"" + elif os_name == "WINDOWS": + query = get_cmd + " -query \"SELECT 1;\" -c ;" + output = check_output(query) if output.strip('1 |'): log("[I] connection success", "info") return True @@ -345,8 +584,12 @@ class PostgresConf(BaseDB): if os.path.isfile(file_name): log("[I] Importing db schema to database " + db_name + " from file: " + name,"info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c ;" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " DB schema imported successfully","info") else: @@ -360,15 +603,23 @@ class PostgresConf(BaseDB): log("[I] Granting permission to " + audit_db_user, "info") get_cmd = self.get_jisql_cmd(db_user, db_password, audit_db_name) log("[I] Granting select and usage privileges to Postgres audit user '" + audit_db_user + "' on XA_ACCESS_AUDIT_SEQ", "info") - query = get_cmd + " -query 'GRANT SELECT,USAGE ON XA_ACCESS_AUDIT_SEQ TO %s;'" % (audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query 'GRANT SELECT,USAGE ON XA_ACCESS_AUDIT_SEQ TO %s;'" % (audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT SELECT,USAGE ON XA_ACCESS_AUDIT_SEQ TO %s;\" -c ;" % (audit_db_user) + ret = subprocess.call(query) if ret != 0: log("[E] Granting select privileges to Postgres user '" + audit_db_user + "' failed", "error") sys.exit(1) log("[I] Granting insert privileges to Postgres audit user '" + audit_db_user + "' on XA_ACCESS_AUDIT table", "info") - query = get_cmd + " -query 'GRANT INSERT ON XA_ACCESS_AUDIT TO %s;'" % (audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query 'GRANT INSERT ON XA_ACCESS_AUDIT TO %s;'" % (audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"GRANT INSERT ON XA_ACCESS_AUDIT TO %s;\" -c ;" % (audit_db_user) + ret = subprocess.call(query) if ret != 0: log("[E] Granting insert privileges to Postgres user '" + audit_db_user + "' failed", "error") sys.exit(1) @@ -379,17 +630,28 @@ class PostgresConf(BaseDB): version = name.split('-')[0] log("[I] Executing patch on " + db_name + " from file: " + name,"info") 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 = '%s' and active = 'Y';\"" %(version) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) if output.strip(version + " |"): log("[I] Patch "+ name +" is already applied" ,"info") else: - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s -c ;" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " patch applied","info") - 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) - ret = subprocess.check_call(shlex.split(query)) + 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(), '%s@%s', now(), '%s@%s') ;\"" %(version,db_user,xa_db_host,db_user,xa_db_host) + 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(), '%s@%s', now(), '%s@%s') ;\" -c ;" %(version,db_user,xa_db_host,db_user,xa_db_host) + ret = subprocess.call(query) if ret == 0: log("[I] Patch version updated", "info") else: @@ -405,8 +667,11 @@ class PostgresConf(BaseDB): def check_table(self, db_name, db_user, db_password, TABLE_NAME): log("[I] Verifying table " + TABLE_NAME +" in database " + db_name, "info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -query \"select * from (select table_name from information_schema.tables where table_catalog='%s' and table_name = '%s') as temp;\"" %(db_name , TABLE_NAME) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"select * from (select table_name from information_schema.tables where table_catalog='%s' and table_name = '%s') as temp;\"" %(db_name , TABLE_NAME) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select * from (select table_name from information_schema.tables where table_catalog='%s' and table_name = '%s') as temp;\" -c ;" %(db_name , TABLE_NAME) + output = check_output(query) if output.strip(TABLE_NAME +" |"): log("[I] Table " + TABLE_NAME +" already exists in database " + db_name, "info") return True @@ -415,7 +680,6 @@ class PostgresConf(BaseDB): return False 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) log("[I] --------- Check audit user connection ---------","info") @@ -426,6 +690,66 @@ class PostgresConf(BaseDB): self.import_db_file(audit_db_name, db_user, db_password, file_name) self.grant_audit_db_user(audit_db_name ,db_user, audit_db_user, db_password,audit_db_password) + def execute_java_patches(self, xa_db_host, db_user, db_password, db_name): + my_dict = {} + version = "" + className = "" + app_home = os.path.join(os.getcwd(),"ews","webapp") + javaFiles = os.path.join(app_home,"WEB-INF","classes","org","apache","ranger","patch") + + if not os.path.exists(javaFiles): + log("[I] No patches to apply!","info") + else: + files = os.listdir(javaFiles) + if files: + for filename in files: + f = re.match("^Patch.*?.class$",filename) + if f: + className = re.match("(Patch.*?)_.*.class",filename) + className = className.group(1) + version = re.match("Patch.*?_(.*).class",filename) + version = version.group(1) + key3 = int(version.strip("J")) + my_dict[key3] = filename + + keylist = my_dict.keys() + keylist.sort() + for key in keylist: + #print "%s: %s" % (key, my_dict[key]) + version = str(key) + className = my_dict[key] + className = className.strip(".class") + if version != "": + get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) + if output.strip(version + " |"): + log("[I] Patch "+ className +" is already applied" ,"info") + else: + log ("[I] patch "+ className +" is being applied..","info") + 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 -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,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) + 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(), '%s@%s', now(), '%s@%s') ;\"" %(version,db_user,xa_db_host,db_user,xa_db_host) + 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(), '%s@%s', now(), '%s@%s') ;\" -c ;" %(version,db_user,xa_db_host,db_user,xa_db_host) + ret = subprocess.call(query) + if ret == 0: + log("[I] Patch version updated", "info") + else: + log("[E] Updating patch version failed", "error") + sys.exit(1) + class SqlServerConf(BaseDB): # Constructor @@ -436,14 +760,23 @@ class SqlServerConf(BaseDB): def get_jisql_cmd(self, user, password, db_name): #TODO: User array for forming command - jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -user %s -password %s -driver mssql -cstring jdbc:sqlserver://%s:1433\\;databaseName=%s -noheader -trim"%(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, user, password, self.host,db_name) + #path = os.getcwd() + path = RANGER_ADMIN_HOME + self.JAVA_BIN = self.JAVA_BIN.strip("'") + if os_name == "LINUX": + jisql_cmd = "%s -cp %s:jisql/lib/* org.apache.util.sql.Jisql -user %s -password %s -driver mssql -cstring jdbc:sqlserver://%s:1433\\;databaseName=%s -noheader -trim"%(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, user, password, self.host,db_name) + elif os_name == "WINDOWS": + jisql_cmd = "%s -cp %s;%s\\jisql\\lib\\* org.apache.util.sql.Jisql -user %s -password %s -driver mssql -cstring jdbc:sqlserver://%s:1433;databaseName=%s -noheader -trim"%(self.JAVA_BIN, self.SQL_CONNECTOR_JAR, path, user, password, self.host,db_name) return jisql_cmd def check_connection(self, db_name, db_user, db_password): log("[I] Checking connection", "info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -c \; -query \"SELECT 1;\"" - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"SELECT 1;\"" + elif os_name == "WINDOWS": + query = get_cmd + " -query \"SELECT 1;\" -c ;" + output = check_output(query) if output.strip('1 |'): log("[I] Connection success", "info") return True @@ -456,8 +789,12 @@ class SqlServerConf(BaseDB): if os.path.isfile(file_name): log("[I] Importing db schema to database " + db_name + " from file: " + name,"info") get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " DB schema imported successfully","info") else: @@ -469,8 +806,11 @@ class SqlServerConf(BaseDB): def check_table(self, db_name, db_user, db_password, TABLE_NAME): get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) - query = get_cmd + " -c \; -query \"SELECT TABLE_NAME FROM information_schema.tables where table_name = '%s';\"" %(TABLE_NAME) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"SELECT TABLE_NAME FROM information_schema.tables where table_name = '%s';\"" %(TABLE_NAME) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"SELECT TABLE_NAME FROM information_schema.tables where table_name = '%s';\" -c ;" %(TABLE_NAME) + output = check_output(query) if output.strip(TABLE_NAME + " |"): log("[I] Table '" + TABLE_NAME + "' already exists in database '" + db_name + "'","info") return True @@ -481,8 +821,12 @@ class SqlServerConf(BaseDB): def grant_audit_db_user(self, audit_db_name, db_user, audit_db_user, db_password, audit_db_password,TABLE_NAME): log("[I] Granting permission to audit user '" + audit_db_user + "' on db '" + audit_db_name + "'","info") get_cmd = self.get_jisql_cmd(db_user, db_password,audit_db_name) - query = get_cmd + " -c \; -query \"USE %s GRANT INSERT to %s;\"" %(audit_db_name ,audit_db_user) - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -c \; -query \"USE %s GRANT SELECT,INSERT to %s;\"" %(audit_db_name ,audit_db_user) + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"USE %s GRANT SELECT,INSERT to %s;\" -c ;" %(audit_db_name ,audit_db_user) + ret = subprocess.call(query) if ret != 0 : sys.exit(1) else: @@ -494,17 +838,28 @@ class SqlServerConf(BaseDB): version = name.split('-')[0] log("[I] Executing patch on " + db_name + " from file: " + name,"info") 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 = '%s' and active = 'Y';\"" %(version) - output = check_output(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\"" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = '%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) if output.strip(version + " |"): log("[I] Patch "+ name +" is already applied" ,"info") else: - query = get_cmd + " -input %s" %file_name - ret = subprocess.check_call(shlex.split(query)) + if os_name == "LINUX": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(shlex.split(query)) + elif os_name == "WINDOWS": + query = get_cmd + " -input %s" %file_name + ret = subprocess.call(query) if ret == 0: log("[I] "+name + " patch applied","info") - 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) - ret = subprocess.check_call(shlex.split(query)) + 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@%s', GETDATE(), '%s@%s') ;\" -c \;" %(version,db_user,xa_db_host,db_user,xa_db_host) + 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@%s', GETDATE(), '%s@%s') ;\" -c ;" %(version,db_user,xa_db_host,db_user,xa_db_host) + ret = subprocess.call(query) if ret == 0: log("[I] Patch version updated", "info") else: @@ -528,7 +883,68 @@ class SqlServerConf(BaseDB): self.import_db_file(audit_db_name ,db_user, db_password, file_name) self.grant_audit_db_user( audit_db_name ,db_user, audit_db_user, db_password,audit_db_password,TABLE_NAME) -def main(): + def execute_java_patches(self, xa_db_host, db_user, db_password, db_name): + my_dict = {} + version = "" + className = "" + app_home = os.path.join(os.getcwd(),"ews","webapp") + javaFiles = os.path.join(app_home,"WEB-INF","classes","org","apache","ranger","patch") + + if not os.path.exists(javaFiles): + log("[I] No patches to apply!","info") + else: + files = os.listdir(javaFiles) + if files: + for filename in files: + f = re.match("^Patch.*?.class$",filename) + if f: + className = re.match("(Patch.*?)_.*.class",filename) + className = className.group(1) + version = re.match("Patch.*?_(.*).class",filename) + version = version.group(1) + key3 = int(version.strip("J")) + my_dict[key3] = filename + + keylist = my_dict.keys() + keylist.sort() + for key in keylist: + #print "%s: %s" % (key, my_dict[key]) + version = str(key) + className = my_dict[key] + className = className.strip(".class") + if version != "": + get_cmd = self.get_jisql_cmd(db_user, db_password, db_name) + if os_name == "LINUX": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\" -c \;" %(version) + elif os_name == "WINDOWS": + query = get_cmd + " -query \"select version from x_db_version_h where version = 'J%s' and active = 'Y';\" -c ;" %(version) + output = check_output(query) + if output.strip(version + " |"): + log("[I] Patch "+ className +" is already applied" ,"info") + else: + log ("[I] patch "+ className +" is being applied..","info") + 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 -cp %s org.apache.ranger.patch.%s"%(self.JAVA_BIN,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) + 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@%s', GETDATE(), '%s@%s') ;\" -c \;" %(version,db_user,xa_db_host,db_user,xa_db_host) + 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(), '%s@%s', now(), '%s@%s') ;\" -c ;" %(version,db_user,xa_db_host,db_user,xa_db_host) + ret = subprocess.call(query) + if ret == 0: + log("[I] Patch version updated", "info") + else: + log("[E] Updating patch version failed", "error") + sys.exit(1) + + +def main(argv): populate_global_dict() FORMAT = '%(asctime)-15s %(message)s' @@ -537,31 +953,32 @@ def main(): JAVA_BIN=globalDict['JAVA_BIN'] XA_DB_FLAVOR=globalDict['DB_FLAVOR'] AUDIT_DB_FLAVOR=globalDict['DB_FLAVOR'] - XA_DB_FLAVOR.upper() - AUDIT_DB_FLAVOR.upper() + XA_DB_FLAVOR = XA_DB_FLAVOR.upper() + AUDIT_DB_FLAVOR = AUDIT_DB_FLAVOR.upper() + log("[I] DB FLAVOR :" + XA_DB_FLAVOR ,"info") xa_db_host = globalDict['db_host'] audit_db_host = globalDict['db_host'] - mysql_dbversion_catalog = 'db/mysql/create_dbversion_catalog.sql' + mysql_dbversion_catalog = os.path.join('db','mysql','create_dbversion_catalog.sql') mysql_core_file = globalDict['mysql_core_file'] mysql_audit_file = globalDict['mysql_audit_file'] - mysql_patches = 'db/mysql/patches' + mysql_patches = os.path.join('db','mysql','patches') - oracle_dbversion_catalog = 'db/oracle/create_dbversion_catalog.sql' + oracle_dbversion_catalog = os.path.join('db','oracle','create_dbversion_catalog.sql') oracle_core_file = globalDict['oracle_core_file'] oracle_audit_file = globalDict['oracle_audit_file'] - oracle_patches = 'db/oracle/patches' + oracle_patches = os.path.join('db','oracle','patches') - postgres_dbversion_catalog = 'db/postgres/create_dbversion_catalog.sql' + postgres_dbversion_catalog = os.path.join('db','postgres','create_dbversion_catalog.sql') postgres_core_file = globalDict['postgres_core_file'] postgres_audit_file = globalDict['postgres_audit_file'] - postgres_patches = 'db/postgres/patches' + postgres_patches = os.path.join('db','postgres','patches') - sqlserver_dbversion_catalog = 'db/sqlserver/create_dbversion_catalog.sql' + sqlserver_dbversion_catalog = os.path.join('db','sqlserver','create_dbversion_catalog.sql') sqlserver_core_file = globalDict['sqlserver_core_file'] sqlserver_audit_file = globalDict['sqlserver_audit_file'] - sqlserver_patches = 'db/sqlserver/patches' + sqlserver_patches = os.path.join('db','sqlserver','patches') db_name = globalDict['db_name'] db_user = globalDict['db_user'] @@ -578,30 +995,30 @@ def main(): if XA_DB_FLAVOR == "MYSQL": MYSQL_CONNECTOR_JAR=globalDict['SQL_CONNECTOR_JAR'] xa_sqlObj = MysqlConf(xa_db_host, MYSQL_CONNECTOR_JAR, JAVA_BIN) - xa_db_version_file = os.path.join(os.getcwd(),mysql_dbversion_catalog) - xa_db_core_file = os.path.join(os.getcwd(),mysql_core_file) - xa_patch_file = os.path.join(os.getcwd(),mysql_patches) + xa_db_version_file = os.path.join(RANGER_ADMIN_HOME , mysql_dbversion_catalog) + xa_db_core_file = os.path.join(RANGER_ADMIN_HOME , mysql_core_file) + xa_patch_file = os.path.join(RANGER_ADMIN_HOME ,mysql_patches) elif XA_DB_FLAVOR == "ORACLE": ORACLE_CONNECTOR_JAR=globalDict['SQL_CONNECTOR_JAR'] xa_sqlObj = OracleConf(xa_db_host, ORACLE_CONNECTOR_JAR, JAVA_BIN) - xa_db_version_file = os.path.join(os.getcwd(),oracle_dbversion_catalog) - xa_db_core_file = os.path.join(os.getcwd(),oracle_core_file) - xa_patch_file = os.path.join(os.getcwd(),oracle_patches) + xa_db_version_file = os.path.join(RANGER_ADMIN_HOME ,oracle_dbversion_catalog) + xa_db_core_file = os.path.join(RANGER_ADMIN_HOME ,oracle_core_file) + xa_patch_file = os.path.join(RANGER_ADMIN_HOME ,oracle_patches) elif XA_DB_FLAVOR == "POSTGRES": 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(os.getcwd(),postgres_dbversion_catalog) - xa_db_core_file = os.path.join(os.getcwd(),postgres_core_file) - xa_patch_file = os.path.join(os.getcwd(),postgres_patches) + xa_db_version_file = os.path.join(RANGER_ADMIN_HOME , postgres_dbversion_catalog) + xa_db_core_file = os.path.join(RANGER_ADMIN_HOME , postgres_core_file) + xa_patch_file = os.path.join(RANGER_ADMIN_HOME , postgres_patches) elif XA_DB_FLAVOR == "SQLSERVER": SQLSERVER_CONNECTOR_JAR = globalDict['SQL_CONNECTOR_JAR'] xa_sqlObj = SqlServerConf(xa_db_host, SQLSERVER_CONNECTOR_JAR, JAVA_BIN) - xa_db_version_file = os.path.join(os.getcwd(),sqlserver_dbversion_catalog) - xa_db_core_file = os.path.join(os.getcwd(),sqlserver_core_file) - xa_patch_file = os.path.join(os.getcwd(),sqlserver_patches) + xa_db_version_file = os.path.join(RANGER_ADMIN_HOME ,sqlserver_dbversion_catalog) + xa_db_core_file = os.path.join(RANGER_ADMIN_HOME , sqlserver_core_file) + xa_patch_file = os.path.join(RANGER_ADMIN_HOME , sqlserver_patches) else: log("[E] --------- NO SUCH SUPPORTED DB FLAVOUR!! ---------", "error") sys.exit(1) @@ -609,41 +1026,50 @@ def main(): if AUDIT_DB_FLAVOR == "MYSQL": MYSQL_CONNECTOR_JAR=globalDict['SQL_CONNECTOR_JAR'] audit_sqlObj = MysqlConf(audit_db_host,MYSQL_CONNECTOR_JAR,JAVA_BIN) - audit_db_file = os.path.join(os.getcwd(),mysql_audit_file) + audit_db_file = os.path.join(RANGER_ADMIN_HOME ,mysql_audit_file) elif AUDIT_DB_FLAVOR == "ORACLE": ORACLE_CONNECTOR_JAR=globalDict['SQL_CONNECTOR_JAR'] audit_sqlObj = OracleConf(audit_db_host, ORACLE_CONNECTOR_JAR, JAVA_BIN) - audit_db_file = os.path.join(os.getcwd(),oracle_audit_file) + audit_db_file = os.path.join(RANGER_ADMIN_HOME , oracle_audit_file) elif AUDIT_DB_FLAVOR == "POSTGRES": POSTGRES_CONNECTOR_JAR = globalDict['SQL_CONNECTOR_JAR'] audit_sqlObj = PostgresConf(audit_db_host, POSTGRES_CONNECTOR_JAR, JAVA_BIN) - audit_db_file = os.path.join(os.getcwd(),postgres_audit_file) + audit_db_file = os.path.join(RANGER_ADMIN_HOME , postgres_audit_file) elif AUDIT_DB_FLAVOR == "SQLSERVER": SQLSERVER_CONNECTOR_JAR = globalDict['SQL_CONNECTOR_JAR'] audit_sqlObj = SqlServerConf(audit_db_host, SQLSERVER_CONNECTOR_JAR, JAVA_BIN) - audit_db_file = os.path.join(os.getcwd(),sqlserver_audit_file) + audit_db_file = os.path.join(RANGER_ADMIN_HOME , sqlserver_audit_file) else: log("[E] --------- NO SUCH SUPPORTED DB FLAVOUR!! ---------", "error") sys.exit(1) +# ''' log("[I] --------- Verifying Ranger DB connection ---------","info") xa_sqlObj.check_connection(db_name, db_user, db_password) - log("[I] --------- Verifying Ranger DB tables ---------","info") - if xa_sqlObj.check_table(db_name, db_user, db_password, x_user): - pass - else: - log("[I] --------- Importing Ranger Core DB Schema ---------","info") - xa_sqlObj.import_db_file(db_name, db_user, db_password, xa_db_core_file) - log("[I] --------- Verifying upgrade history table ---------","info") - output = xa_sqlObj.check_table(db_name, db_user, db_password, x_db_version) - if output == False: - log("[I] --------- Creating version history table ---------","info") - xa_sqlObj.upgrade_db(db_name, db_user, db_password, xa_db_version_file) - log("[I] --------- Applying patches ---------","info") - xa_sqlObj.apply_patches(db_name, db_user, db_password, xa_patch_file) - audit_sqlObj.auditdb_operation(xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, audit_db_file, xa_access_audit) - -main() \ No newline at end of file + + if len(argv)==1: + + log("[I] --------- Verifying Ranger DB tables ---------","info") + if xa_sqlObj.check_table(db_name, db_user, db_password, x_user): + pass + else: + log("[I] --------- Importing Ranger Core DB Schema ---------","info") + xa_sqlObj.import_db_file(db_name, db_user, db_password, xa_db_core_file) + log("[I] --------- Verifying upgrade history table ---------","info") + output = xa_sqlObj.check_table(db_name, db_user, db_password, x_db_version) + if output == False: + log("[I] --------- Creating version history table ---------","info") + xa_sqlObj.upgrade_db(db_name, db_user, db_password, xa_db_version_file) + log("[I] --------- Applying patches ---------","info") + xa_sqlObj.apply_patches(db_name, db_user, db_password, xa_patch_file) + audit_sqlObj.auditdb_operation(xa_db_host, audit_db_host, db_name, audit_db_name, db_user, audit_db_user, db_password, audit_db_password, audit_db_file, xa_access_audit) +# ''' + 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) + +main(sys.argv)
