mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-31 02:15:55 +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) |