HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: xnsbb3110 (1041)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //proc/self/root/proc/self/root/usr/local/CyberCP/containerization/views.py
# -*- 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)