Files
CyberPanel/plogical/mysqlUtilities.py
2019-01-01 20:16:54 +05:00

358 lines
11 KiB
Python

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)