import os,sys sys.path.append('/usr/local/CyberCP') import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() import CyberCPLogFileWriter as logging import subprocess import shlex from websiteFunctions.models import Websites from databases.models import Databases import MySQLdb as mysql import json from random import randint from plogical.processUtilities import ProcessUtilities class mysqlUtilities: @staticmethod def setupConnection(): try: passFile = "/etc/cyberpanel/mysqlPassword" f = open(passFile) data = f.read() password = data.split('\n', 1)[0] password = password.strip('\n').strip('\r') conn = mysql.connect(user='root', passwd=password) cursor = conn.cursor() return conn, cursor except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return 0, 0 @staticmethod def createDatabase(dbname,dbuser,dbpassword): try: connection, cursor = mysqlUtilities.setupConnection() if connection == 0: return 0 cursor.execute("CREATE DATABASE " + dbname) cursor.execute("CREATE USER '" +dbuser+ "'@'localhost' IDENTIFIED BY '"+dbpassword+"'") cursor.execute("GRANT ALL PRIVILEGES ON " +dbname+ ".* TO '" +dbuser+ "'@'localhost'") connection.close() return 1 except BaseException, msg: mysqlUtilities.deleteDatabase(dbname, dbuser) logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[createDatabase]") return 0 @staticmethod def deleteDatabase(dbname, dbuser): try: connection, cursor = mysqlUtilities.setupConnection() if connection == 0: return 0 cursor.execute("DROP DATABASE " + dbname) cursor.execute("DROP USER '"+dbuser+"'@'localhost'") connection.close() return 1 except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[deleteDatabase]") return str(msg) @staticmethod def createDatabaseBackup(databaseName,tempStoragePath): try: passFile = "/etc/cyberpanel/mysqlPassword" f = open(passFile) data = f.read() password = data.split('\n', 1)[0] command = 'sudo mysqldump -u root -p'+password+' '+databaseName cmd = shlex.split(command) with open(tempStoragePath+"/"+databaseName+'.sql', 'w') as f: res = subprocess.call(cmd,stdout=f) if res == 1: logging.CyberCPLogFileWriter.writeToFile("Database: "+databaseName + "could not be backed! [createDatabaseBackup]") return 0 return 1 except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[createDatabaseBackup]") return 0 @staticmethod def restoreDatabaseBackup(databaseName, tempStoragePath,dbPassword): try: passFile = "/etc/cyberpanel/mysqlPassword" f = open(passFile) data = f.read() password = data.split('\n', 1)[0] command = 'sudo mysql -u root -p' + password + ' ' + databaseName cmd = shlex.split(command) with open(tempStoragePath + "/" + databaseName + '.sql', 'r') as f: res = subprocess.call(cmd, stdin=f) if res == 1: logging.CyberCPLogFileWriter.writeToFile("Could not restore MYSQL database: " +databaseName +"! [restoreDatabaseBackup]") return 0 connection, cursor = mysqlUtilities.setupConnection() if connection == 0: return 0 passwordCMD = "use mysql;SET PASSWORD FOR '" + databaseName + "'@'localhost' = '" + dbPassword + "';FLUSH PRIVILEGES;" cursor.execute(passwordCMD) connection.close() return 1 except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[restoreDatabaseBackup]") @staticmethod def submitDBCreation(dbName, dbUsername, dbPassword, databaseWebsite): try: if len(dbName) > 16 or len(dbUsername) > 16: raise BaseException("Length of Database name or Database user should be 16 at max.") website = Websites.objects.get(domain=databaseWebsite) if website.package.dataBases == 0: pass elif website.package.dataBases > website.databases_set.all().count(): pass else: raise BaseException("Maximum database limit reached for this website.") if Databases.objects.filter(dbName=dbName).exists() or Databases.objects.filter(dbUser=dbUsername).exists(): raise BaseException("This database or user is already taken.") result = mysqlUtilities.createDatabase(dbName, dbUsername, dbPassword) if result == 1: pass else: raise BaseException(result) db = Databases(website=website, dbName=dbName, dbUser=dbUsername) db.save() return 1,'None' except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return 0,str(msg) @staticmethod def submitDBDeletion(dbName): try: databaseToBeDeleted = Databases.objects.get(dbName=dbName) result = mysqlUtilities.deleteDatabase(dbName, databaseToBeDeleted.dbUser) if result == 1: databaseToBeDeleted.delete() return 1,'None' else: return 0,result except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return 0, str(msg) @staticmethod def getDatabases(virtualHostName): try: website = Websites.objects.get(domain=virtualHostName) return website.databases_set.all() except: 0 @staticmethod def showStatus(): try: connection, cursor = mysqlUtilities.setupConnection() if connection == 0: return 0 cursor.execute("SHOW GLOBAL STATUS") result = cursor.fetchall() data = {} data['status'] = 1 for items in result: if items[0] == 'Uptime': data['uptime'] = mysqlUtilities.GetTime(items[1]) elif items[0] == 'Connections': data['connections'] = items[1] elif items[0] == 'Slow_queries': data['Slow_queries'] = items[1] ## Process List cursor.execute("show processlist") result = cursor.fetchall() json_data = "[" checker = 0 for items in result: if len(str(items[1])) == 0: database = 'NULL' else: database = items[1] if len(str(items[6])) == 0: state = 'NULL' else: state = items[6] if len(str(items[7])) == '': info = 'NULL' else: info = items[7] dic = { 'id': items[0], 'user': items[1], 'database': database, 'command': items[4], 'time': items[5], 'state': state, 'info': info, 'progress': items[8], } if checker == 0: json_data = json_data + json.dumps(dic) checker = 1 else: json_data = json_data + ',' + json.dumps(dic) json_data = json_data + ']' data['processes'] = json_data ## return data except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[showStatus]") return 0 @staticmethod def GetTime(seconds): time = float(seconds) day = time // (24 * 3600) time = time % (24 * 3600) hour = time // 3600 time %= 3600 minutes = time // 60 time %= 60 seconds = time return ("%d:%d:%d:%d" % (day, hour, minutes, seconds)) @staticmethod def applyMySQLChanges(data): try: if ProcessUtilities.decideDistro() == ProcessUtilities.centos: command = 'sudo mv /etc/my.cnf /etc/my.cnf.bak' else: command = 'sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak' ProcessUtilities.executioner(command) ## Temp tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) writeToFile = open(tempPath, 'w') writeToFile.write(data['suggestedContent']) writeToFile.close() ## if ProcessUtilities.decideDistro() == ProcessUtilities.centos: command = 'sudo mv ' + tempPath + ' /etc/my.cnf' else: command = 'sudo mv ' + tempPath + ' /etc/mysql/my.cnf' ProcessUtilities.executioner(command) return 1, None except BaseException, msg: if ProcessUtilities.decideDistro() == ProcessUtilities.centos: command = 'sudo mv /etc/my.cnf.bak /etc/my.cnf' else: command = 'sudo mv /etc/mysql/my.cnf.bak /etc/mysql//my.cnf' subprocess.call(shlex.split(command)) logging.CyberCPLogFileWriter.writeToFile(str(msg)) return 0, str(msg) @staticmethod def fetchVariables(): try: connection, cursor = mysqlUtilities.setupConnection() if connection == 0: return 0 cursor.execute("SHOW VARIABLES") result = cursor.fetchall() for items in result: logging.CyberCPLogFileWriter.writeToFile(str(items)) ## except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[showStatus]") return 0 @staticmethod def restartMySQL(): try: command = 'sudo systemctl restart mysql' ProcessUtilities.executioner(command) return 1, None except BaseException, msg: command = 'sudo mv /etc/my.cnf.bak /etc/my.cnf' subprocess.call(shlex.split(command)) logging.CyberCPLogFileWriter.writeToFile(str(msg)) return 0, str(msg)