From a5b9a689556f8a80638735234419c90b51bc12b2 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 1 Apr 2021 11:47:47 +0500 Subject: [PATCH] bug fix: cm --- cloudAPI/cloudManager.py | 106 ++++++++++++++++++++- cloudAPI/views.py | 19 +++- plogical/ClusterManager.py | 184 +++++++++++++++++++++++++------------ 3 files changed, 246 insertions(+), 63 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index e33cc2cac..b27393e05 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1,3 +1,4 @@ +import sys import userManagment.views as um from backup.backupManager import BackupManager from databases.databaseManager import DatabaseManager @@ -21,7 +22,8 @@ from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from managePHP.phpManager import PHPManager from managePHP.views import submitExtensionRequest, getRequestStatusApache from containerization.views import * - +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") class CloudManager: def __init__(self, data=None, admin=None): @@ -2683,7 +2685,7 @@ class CloudManager: type = self.data['type'] execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/ClusterManager.py --function %s --type %s" % ('DetachCluster', type) - ProcessUtilities.popenExecutioner(execPath) + ProcessUtilities.executioner(execPath) final_json = json.dumps({'status': 1}) return HttpResponse(final_json) @@ -2701,9 +2703,103 @@ class CloudManager: writeToFile.write(json.dumps(self.data)) writeToFile.close() - execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/ClusterManager.py --function %s --type %s" % ( - 'SetupCluster', self.data['type']) - ProcessUtilities.popenExecutioner(execPath) + execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/ClusterManager.py --function SetupCluster --type %s" % (self.data['type']) + ProcessUtilities.executioner(execPath) + + final_json = json.dumps({'status': 1}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def FetchMasterBootStrapStatus(self): + try: + from CyberCP import settings + + data = {} + data['status'] = 1 + + ## CyberPanel DB Creds + data['dbName'] = settings.DATABASES['default']['NAME'] + data['dbUser'] = settings.DATABASES['default']['USER'] + data['password'] = settings.DATABASES['default']['PASSWORD'] + data['host'] = settings.DATABASES['default']['HOST'] + data['port'] = settings.DATABASES['default']['PORT'] + + ## Root DB Creds + + data['rootdbName'] = settings.DATABASES['rootdb']['NAME'] + data['rootdbdbUser'] = settings.DATABASES['rootdb']['USER'] + data['rootdbpassword'] = settings.DATABASES['rootdb']['PASSWORD'] + + command = 'cat /var/lib/mysql/grastate.dat' + output = ProcessUtilities.outputExecutioner(command) + + if output.find('No such file or directory') > -1: + data['safe'] = 1 + elif output.find('safe_to_bootstrap: 1') > -1: + data['safe'] = 1 + else: + data['safe'] = 0 + + final_json = json.dumps(data) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def FetchChildBootStrapStatus(self): + try: + + data = {} + data['status'] = 1 + + command = 'cat /var/lib/mysql/grastate.dat' + output = ProcessUtilities.outputExecutioner(command) + + if output.find('No such file or directory') > -1: + data['safe'] = 1 + elif output.find('safe_to_bootstrap: 0') > -1: + data['safe'] = 1 + else: + data['safe'] = 0 + + final_json = json.dumps(data) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def BootMaster(self): + try: + + execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/ClusterManager.py --function BootMaster --type Master" + ProcessUtilities.executioner(execPath) + + final_json = json.dumps({'status': 1}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def BootChild(self): + try: + + ChildData = '/home/cyberpanel/childaata' + writeToFile = open(ChildData, 'w') + writeToFile.write(json.dumps(self.data)) + writeToFile.close() + + execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/ClusterManager.py --function BootChild --type Child" + ProcessUtilities.executioner(execPath) final_json = json.dumps({'status': 1}) return HttpResponse(final_json) diff --git a/cloudAPI/views.py b/cloudAPI/views.py index c7c47fb7c..97c53dc62 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- - from .cloudManager import CloudManager import json from loginSystem.models import Administrator @@ -33,12 +32,30 @@ def router(request): else: return cm.verifyLogin(request)[1] + ## Debug Log + + import os + from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging + from plogical.processUtilities import ProcessUtilities + if os.path.exists(ProcessUtilities.debugPath): + logging.writeToFile('Current controller: %s' % (controller)) + + ## + if controller == 'verifyLogin': return cm.verifyLogin(request)[1] elif controller == 'RunServerLevelEmailChecks': return cm.RunServerLevelEmailChecks() elif controller == 'DetachCluster': return cm.DetachCluster() + elif controller == 'FetchMasterBootStrapStatus': + return cm.FetchMasterBootStrapStatus() + elif controller == 'FetchChildBootStrapStatus': + return cm.FetchChildBootStrapStatus() + elif controller == 'BootMaster': + return cm.BootMaster() + elif controller == 'BootChild': + return cm.BootChild() elif controller == 'SetupCluster': return cm.SetupCluster() elif controller == 'ReadReport': diff --git a/plogical/ClusterManager.py b/plogical/ClusterManager.py index a9b75441b..e89e986ca 100644 --- a/plogical/ClusterManager.py +++ b/plogical/ClusterManager.py @@ -6,13 +6,14 @@ import requests sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") from plogical.processUtilities import ProcessUtilities +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging class ClusterManager: - LogURL = "http://cloud.cyberpanel.net:8000/HighAvailability/RecvData" + LogURL = "http://de-a.cyberhosting.org:8000/HighAvailability/RecvData" ClusterFile = '/home/cyberpanel/cluster' - def __init__(self): + def __init__(self, type): ## ipFile = "/etc/cyberpanel/machineIP" f = open(ipFile) @@ -20,15 +21,15 @@ class ClusterManager: self.ipAddress = ipData.split('\n', 1)[0] ## self.config = json.loads(open(ClusterManager.ClusterFile, 'r').read()) + self.type = type - def PostStatus(self): - import os - if os.path.exists(ProcessUtilities.debugPath): - from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging - logging.writeToFile(str(self.config)) - finalData = json.dumps(self.config) - resp = requests.post(ClusterManager.LogURL, data=finalData, verify=False) - print (resp.text) + def PostStatus(self, message): + try: + finalData = {'name': self.config['name'], 'type': self.type, 'message': message, 'token': self.config['token']} + resp = requests.post(ClusterManager.LogURL, data=json.dumps(finalData), verify=False) + logging.writeToFile(resp.text + '[info]') + except BaseException as msg: + logging.writeToFile('%s. [31:404]' % (str(msg))) def FetchMySQLConfigFile(self): @@ -37,81 +38,146 @@ class ClusterManager: else: return '/etc/mysql/conf.d/cluster.cnf' - def DetechFromCluster(self, type): + def DetechFromCluster(self): try: command = 'rm -rf %s' % (self.FetchMySQLConfigFile()) ProcessUtilities.normalExecutioner(command) command = 'systemctl stop mysql' - ProcessUtilities.normalExecutioner(command) + #ProcessUtilities.normalExecutioner(command) command = 'systemctl restart mysql' - ProcessUtilities.executioner(command) + #ProcessUtilities.executioner(command) - if type == 'Child': - self.config['failoverServerMessage'] = 'Successfully detached. [200]' - self.PostStatus() - else: - self.config['masterServerMessage'] = 'Successfully detached. [200]' - self.PostStatus() + self.PostStatus('Successfully detached. [200]') except BaseException as msg: - if type == 'Child': - self.config['failoverServerMessage'] = 'Failed to detach, error %s [404].' % (str(msg)) - self.PostStatus() - else: - self.config['masterServerMessage'] = 'Failed to detach, error %s [404].' % (str(msg)) - self.PostStatus() + self.PostStatus('Failed to detach, error %s [404].' % (str(msg))) - def SetupCluster(self, type): + def SetupCluster(self): try: ClusterPath = self.FetchMySQLConfigFile() ClusterConfigPath = '/home/cyberpanel/cluster' config = json.loads(open(ClusterConfigPath, 'r').read()) - command = 'systemctl stop mysql' - ProcessUtilities.normalExecutioner(command) - - command = 'rm -rf %s' % (ClusterConfigPath) - ProcessUtilities.executioner(command) - - if type == 'Child': - + if self.type == 'Child': writeToFile = open(ClusterPath, 'w') writeToFile.write(config['ClusterConfigFailover']) writeToFile.close() - - command = 'systemctl start mysql' - ProcessUtilities.normalExecutioner(command) - - self.config['failoverServerMessage'] = 'Successfully attached to cluster. [200]' - self.PostStatus() - else: writeToFile = open(ClusterPath, 'w') writeToFile.write(config['ClusterConfigMaster']) writeToFile.close() - command = 'galera_new_cluster' - ProcessUtilities.normalExecutioner(command) - - self.config['masterServerMessage'] = 'Successfully attached to cluster. [200]' - self.PostStatus() + self.PostStatus('Successfully attached to cluster. [200]') ### - command = 'rm -rf %s' % (ClusterConfigPath) - ProcessUtilities.executioner(command) + except BaseException as msg: + self.PostStatus('Failed to attach, error %s [404].' % (str(msg))) + + def BootMaster(self): + try: + + command = 'systemctl stop mysql' + ProcessUtilities.normalExecutioner(command) + + command = 'galera_new_cluster' + ProcessUtilities.normalExecutioner(command) + + self.PostStatus('Master server successfully booted. [200]') + + ### except BaseException as msg: - if type == 'Child': - self.config['failoverServerMessage'] = 'Failed to attach, error %s [404].' % (str(msg)) - self.PostStatus() - else: - self.config['masterServerMessage'] = 'Failed to attach, error %s [404].' % (str(msg)) - self.PostStatus() + self.PostStatus('Failed to boot, error %s [404].' % (str(msg))) + + def BootChild(self): + try: + + ChildData = '/home/cyberpanel/childaata' + data = json.loads(open(ChildData, 'r').read()) + + ## CyberPanel DB Creds + + ## Update settings file using the data fetched from master + + + dbName = data['dbName'] + dbUser = data['dbUser'] + password = data['password'] + host = data['host'] + port = data['port'] + + ## Root DB Creds + + rootdbName = data['rootdbName'] + rootdbdbUser = data['rootdbdbUser'] + rootdbpassword = data['rootdbpassword'] + + completDBString = """\nDATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': '%s', + 'USER': '%s', + 'PASSWORD': '%s', + 'HOST': '%s', + 'PORT':'%s' + }, + 'rootdb': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': '%s', + 'USER': '%s', + 'PASSWORD': '%s', + 'HOST': '%s', + 'PORT': '%s', + }, +}\n""" % (dbName, dbUser, password, host, port, rootdbName, rootdbdbUser, rootdbpassword, host, port) + + settingsFile = '/usr/local/CyberCP/CyberCP/settings.py' + + settingsData = open(settingsFile, 'r').readlines() + + DATABASESCHECK = 0 + writeToFile = open(settingsFile, 'w') + + for items in settingsData: + if items.find('DATABASES = {') > -1: + DATABASESCHECK = 1 + + if DATABASESCHECK == 0: + writeToFile.write(items) + + if items.find('DATABASE_ROUTERS = [') > -1: + DATABASESCHECK = 0 + writeToFile.write(completDBString) + writeToFile.write(items) + + writeToFile.close() + + + + ## new settings file restored + + command = 'systemctl stop mysql' + ProcessUtilities.normalExecutioner(command) + + command = 'systemctl start mysql' + ProcessUtilities.normalExecutioner(command) + + ## Restart lscpd + + command = 'systemctl restart lscpd' + ProcessUtilities.normalExecutioner(command) + + self.PostStatus('Fail over server successfully booted. [200]') + + ### + + except BaseException as msg: + self.PostStatus('Failed to boot, error %s [404].' % (str(msg))) def main(): @@ -121,12 +187,16 @@ def main(): args = parser.parse_args() - uc = ClusterManager() + uc = ClusterManager(args.type) if args.function == 'DetachCluster': - uc.DetechFromCluster(args.type) + uc.DetechFromCluster() elif args.function == 'SetupCluster': - uc.SetupCluster(args.type) + uc.SetupCluster() + elif args.function == 'BootMaster': + uc.BootMaster() + elif args.function == 'BootChild': + uc.BootChild() if __name__ == "__main__":