def ready(self): """ The ready function is trigger only on events like server start up and server reload """ # print "***************You are in Core Katana App Config Class***************" nav_obj = Navigator() base_directory = nav_obj.get_katana_dir() warrior_dir = nav_obj.get_warrior_dir() config_file_name = "wf_config.json" config_json_file = join_path(base_directory, "config.json") settings_file_path = get_abs_path(join_path("wui", "settings.py"), base_directory) core_index_obj = CoreIndex(base_directory, settings_file_path=settings_file_path) available_apps = core_index_obj.get_available_apps() settings_apps = core_index_obj.get_apps_from_settings_file() AppInformation.information = Apps() AppInformation.information.set_apps({ 'base_directory': base_directory, 'config_file_name': config_file_name, 'available_apps': available_apps, 'settings_apps': settings_apps }) if os.environ["pipmode"] == "True": pythonsrcdir = read_json_data(config_json_file)['pythonsrcdir'] else: pythonsrcdir = warrior_dir ordered_json = validate_config_json(read_json_data(config_json_file), pythonsrcdir) with open(config_json_file, "w") as f: f.write(json.dumps(ordered_json, indent=4))
class Settings: def __init__(self): self.navigator = Navigator() self.static_dir = join_path(self.navigator.get_katana_dir(), "native", "settings", "static", "settings") def get_location(self): pass def smart_analysis_handler(self, request): mainFile = self.navigator.get_katana_dir( ) + os.sep + 'native' + os.sep + 'settings' + os.sep + 'Tools' + os.sep + 'connection' + os.sep + 'connect_settings.xml' if request.method == 'POST': val = xmltodict.unparse( { 'credentials': { 'system': json.loads(request.POST.get('data')) } }, pretty=True) with open(mainFile, 'w') as f: f.write(val) else: with open(mainFile, 'rb') as f: mainDict = xmltodict.parse(f)['credentials'] if mainDict is not None and not isinstance(mainDict['system'], list): mainDict['system'] = [mainDict['system']] return mainDict def general_setting_handler(self, request): json_file = self.navigator.get_katana_dir() + os.sep + 'config.json' if os.path.exists(self.navigator.get_warrior_dir() + os.sep + 'Tools' + os.sep + 'w_settings.xml'): w_settings = self.navigator.get_warrior_dir( ) + os.sep + 'Tools' + os.sep + 'w_settings.xml' else: w_settings = self.navigator.get_katana_dir( ) + os.sep + 'native' + os.sep + 'settings' + os.sep + 'Tools' + os.sep + 'w_settings.xml' elem_file = xml_controler.parse(w_settings) elem_file = elem_file.getroot() elem = self.search_by_name('def_dir', elem_file) def_dir_string = xml_controler.tostring(elem) def_dir_xml_obj = elem if request.method == 'POST': w_settings_data = { 'Setting': { 'Logsdir': '', 'Resultsdir': '', '@name': '' } } returned_json = json.loads(request.POST.get('data')) for k, v in list(w_settings_data['Setting'].items()): w_settings_data['Setting'][k] = returned_json[0][k] del returned_json[0][k] elem_file.remove(def_dir_xml_obj) val = xmltodict.unparse(w_settings_data, pretty=True) elem_file.insert(0, xml_controler.fromstring(val)) with open(w_settings, 'wb') as f: f.write(xml_controler.tostring(elem_file)) with open(json_file, 'w') as f: f.write( json.dumps(returned_json[0], indent=4, separators=(',', ': '))) else: with open(json_file, 'r') as f: json_data = json.load(f) if os.environ["pipmode"] == 'True': pythonsrcdir = read_json_data(json_file)['pythonsrcdir'] else: pythonsrcdir = self.navigator.get_warrior_dir() data = { 'fromXml': xmltodict.parse(def_dir_string).get('Setting'), 'fromJson': validate_config_json(json_data, self.navigator.get_warrior_dir()) } return data def profile_setting_handler(self, request): json_file = self.navigator.get_katana_dir( ) + os.sep + 'user_profile.json' config_json_file = self.navigator.get_katana_dir( ) + os.sep + 'config.json' if request.method == 'POST': data = json.loads(request.POST.get('data')) with open(json_file, 'w') as f: f.write( json.dumps(data[0], sort_keys=True, indent=4, separators=(',', ': '))) with open(config_json_file, 'r+') as a: new_json = json.load(a) new_json['engineer'] = data[0]['firstName'] a.seek(0) a.truncate() a.write( json.dumps(new_json, sort_keys=True, indent=4, separators=(',', ': '))) else: with open(json_file, 'r') as f: json_data = json.load(f) return json_data def search_by_name(self, name, file): for elem in file.findall('Setting'): if elem.get('name') == name: return elem def email_setting_handler(self, request): w_settings = self.navigator.get_katana_dir( ) + os.sep + 'native' + os.sep + 'settings' + os.sep + 'Tools' + os.sep + 'w_settings.xml' elem_file = xml_controler.parse(w_settings) elem_file = elem_file.getroot() elem = self.search_by_name('mail_to', elem_file) email_string = xml_controler.tostring(elem) email_xml_obj = elem if request.method == 'POST': elem_file.remove(email_xml_obj) val = xmltodict.unparse( {'Setting': json.loads(request.POST.get('data'))}, pretty=True) elem_file.append(xml_controler.fromstring(val)) with open(w_settings, 'w') as f: f.write(xml_controler.tostring(elem_file)) else: xmldoc = xmltodict.parse(email_string) return xmldoc def jira_setting_handler(self, request): jira_config = self.navigator.get_katana_dir( ) + os.sep + 'native' + os.sep + 'settings' + os.sep + 'Tools' + os.sep + 'jira' + os.sep + 'jira_config.xml' elem_file = xml_controler.parse(jira_config) elem_file = elem_file.getroot() xml_string = xml_controler.tostring(elem_file) if request.method == 'POST': val = xmltodict.unparse( {'jira': { 'system': json.loads(request.POST.get('data')) }}, pretty=True) with open(jira_config, 'w') as f: f.write(val) else: xmldoc = xmltodict.parse(xml_string) if xmldoc is not None and xmldoc['jira'] is not None: if not isinstance(xmldoc['jira']['system'], list): xmldoc['jira']['system'] = [xmldoc['jira']['system']] for system in xmldoc['jira']['system']: for k, v in list(system.items()): if k == 'issue_type': v = json.dumps(v) system[k] = v return xmldoc def secret_handler(self, request): keyDoc = self.navigator.get_katana_dir( ) + os.sep + 'native' + os.sep + 'settings' + os.sep + 'Tools' + os.sep + 'admin' + os.sep + 'secret.key' if request.method == 'POST': val = request.POST.get("data[0][value]") elem_file = open(keyDoc, 'w') elem_file.write(val) elem_file.close() else: elem_file = open(keyDoc, 'r') key_data = elem_file.read() elem_file.close() return key_data def prerequisites_handler(self, request): ref_file = join_path(self.static_dir, "base_templates", "empty.xml") prereqs = read_xml_get_json(ref_file)["data"]["warhorn"]["dependency"] prereq_data = [] for prereq in prereqs: temp = {} for key, value in list(prereq.items()): temp[key.strip('@')] = value temp["status"] = "install" try: module_name = __import__(temp["name"]) some_var = module_name.__version__ except ImportError: temp["available_version"] = "--" temp["installBtnText"] = "Install" except Exception as e: print( "-- An Exception Occurred -- while getting details about {0}: {1}" .format(temp["name"], e)) temp["available_version"] = "--" temp["installBtnText"] = "Install" else: temp["available_version"] = some_var if LooseVersion(str(temp["version"])) <= LooseVersion( str(temp["available_version"])): temp["installBtnText"] = "Installed" temp["status"] = "installed" else: temp["installBtnText"] = "Upgrade" temp["status"] = "upgrade" prereq_data.append(copy.deepcopy(temp)) return prereq_data def prereq_installation_handler(self, request): name = request.POST.get('name') admin = request.POST.get('admin') version = request.POST.get('version') status = False return_code = -9 command = ["pip", "install", "{0}=={1}".format(name, version)] if admin == "true": if not hasattr(sys, 'real_prefix'): command.insert(0, "sudo") else: command.append("--user") p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) kill = lambda process: process.kill() my_timer = Timer(10, kill, [p]) try: my_timer.start() out, err = p.communicate() return_code = p.returncode if return_code == 0: status = True finally: if return_code == -9: err = "Command could not be completed." out = "Command could not be completed in 30 seconds - may be the user is not authorized to install {0}".format( name) my_timer.cancel() return { "status": status, "return_code": return_code, "errors": err, "output": out }