mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2025-10-26 15:56:34 +01:00
351 lines
12 KiB
Python
351 lines
12 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
|
||
|
|
|
||
|
|
from django.shortcuts import HttpResponse, redirect
|
||
|
|
from loginSystem.views import loadLoginPage
|
||
|
|
from .containerManager import ContainerManager
|
||
|
|
import json
|
||
|
|
from websiteFunctions.models import Websites
|
||
|
|
from .models import ContainerLimits
|
||
|
|
from random import randint
|
||
|
|
from plogical.processUtilities import ProcessUtilities
|
||
|
|
import os
|
||
|
|
import subprocess
|
||
|
|
import multiprocessing
|
||
|
|
from plogical.httpProc import httpProc
|
||
|
|
from plogical.acl import ACLManager
|
||
|
|
# Create your views here.
|
||
|
|
|
||
|
|
def cHome(request):
|
||
|
|
try:
|
||
|
|
templateName = 'containerization/listWebsites.html'
|
||
|
|
c = ContainerManager(request, templateName)
|
||
|
|
return c.renderC()
|
||
|
|
except KeyError:
|
||
|
|
return redirect(loadLoginPage)
|
||
|
|
|
||
|
|
def submitContainerInstall(request):
|
||
|
|
try:
|
||
|
|
|
||
|
|
userID = request.session['userID']
|
||
|
|
currentACL = ACLManager.loadedACL(userID)
|
||
|
|
|
||
|
|
if currentACL['admin'] == 1:
|
||
|
|
pass
|
||
|
|
else:
|
||
|
|
return ACLManager.loadErrorJson()
|
||
|
|
|
||
|
|
c = ContainerManager(request, None, 'submitContainerInstall')
|
||
|
|
c.start()
|
||
|
|
|
||
|
|
data_ret = {'status': 1, 'error_message': 'None'}
|
||
|
|
json_data = json.dumps(data_ret)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
except BaseException as msg:
|
||
|
|
data_ret = {'status': 0, 'error_message': str(msg)}
|
||
|
|
json_data = json.dumps(data_ret)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
def websiteContainerLimit(request, domain):
|
||
|
|
try:
|
||
|
|
templateName = 'containerization/websiteContainerLimit.html'
|
||
|
|
data = {}
|
||
|
|
data['domain'] = domain
|
||
|
|
c = ContainerManager(request, templateName, None, data)
|
||
|
|
return c.renderC()
|
||
|
|
except KeyError:
|
||
|
|
return redirect(loadLoginPage)
|
||
|
|
|
||
|
|
def fetchWebsiteLimits(request):
|
||
|
|
try:
|
||
|
|
|
||
|
|
userID = request.session['userID']
|
||
|
|
currentACL = ACLManager.loadedACL(userID)
|
||
|
|
|
||
|
|
if currentACL['admin'] == 1:
|
||
|
|
pass
|
||
|
|
else:
|
||
|
|
return ACLManager.loadErrorJson()
|
||
|
|
|
||
|
|
data = json.loads(request.body)
|
||
|
|
domain = data['domain']
|
||
|
|
website = Websites.objects.get(domain=domain)
|
||
|
|
|
||
|
|
try:
|
||
|
|
websiteLimits = ContainerLimits.objects.get(owner=website)
|
||
|
|
except:
|
||
|
|
confPathTemp = "/home/cyberpanel/" + str(randint(1000, 9999))
|
||
|
|
confPath = '/etc/cgconfig.d/' + domain
|
||
|
|
count = ContainerLimits.objects.all().count() + 1
|
||
|
|
hexValue = ContainerManager.fetchHexValue(count)
|
||
|
|
cfs_quota_us = multiprocessing.cpu_count() * 10000
|
||
|
|
finalContent = ContainerManager.prepConf(website.externalApp, str(cfs_quota_us), str(100000), str(356), 1, 1024, hexValue)
|
||
|
|
|
||
|
|
if finalContent == 0:
|
||
|
|
return httpProc.AJAX(0, 'Please check CyberPanel main log file.')
|
||
|
|
|
||
|
|
|
||
|
|
writeToFile = open(confPathTemp, 'w')
|
||
|
|
writeToFile.write(finalContent)
|
||
|
|
writeToFile.close()
|
||
|
|
|
||
|
|
command = 'sudo mv ' + confPathTemp + ' ' + confPath
|
||
|
|
ProcessUtilities.executioner(command)
|
||
|
|
|
||
|
|
try:
|
||
|
|
os.remove(confPathTemp)
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
websiteLimits = ContainerLimits(owner=website, cpuPers='10', IO='1', IOPS='1024', memory='300', networkSpeed='1mbit', networkHexValue=hexValue)
|
||
|
|
websiteLimits.save()
|
||
|
|
|
||
|
|
finalData = {}
|
||
|
|
finalData['status'] = 1
|
||
|
|
finalData['cpuPers'] = int(websiteLimits.cpuPers)
|
||
|
|
finalData['IO'] = int(websiteLimits.IO)
|
||
|
|
finalData['IOPS'] = int(websiteLimits.IOPS)
|
||
|
|
finalData['memory'] = int(websiteLimits.memory)
|
||
|
|
finalData['networkSpeed'] = websiteLimits.networkSpeed
|
||
|
|
|
||
|
|
if websiteLimits.enforce == 1:
|
||
|
|
finalData['enforce'] = 1
|
||
|
|
else:
|
||
|
|
finalData['enforce'] = 0
|
||
|
|
|
||
|
|
json_data = json.dumps(finalData)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
except BaseException as msg:
|
||
|
|
data_ret = {'status': 0, 'error_message': str(msg)}
|
||
|
|
json_data = json.dumps(data_ret)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
def saveWebsiteLimits(request):
|
||
|
|
try:
|
||
|
|
|
||
|
|
userID = request.session['userID']
|
||
|
|
currentACL = ACLManager.loadedACL(userID)
|
||
|
|
|
||
|
|
if currentACL['admin'] == 1:
|
||
|
|
pass
|
||
|
|
else:
|
||
|
|
return ACLManager.loadErrorJson()
|
||
|
|
|
||
|
|
data = json.loads(request.body)
|
||
|
|
domain = data['domain']
|
||
|
|
cpuPers = data['cpuPers']
|
||
|
|
IO = data['IO']
|
||
|
|
IOPS = data['IOPS']
|
||
|
|
memory = data['memory']
|
||
|
|
networkSpeed = data['networkSpeed']
|
||
|
|
networkHandle = data['networkHandle']
|
||
|
|
|
||
|
|
try:
|
||
|
|
enforce = data['enforce']
|
||
|
|
except:
|
||
|
|
enforce = False
|
||
|
|
|
||
|
|
if cpuPers > 100:
|
||
|
|
return httpProc.AJAX(0, 'CPU Percentage can not be greater then 100%')
|
||
|
|
|
||
|
|
website = Websites.objects.get(domain=domain)
|
||
|
|
websiteLimits = ContainerLimits.objects.get(owner=website)
|
||
|
|
|
||
|
|
|
||
|
|
if enforce == True:
|
||
|
|
if websiteLimits.enforce == 0:
|
||
|
|
|
||
|
|
cgrulesTemp = "/home/cyberpanel/" + str(randint(1000, 9999))
|
||
|
|
cgrules = '/etc/cgrules.conf'
|
||
|
|
enforceString = '{} cpu,memory,blkio,net_cls {}/\n'.format(website.externalApp, website.externalApp)
|
||
|
|
|
||
|
|
cgrulesData = ProcessUtilities.outputExecutioner('sudo cat /etc/cgrules.conf').splitlines()
|
||
|
|
|
||
|
|
writeToFile = open(cgrulesTemp, 'w')
|
||
|
|
|
||
|
|
for items in cgrulesData:
|
||
|
|
writeToFile.writelines(items + '\n')
|
||
|
|
|
||
|
|
writeToFile.writelines(enforceString)
|
||
|
|
writeToFile.close()
|
||
|
|
|
||
|
|
command = 'sudo mv ' + cgrulesTemp + ' ' + cgrules
|
||
|
|
ProcessUtilities.executioner(command)
|
||
|
|
|
||
|
|
try:
|
||
|
|
os.remove(cgrulesTemp)
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
websiteLimits.enforce = 1
|
||
|
|
|
||
|
|
## Main Conf File
|
||
|
|
|
||
|
|
confPathTemp = "/home/cyberpanel/" + str(randint(1000, 9999))
|
||
|
|
confPath = '/etc/cgconfig.d/' + domain
|
||
|
|
cfs_quota_us = multiprocessing.cpu_count() * 1000
|
||
|
|
finalContent = ContainerManager.prepConf(website.externalApp, str(cpuPers * cfs_quota_us), str(100000),
|
||
|
|
str(memory), IO, IOPS, websiteLimits.networkHexValue)
|
||
|
|
|
||
|
|
if finalContent == 0:
|
||
|
|
return httpProc.AJAX(0, 'Please check CyberPanel main log file.')
|
||
|
|
|
||
|
|
writeToFile = open(confPathTemp, 'w')
|
||
|
|
writeToFile.write(finalContent)
|
||
|
|
writeToFile.close()
|
||
|
|
|
||
|
|
command = 'sudo mv ' + confPathTemp + ' ' + confPath
|
||
|
|
ProcessUtilities.executioner(command)
|
||
|
|
|
||
|
|
try:
|
||
|
|
os.remove(confPathTemp)
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
## Add Traffic Control / Restart Services
|
||
|
|
|
||
|
|
additionalArgs = {}
|
||
|
|
additionalArgs['classID'] = websiteLimits.id
|
||
|
|
additionalArgs['rateLimit'] = str(networkSpeed) + networkHandle
|
||
|
|
|
||
|
|
c = ContainerManager(None, None, 'addTrafficController', additionalArgs)
|
||
|
|
c.start()
|
||
|
|
else:
|
||
|
|
websiteLimits.enforce = 0
|
||
|
|
|
||
|
|
cgrulesTemp = "/home/cyberpanel/" + str(randint(1000, 9999))
|
||
|
|
cgrules = '/etc/cgrules.conf'
|
||
|
|
|
||
|
|
cgrulesData = ProcessUtilities.outputExecutioner('sudo cat /etc/cgrules.conf').splitlines()
|
||
|
|
|
||
|
|
writeToFile = open(cgrulesTemp, 'w')
|
||
|
|
|
||
|
|
for items in cgrulesData:
|
||
|
|
if items.find(website.externalApp) > -1:
|
||
|
|
continue
|
||
|
|
writeToFile.writelines(items + '\n')
|
||
|
|
|
||
|
|
writeToFile.close()
|
||
|
|
|
||
|
|
command = 'sudo mv ' + cgrulesTemp + ' ' + cgrules
|
||
|
|
ProcessUtilities.executioner(command)
|
||
|
|
|
||
|
|
confPath = '/etc/cgconfig.d/' + domain
|
||
|
|
|
||
|
|
command = 'sudo rm ' + confPath
|
||
|
|
ProcessUtilities.executioner(command)
|
||
|
|
|
||
|
|
## Not needed, to be removed later
|
||
|
|
|
||
|
|
additionalArgs = {}
|
||
|
|
additionalArgs['classID'] = websiteLimits.id
|
||
|
|
|
||
|
|
c = ContainerManager(None, None, 'removeLimits', additionalArgs)
|
||
|
|
c.start()
|
||
|
|
|
||
|
|
try:
|
||
|
|
os.remove(cgrulesTemp)
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
websiteLimits.cpuPers = str(cpuPers)
|
||
|
|
websiteLimits.memory = str(memory)
|
||
|
|
websiteLimits.IO = str(IO)
|
||
|
|
websiteLimits.IOPS = str(IOPS)
|
||
|
|
websiteLimits.networkSpeed = str(networkSpeed) + str(networkHandle)
|
||
|
|
websiteLimits.save()
|
||
|
|
|
||
|
|
finalData = {}
|
||
|
|
finalData['status'] = 1
|
||
|
|
json_data = json.dumps(finalData)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
except BaseException as msg:
|
||
|
|
data_ret = {'status': 0, 'error_message': str(msg)}
|
||
|
|
json_data = json.dumps(data_ret)
|
||
|
|
return HttpResponse(json_data)
|
||
|
|
|
||
|
|
def getUsageData(request):
|
||
|
|
try:
|
||
|
|
|
||
|
|
userID = request.session['userID']
|
||
|
|
currentACL = ACLManager.loadedACL(userID)
|
||
|
|
|
||
|
|
if currentACL['admin'] == 1:
|
||
|
|
pass
|
||
|
|
else:
|
||
|
|
return ACLManager.loadErrorJson()
|
||
|
|
|
||
|
|
data = json.loads(request.body)
|
||
|
|
domain = data['domain']
|
||
|
|
website = Websites.objects.get(domain=domain)
|
||
|
|
|
||
|
|
try:
|
||
|
|
type = data['type']
|
||
|
|
finalData = {}
|
||
|
|
finalData['status'] = 1
|
||
|
|
|
||
|
|
try:
|
||
|
|
if type == 'memory':
|
||
|
|
|
||
|
|
command = 'sudo cat /sys/fs/cgroup/memory/' + website.externalApp + '/memory.usage_in_bytes'
|
||
|
|
output = str(ProcessUtilities.outputExecutioner(command))
|
||
|
|
finalData['memory'] = int(float(output)/float(1024 * 1024))
|
||
|
|
|
||
|
|
elif type == 'io':
|
||
|
|
|
||
|
|
path = '/home/cyberpanel/' + website.externalApp
|
||
|
|
blkioPath = path + '/blkio'
|
||
|
|
|
||
|
|
if not os.path.exists(path):
|
||
|
|
os.mkdir(path)
|
||
|
|
|
||
|
|
command = 'sudo cat /sys/fs/cgroup/blkio/' + website.externalApp + '/blkio.throttle.io_service_bytes'
|
||
|
|
output = ProcessUtilities.outputExecutioner(command).splitlines()
|
||
|
|
|
||
|
|
readCurrent = output[0].split(' ')[2]
|
||
|
|
writeCurrent = output[1].split(' ')[2]
|
||
|
|
|
||
|
|
if os.path.exists(blkioPath):
|
||
|
|
|
||
|
|
old = open(blkioPath, 'r').read()
|
||
|
|
oldRead = float(old.split(',')[0])
|
||
|
|
oldWrite = float(old.split(',')[1])
|
||
|
|
|
||
|
|
finalData['readRate'] = int((float(readCurrent) - oldRead)/float(65536000))
|
||
|
|
finalData['writeRate'] = int((float(writeCurrent) - oldWrite) / float(65536000))
|
||
|
|
|
||
|
|
else:
|
||
|
|
finalData['readRate'] = 0
|
||
|
|
finalData['writeRate'] = 0
|
||
|
|
|
||
|
|
writeToFile = open(blkioPath, 'w')
|
||
|
|
writeToFile.write(readCurrent + ',' + writeCurrent)
|
||
|
|
writeToFile.close()
|
||
|
|
|
||
|
|
except:
|
||
|
|
finalData['memory'] = '0'
|
||
|
|
finalData['readRate'] = 0
|
||
|
|
finalData['writeRate'] = 0
|
||
|
|
except:
|
||
|
|
command = "top -b -n 1 -u " + website.externalApp + " | awk 'NR>7 { sum += $9; } END { print sum; }'"
|
||
|
|
output = str(subprocess.check_output(command, shell=True).decode("utf-8"))
|
||
|
|
|
||
|
|
finalData = {}
|
||
|
|
finalData['status'] = 1
|
||
|
|
if len(output) == 0:
|
||
|
|
finalData['cpu'] = '0'
|
||
|
|
else:
|
||
|
|
finalData['cpu'] = str(float(output)/float(multiprocessing.cpu_count()))
|
||
|
|
|
||
|
|
final_json = json.dumps(finalData)
|
||
|
|
return HttpResponse(final_json)
|
||
|
|
|
||
|
|
except BaseException as msg:
|
||
|
|
data_ret = {'status': 0, 'error_message': str(msg), 'cpu': 0, 'memory':0}
|
||
|
|
json_data = json.dumps(data_ret)
|
||
|
|
return HttpResponse(json_data)
|