Files
CyberPanel/databases/views.py

553 lines
16 KiB
Python
Raw Normal View History

2017-10-24 19:16:36 +05:00
# -*- coding: utf-8 -*-
2024-02-06 13:03:29 +05:00
import time
from random import randint
2017-10-24 19:16:36 +05:00
2019-03-26 16:19:03 +05:00
from django.shortcuts import redirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt
2023-12-18 12:45:28 +05:00
from cloudAPI.cloudManager import CloudManager
2017-10-24 19:16:36 +05:00
from loginSystem.views import loadLoginPage
2019-12-11 10:40:35 +05:00
from .databaseManager import DatabaseManager
2023-12-18 12:45:28 +05:00
from .mysqlOptimizer import MySQLOptimizer
2019-12-11 10:40:35 +05:00
from .pluginManager import pluginManager
2017-10-24 19:16:36 +05:00
import json
2019-03-26 16:19:03 +05:00
from plogical.processUtilities import ProcessUtilities
from loginSystem.models import Administrator
from plogical.acl import ACLManager
from databases.models import GlobalUserDB
from plogical import randomPassword
from cryptography.fernet import Fernet
from plogical.mysqlUtilities import mysqlUtilities
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
# Create your views here.
def loadDatabaseHome(request):
try:
2018-10-08 22:12:05 +05:00
userID = request.session['userID']
dm = DatabaseManager()
return dm.loadDatabaseHome(request, userID)
2017-10-24 19:16:36 +05:00
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def createDatabase(request):
try:
2018-10-08 22:12:05 +05:00
result = pluginManager.preCreateDatabase(request)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
userID = request.session['userID']
dm = DatabaseManager()
coreResult = dm.createDatabase(request, userID)
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.postCreateDatabase(request, coreResult)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
return coreResult
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def submitDBCreation(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.preSubmitDBCreation(request)
if result != 200:
return result
2018-08-18 00:39:10 +05:00
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
2018-10-12 18:18:10 +05:00
coreResult = dm.submitDBCreation(userID, json.loads(request.body))
2018-06-30 15:29:56 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.postSubmitDBCreation(request, coreResult)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
return coreResult
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
except KeyError:
return redirect(loadLoginPage)
2017-10-24 19:16:36 +05:00
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def deleteDatabase(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
return dm.deleteDatabase(request, userID)
2017-10-24 19:16:36 +05:00
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def fetchDatabases(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
return dm.fetchDatabases(userID, json.loads(request.body))
2017-10-24 19:16:36 +05:00
except KeyError:
2018-10-08 22:12:05 +05:00
return redirect(loadLoginPage)
2017-10-24 19:16:36 +05:00
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def submitDatabaseDeletion(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2018-10-08 22:12:05 +05:00
result = pluginManager.preSubmitDatabaseDeletion(request)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
coreResult = dm.submitDatabaseDeletion(userID, json.loads(request.body))
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.postSubmitDatabaseDeletion(request, coreResult)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
return coreResult
except KeyError:
return redirect(loadLoginPage)
2017-10-24 19:16:36 +05:00
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def listDBs(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
return dm.listDBs(request, userID)
2017-10-24 19:16:36 +05:00
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2017-10-24 19:16:36 +05:00
def changePassword(request):
try:
2018-08-18 00:39:10 +05:00
userID = request.session['userID']
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.preChangePassword(request)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
dm = DatabaseManager()
coreResult = dm.changePassword(userID, json.loads(request.body))
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
result = pluginManager.postChangePassword(request, coreResult)
if result != 200:
return result
2017-10-24 19:16:36 +05:00
2018-10-08 22:12:05 +05:00
return coreResult
except KeyError:
return redirect(loadLoginPage)
2019-03-26 16:19:03 +05:00
2023-12-18 12:45:28 +05:00
2020-07-16 22:30:29 +05:00
def remoteAccess(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
coreResult = dm.remoteAccess(userID, json.loads(request.body))
return coreResult
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2020-07-17 00:12:09 +05:00
def allowRemoteIP(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
coreResult = dm.allowRemoteIP(userID, json.loads(request.body))
return coreResult
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
2019-03-26 16:19:03 +05:00
def phpMyAdmin(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
return dm.phpMyAdmin(request, userID)
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
def generateAccess(request):
2019-03-26 16:19:03 +05:00
try:
userID = request.session['userID']
2023-12-18 12:45:28 +05:00
admin = Administrator.objects.get(id=userID)
currentACL = ACLManager.loadedACL(userID)
2019-03-26 16:19:03 +05:00
2020-10-12 20:12:23 +05:00
## if user ACL is admin login as root
command = 'chmod 640 /usr/local/lscp/cyberpanel/logs/access.log'
ProcessUtilities.executioner(command)
if currentACL['admin'] == 1:
try:
GlobalUserDB.objects.get(username=admin.userName).delete()
except:
try:
gbobs = GlobalUserDB.objects.filter(username=admin.userName)
for gbobs in gbobs:
gbobs.delete()
except:
pass
2020-10-12 20:12:23 +05:00
password = randomPassword.generate_pass()
token = randomPassword.generate_pass()
2023-12-18 12:45:28 +05:00
GlobalUserDB(username=admin.userName, password=password, token=token).save()
2020-10-12 20:12:23 +05:00
data_ret = {'status': 1, 'token': token, 'username': admin.userName}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
keySavePath = '/home/cyberpanel/phpmyadmin_%s' % (admin.userName)
try:
GlobalUserDB.objects.get(username=admin.userName).delete()
2020-08-09 12:45:18 +05:00
except:
pass
command = 'rm -f %s' % (keySavePath)
ProcessUtilities.executioner(command)
## Create and save new key
key = Fernet.generate_key()
writeToFile = open(keySavePath, 'w')
writeToFile.write(key.decode())
writeToFile.close()
command = 'chown root:root %s' % (keySavePath)
ProcessUtilities.executioner(command)
command = 'chmod 600 %s' % (keySavePath)
ProcessUtilities.executioner(command)
##
password = randomPassword.generate_pass()
token = randomPassword.generate_pass()
f = Fernet(key)
GlobalUserDB(username=admin.userName, password=f.encrypt(password.encode('utf-8')).decode(),
token=token).save()
sites = ACLManager.findWebsiteObjects(currentACL, userID)
2020-09-16 20:54:42 +05:00
mysqlUtilities.addUserToDB(None, admin.userName, password, 1)
for site in sites:
for db in site.databases_set.all():
mysqlUtilities.addUserToDB(db.dbName, admin.userName, password, 0)
2020-08-09 12:45:18 +05:00
data_ret = {'status': 1, 'token': token, 'username': admin.userName}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except BaseException as msg:
logging.writeToFile(str(msg))
2020-08-09 12:45:18 +05:00
data_ret = {'status': 0, 'createDBStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-03-26 16:19:03 +05:00
2024-02-06 13:03:29 +05:00
@csrf_exempt
2020-08-09 12:45:18 +05:00
def fetchDetailsPHPMYAdmin(request):
try:
userID = request.session['userID']
2023-12-18 12:45:28 +05:00
admin = Administrator.objects.get(id=userID)
2020-08-09 12:45:18 +05:00
currentACL = ACLManager.loadedACL(userID)
token = request.POST.get('token')
username = request.POST.get('username')
from plogical.httpProc import httpProc
proc = httpProc(request, None,
)
2024-02-06 13:03:29 +05:00
# return proc.ajax(0, str(request.POST.get('token')))
2020-08-09 12:45:18 +05:00
if username != admin.userName:
return redirect(loadLoginPage)
## Key generation
gdb = GlobalUserDB.objects.get(username=admin.userName)
if gdb.token == token:
2020-10-12 20:12:23 +05:00
if currentACL['admin'] == 1:
passFile = "/etc/cyberpanel/mysqlPassword"
try:
jsonData = json.loads(open(passFile, 'r').read())
mysqluser = jsonData['mysqluser']
password = jsonData['mysqlpassword']
# returnURL = '/phpmyadmin/phpmyadminsignin.php?username=%s&password=%s' % (
# mysqluser, password)
# return redirect(returnURL)
data = {}
data['userName'] = mysqluser
data['password'] = password
proc = httpProc(request, 'databases/AutoLogin.html',
data, 'admin')
return proc.render()
except BaseException as msg:
2020-10-12 20:12:23 +05:00
f = open(passFile)
data = f.read()
password = data.split('\n', 1)[0]
password = password.strip('\n').strip('\r')
data = {}
data['userName'] = 'root'
data['password'] = password
# return redirect(returnURL)
proc = httpProc(request, 'databases/AutoLogin.html',
data, 'admin')
return proc.render()
# returnURL = '/phpmyadmin/phpmyadminsignin.php?username=%s&password=%s' % (
# 'root', password)
# return redirect(returnURL)
2020-10-12 20:12:23 +05:00
2020-08-09 12:45:18 +05:00
keySavePath = '/home/cyberpanel/phpmyadmin_%s' % (admin.userName)
key = ProcessUtilities.outputExecutioner('cat %s' % (keySavePath)).strip('\n').encode()
f = Fernet(key)
password = f.decrypt(gdb.password.encode('utf-8'))
sites = ACLManager.findWebsiteObjects(currentACL, userID)
for site in sites:
for db in site.databases_set.all():
mysqlUtilities.addUserToDB(db.dbName, admin.userName, password.decode(), 0)
2020-08-09 12:45:18 +05:00
data = {}
data['userName'] = admin.userName
data['password'] = password.decode()
# return redirect(returnURL)
proc = httpProc(request, 'databases/AutoLogin.html',
2024-01-26 17:23:20 +05:00
data, 'listDatabases')
return proc.render()
# returnURL = '/phpmyadmin/phpmyadminsignin.php?username=%s&password=%s' % (admin.userName, password.decode())
# return redirect(returnURL)
2020-08-09 12:45:18 +05:00
else:
return redirect(loadLoginPage)
2019-03-26 16:19:03 +05:00
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-03-26 16:19:03 +05:00
data_ret = {'status': 0, 'createDBStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
2023-12-18 12:45:28 +05:00
return HttpResponse(json_data)
def MySQLManager(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
return dm.MySQLManager(request, userID)
except KeyError:
return redirect(loadLoginPage)
def OptimizeMySQL(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
return dm.OptimizeMySQL(request, userID)
except KeyError:
return redirect(loadLoginPage)
2024-02-06 13:03:29 +05:00
def UpgradeMySQL(request):
try:
userID = request.session['userID']
dm = DatabaseManager()
return dm.Upgardemysql(request, userID)
except KeyError:
return redirect(loadLoginPage)
2023-12-18 12:45:28 +05:00
def getMysqlstatus(request):
try:
userID = request.session['userID']
finalData = mysqlUtilities.showStatus()
2024-01-26 11:45:13 +05:00
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
2023-12-18 12:45:28 +05:00
finalData = json.dumps(finalData)
return HttpResponse(finalData)
except KeyError:
return redirect(loadLoginPage)
def restartMySQL(request):
try:
userID = request.session['userID']
2024-01-26 11:45:13 +05:00
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
2023-12-18 12:45:28 +05:00
data = {}
2024-11-12 11:34:56 +05:00
finalData = mysqlUtilities.restartMySQL()
2023-12-18 12:45:28 +05:00
data['status'] = finalData[0]
data['error_message'] = finalData[1]
json_data = json.dumps(data)
return HttpResponse(json_data)
except KeyError:
return redirect(loadLoginPage)
def generateRecommendations(request):
try:
userID = request.session['userID']
2024-01-26 11:45:13 +05:00
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
2023-12-18 12:45:28 +05:00
data = json.loads(request.body)
detectedRam = data['detectedRam']
data = {}
data['status'] = 1
data['generatedConf'] = MySQLOptimizer.generateRecommendations(detectedRam)
final_json = json.dumps(data)
return HttpResponse(final_json)
except KeyError:
return redirect(loadLoginPage)
def applyMySQLChanges(request):
try:
2024-01-26 11:45:13 +05:00
2023-12-18 12:45:28 +05:00
userID = request.session['userID']
2024-01-26 11:45:13 +05:00
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
2023-12-18 12:45:28 +05:00
data = json.loads(request.body)
finalData = mysqlUtilities.applyMySQLChanges(data)
data = {}
data['status'] = finalData[0]
data['error_message'] = finalData[1]
final_json = json.dumps(data)
return HttpResponse(final_json)
except KeyError:
return redirect(loadLoginPage)
2024-02-06 13:03:29 +05:00
def upgrademysqlnow(request):
try:
from plogical.virtualHostUtilities import virtualHostUtilities
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
data = json.loads(request.body)
version =data['mysqlversion']
tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999))
execPath = f"/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/mysqlUtilities.py UpgradeMariaDB --version {version} --tempStatusPath {tempStatusPath}"
ProcessUtilities.popenExecutioner(execPath)
time.sleep(2)
data_ret = {'status': 1, 'error_message': "None",
'tempStatusPath': tempStatusPath}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except KeyError:
return redirect(loadLoginPage)
2024-02-07 13:36:29 +05:00
def upgrademysqlstatus(request):
try:
2024-10-23 11:32:23 +04:00
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
pass
else:
return ACLManager.loadErrorJson('FilemanagerAdmin', 0)
2024-02-07 13:36:29 +05:00
data = json.loads(request.body)
statusfile = data['statusfile']
installStatus = ProcessUtilities.outputExecutioner("sudo cat " + statusfile)
if installStatus.find("[200]") > -1:
command = 'sudo rm -f ' + statusfile
ProcessUtilities.executioner(command)
final_json = json.dumps({
'error_message': "None",
'requestStatus': installStatus,
'abort': 1,
'installed': 1,
})
return HttpResponse(final_json)
elif installStatus.find("[404]") > -1:
command = 'sudo rm -f ' + statusfile
ProcessUtilities.executioner(command)
final_json = json.dumps({
'abort': 1,
'installed': 0,
'error_message': "None",
'requestStatus': installStatus,
})
return HttpResponse(final_json)
else:
final_json = json.dumps({
'abort': 0,
'error_message': "None",
'requestStatus': installStatus,
})
return HttpResponse(final_json)
except KeyError:
return redirect(loadLoginPage)