diff --git a/dockerManager/container.py b/dockerManager/container.py index a253ac68d..71ddacc26 100755 --- a/dockerManager/container.py +++ b/dockerManager/container.py @@ -3,6 +3,9 @@ import os.path import sys import django + +from plogical.DockerSites import Docker_Sites + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -1076,4 +1079,135 @@ class ContainerManager(multi.Thread): except BaseException as msg: data_ret = {'getTagsStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + def getDockersiteList(self, userID=None, data=None): + try: + admin = Administrator.objects.get(pk=userID) + + if admin.acl.adminStatus != 1: + return ACLManager.loadError() + + + name = data['name'] + + passdata = {} + passdata["JobID"] = None + passdata['name'] = name + da = Docker_Sites(None, passdata) + retdata = da.ListContainers() + + + data_ret = {'status': 1, 'error_message': 'None', 'data':retdata} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'removeImageStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + # Internal function for recreating containers + + def getContainerAppinfo(self, userID=None, data=None): + try: + admin = Administrator.objects.get(pk=userID) + + if admin.acl.adminStatus != 1: + return ACLManager.loadError() + + + name = data['name'] + containerID = data['id'] + + passdata = {} + passdata["JobID"] = None + passdata['name'] = name + passdata['containerID'] = containerID + da = Docker_Sites(None, passdata) + retdata = da.ContainerInfo() + + + data_ret = {'status': 1, 'error_message': 'None', 'data':retdata} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'removeImageStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + def getContainerApplog(self, userID=None, data=None): + try: + admin = Administrator.objects.get(pk=userID) + + if admin.acl.adminStatus != 1: + return ACLManager.loadError() + + + name = data['name'] + containerID = data['id'] + + passdata = {} + passdata["JobID"] = None + passdata['name'] = name + passdata['containerID'] = containerID + passdata['numberOfLines'] = 50 + da = Docker_Sites(None, passdata) + retdata = da.ContainerLogs() + + + data_ret = {'status': 1, 'error_message': 'None', 'data':retdata} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'removeImageStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + def recreateappcontainer(self, userID=None, data=None): + try: + from websiteFunctions.models import DockerSites + admin = Administrator.objects.get(pk=userID) + + if admin.acl.adminStatus != 1: + return ACLManager.loadError() + + + name = data['name'] + WPusername = data['WPusername'] + WPemail = data['WPemail'] + WPpasswd = data['WPpasswd'] + + dockersite = DockerSites.objects.get(SiteName=name) + + passdata ={} + data['JobID'] = '' + data['Domain'] = dockersite.admin.domain + data['domain'] = dockersite.admin.domain + data['WPemal'] = WPemail + data['Owner'] = dockersite.admin.admin.userName + data['userID'] = userID + data['MysqlCPU'] = dockersite.CPUsMySQL + data['MYsqlRam'] = dockersite.MemoryMySQL + data['SiteCPU'] = dockersite.CPUsSite + data['SiteRam'] = dockersite.MemorySite + data['sitename'] = dockersite.SiteName + data['WPusername'] = WPusername + data['WPpasswd'] = WPpasswd + data['externalApp'] = dockersite.admin.externalApp + + da = Docker_Sites(None, passdata) + da.RebuildApp() + + + data_ret = {'status': 1, 'error_message': 'None',} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'removeImageStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) return HttpResponse(json_data) \ No newline at end of file diff --git a/dockerManager/urls.py b/dockerManager/urls.py index bf1bf02a5..bd0a9fce9 100755 --- a/dockerManager/urls.py +++ b/dockerManager/urls.py @@ -31,4 +31,8 @@ urlpatterns = [ url(r'^view/(?P(.*))$', views.viewContainer, name='viewContainer'), path('manage//app', Dockersitehome, name='Dockersitehome'), + path('getDockersiteList', views.getDockersiteList, name='getDockersiteList'), + path('getContainerAppinfo', views.getContainerAppinfo, name='getContainerAppinfo'), + path('getContainerApplog', views.getContainerApplog, name='getContainerApplog'), + path('recreateappcontainer', views.recreateappcontainer, name='recreateappcontainer'), ] \ No newline at end of file diff --git a/dockerManager/views.py b/dockerManager/views.py index f2f3259d1..f2e2e50b6 100755 --- a/dockerManager/views.py +++ b/dockerManager/views.py @@ -4,6 +4,7 @@ from django.shortcuts import redirect, HttpResponse from loginSystem.models import Administrator from loginSystem.views import loadLoginPage +from plogical.DockerSites import Docker_Sites from plogical.httpProc import httpProc from .container import ContainerManager from .decorators import preDockerRun @@ -17,7 +18,7 @@ import json def dockerPermission(request, userID, context): currentACL = ACLManager.loadedACL(userID) - + if currentACL['admin'] != 1: if request.method == "POST": return ACLManager.loadErrorJson() @@ -25,7 +26,7 @@ def dockerPermission(request, userID, context): return ACLManager.loadError() else: return 0 - + @preDockerRun def loadDockerHome(request): userID = request.session['userID'] @@ -57,7 +58,7 @@ def installDocker(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) -@preDockerRun +@preDockerRun def installImage(request): try: userID = request.session['userID'] @@ -75,7 +76,7 @@ def installImage(request): except KeyError: return redirect(loadLoginPage) - + @preDockerRun def viewContainer(request, name): try: @@ -97,10 +98,10 @@ def viewContainer(request, name): return coreResult except KeyError: - return redirect(loadLoginPage) + return redirect(loadLoginPage) @preDockerRun -def getTags(request): +def getTags(request): try: userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) @@ -117,9 +118,9 @@ def getTags(request): except KeyError: return redirect(loadLoginPage) - + @preDockerRun -def delContainer(request): +def delContainer(request): try: userID = request.session['userID'] @@ -137,9 +138,9 @@ def delContainer(request): except KeyError: return redirect(loadLoginPage) - -@preDockerRun -def recreateContainer(request): + +@preDockerRun +def recreateContainer(request): try: userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) @@ -155,9 +156,9 @@ def recreateContainer(request): return coreResult except KeyError: - return redirect(loadLoginPage) - -@preDockerRun + return redirect(loadLoginPage) + +@preDockerRun def runContainer(request): try: userID = request.session['userID'] @@ -167,13 +168,13 @@ def runContainer(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() return cm.createContainer(request, userID) except KeyError: - return redirect(loadLoginPage) + return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def listContainers(request): try: userID = request.session['userID'] @@ -182,7 +183,7 @@ def listContainers(request): except KeyError: return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def getContainerLogs(request): try: @@ -199,9 +200,9 @@ def getContainerLogs(request): return coreResult except KeyError: - return redirect(loadLoginPage) + return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def submitContainerCreation(request): try: @@ -221,7 +222,7 @@ def submitContainerCreation(request): except KeyError: return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def getContainerList(request): try: userID = request.session['userID'] @@ -231,13 +232,13 @@ def getContainerList(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() return cm.getContainerList(userID, json.loads(request.body)) except KeyError: return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def doContainerAction(request): try: userID = request.session['userID'] @@ -247,15 +248,15 @@ def doContainerAction(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.doContainerAction(userID, json.loads(request.body)) - + return coreResult except KeyError: return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def getContainerStatus(request): try: userID = request.session['userID'] @@ -265,15 +266,15 @@ def getContainerStatus(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.getContainerStatus(userID, json.loads(request.body)) - + return coreResult except KeyError: - return redirect(loadLoginPage) + return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def exportContainer(request): try: userID = request.session['userID'] @@ -283,15 +284,15 @@ def exportContainer(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.exportContainer(request, userID) - + return coreResult except KeyError: - return redirect(loadLoginPage) - -@preDockerRun + return redirect(loadLoginPage) + +@preDockerRun def saveContainerSettings(request): try: userID = request.session['userID'] @@ -301,15 +302,15 @@ def saveContainerSettings(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.saveContainerSettings(userID, json.loads(request.body)) - + return coreResult except KeyError: - return redirect(loadLoginPage) - -@preDockerRun + return redirect(loadLoginPage) + +@preDockerRun def getContainerTop(request): try: userID = request.session['userID'] @@ -319,15 +320,15 @@ def getContainerTop(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.getContainerTop(userID, json.loads(request.body)) - + return coreResult except KeyError: return redirect(loadLoginPage) -@preDockerRun +@preDockerRun def assignContainer(request): try: userID = request.session['userID'] @@ -337,15 +338,15 @@ def assignContainer(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.assignContainer(userID, json.loads(request.body)) - + return coreResult except KeyError: return redirect(loadLoginPage) - -@preDockerRun + +@preDockerRun def searchImage(request): try: userID = request.session['userID'] @@ -355,27 +356,27 @@ def searchImage(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.searchImage(userID, json.loads(request.body)) - + return coreResult except KeyError: return redirect(loadLoginPage) - -@preDockerRun + +@preDockerRun def images(request): try: userID = request.session['userID'] cm = ContainerManager() coreResult = cm.images(request, userID) - + return coreResult except KeyError: return redirect(loadLoginPage) - -@preDockerRun + +@preDockerRun def manageImages(request): try: userID = request.session['userID'] @@ -384,8 +385,8 @@ def manageImages(request): return coreResult except KeyError: return redirect(loadLoginPage) - -@preDockerRun + +@preDockerRun def getImageHistory(request): try: userID = request.session['userID'] @@ -395,15 +396,15 @@ def getImageHistory(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.getImageHistory(userID, json.loads(request.body)) - + return coreResult except KeyError: return redirect(loadLoginPage) - -@preDockerRun + +@preDockerRun def removeImage(request): try: userID = request.session['userID'] @@ -413,10 +414,86 @@ def removeImage(request): pass else: return ACLManager.loadErrorJson() - + cm = ContainerManager() coreResult = cm.removeImage(userID, json.loads(request.body)) - + return coreResult except KeyError: - return redirect(loadLoginPage) \ No newline at end of file + return redirect(loadLoginPage) +@preDockerRun +def getDockersiteList(request): + import json + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + cm = ContainerManager() + coreResult = cm.getDockersiteList(userID, json.loads(request.body)) + + return coreResult + except KeyError: + return redirect(loadLoginPage) + + + +@preDockerRun +def getContainerAppinfo(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + cm = ContainerManager() + coreResult = cm.getContainerAppinfo(userID, json.loads(request.body)) + + return coreResult + except KeyError: + return redirect(loadLoginPage) + + +@preDockerRun +def getContainerApplog(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + cm = ContainerManager() + coreResult = cm.getContainerApplog(userID, json.loads(request.body)) + + return coreResult + except KeyError: + return redirect(loadLoginPage) + + +@preDockerRun +def recreateappcontainer(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + cm = ContainerManager() + coreResult = cm.recreateappcontainer(userID, json.loads(request.body)) + + return coreResult + except KeyError: + return redirect(loadLoginPage) \ No newline at end of file diff --git a/websiteFunctions/static/websiteFunctions/websiteFunctions.js b/websiteFunctions/static/websiteFunctions/websiteFunctions.js index df845305f..be8f2182f 100755 --- a/websiteFunctions/static/websiteFunctions/websiteFunctions.js +++ b/websiteFunctions/static/websiteFunctions/websiteFunctions.js @@ -10196,7 +10196,7 @@ app.controller('AssignPackage', function ($scope, $http,) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - new PNotify({ + new PNotify({ title: 'Success', text: 'Successfully saved.', type: 'success' @@ -10223,7 +10223,7 @@ app.controller('AssignPackage', function ($scope, $http,) { } } - var FinalDeletepackageURL; + var FinalDeletepackageURL; $scope.Deleteassingment = function (url) { FinalDeletepackageURL = url; // console.log(FinalDeletepackageURL); @@ -10234,9 +10234,9 @@ app.controller('AssignPackage', function ($scope, $http,) { } }) -app.controller('createDockerSite', function ($scope, $http,$timeout) { +app.controller('createDockerSite', function ($scope, $http, $timeout) { $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = false; + $scope.installationDetailsForm = false; $scope.installationProgress = true; $scope.errorMessageBox = true; $scope.success = true; @@ -10258,15 +10258,11 @@ app.controller('createDockerSite', function ($scope, $http,$timeout) { $scope.currentStatus = "Starting creation.."; - - url = "/websites/submitDockerSiteCreation"; var package = $scope.packageForWebsite; - - var data = { sitename: $scope.siteName, Owner: $scope.userSelection, @@ -10523,10 +10519,10 @@ app.controller('listDockersite', function ($scope, $http) { }; var deletedockersiteurl; - $scope.DeleteDockersite = function (url, id){ + $scope.DeleteDockersite = function (url, id) { // console.log(url) // console.log(id) - deletedockersiteurl= url+id; + deletedockersiteurl = url + id; } $scope.ConfirmDelete = function () { @@ -10534,4 +10530,343 @@ app.controller('listDockersite', function ($scope, $http) { } -}); \ No newline at end of file +}); + +app.controller('ListDockersitecontainer', function ($scope, $http) { + $scope.conatinerview = true + $scope.cyberPanelLoading = true; + $scope.getcontainer = function () { + url = "/docker/getDockersiteList"; + + var data = {'name': $('#sitename').html()}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + + if (response.data.status === 1) { + + var finalData = JSON.parse(response.data.data[1]); + + $scope.ContainerList = finalData; + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + + + } + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + } + + $scope.getcontainer() + + $scope.Lunchcontainer = function (containerid) { + // $scope.listcontainerview = true + var url = "/docker/getContainerAppinfo"; + + var data = { + 'name': $('#sitename').html(), + 'id': containerid + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.conatinerview = false + // console.log(response); + + if (response.data.status === 1) { + console.log(response.data.data); + $scope.cid = response.data.data[1].id + $scope.appcpuUsage = 5 + $scope.appmemoryUsage = 9 + $scope.cName = response.data.data[1].name + $scope.port = response.data.data[1].name + $scope.getcontainerlog(containerid) + } else { + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + } + + + $scope.getcontainerlog = function (containerid) { + // $scope.listcontainerview = true + + var url = "/docker/getContainerApplog"; + + var data = { + 'name': $('#sitename').html(), + 'id': containerid + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.conatinerview = false + $scope.logs = response.data.data[1]; + + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Container info fetched.', + type: 'success' + }); + } else { + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + } + + + $scope.recreateappcontainer = function () { + $scope.cyberPanelLoading = false; + var url = "/docker/recreateappcontainer"; + + var data = { + 'name': $('#sitename').html(), + 'WPusername': $scope.WPUsername, + 'WPemail': $scope.adminEmail, + 'WPpasswd': $scope.WPPassword, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.conatinerview = false + $scope.cyberPanelLoading = true; + + $scope.getcontainer() + + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Container recreated', + type: 'success' + }); + } else { + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + } + + $scope.refreshStatus = function () { + url = "/docker/getContainerStatus"; + var data = {name: $scope.cName}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.containerStatus === 1) { + console.log(response.data.status); + $scope.status = response.data.status; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + } + + }; + $scope.cAction = function (action) { + $('#actionLoading').show(); + url = "/docker/doContainerAction"; + var data = {name: $scope.cName, action: action}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + console.log(response); + + if (response.data.containerActionStatus === 1) { + new PNotify({ + title: 'Success!', + text: 'Action completed', + type: 'success' + }); + $scope.status = response.data.status; + $scope.refreshStatus() + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + + } + $('#actionLoading').hide(); + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $('#actionLoading').hide(); + } + + }; + $scope.cRemove = function () { + (new PNotify({ + title: 'Confirmation Needed', + text: 'Are you sure?', + icon: 'fa fa-question-circle', + hide: false, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + } + })).get().on('pnotify.confirm', function () { + $('#actionLoading').show(); + + url = "/docker/delContainer"; + var data = {name: $scope.cName, unlisted: false}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + function ListInitialData(response) { + if (response.data.delContainerStatus === 1) { + new PNotify({ + title: 'Container deleted!', + text: 'Redirecting...', + type: 'success' + }); + window.location.href = '/docker/listContainers'; + } + else { + new PNotify({ + title: 'Unable to complete request', + text: response.data.error_message, + type: 'error' + }); + } + $('#actionLoading').hide(); + } + + function cantLoadInitialData(response) { + PNotify.error({ + title: 'Unable to complete request', + text: "Problem in connecting to server" + }); + $('#actionLoading').hide(); + } + }) + }; + + +}) \ No newline at end of file diff --git a/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html b/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html index a827f89d2..ad63504f8 100644 --- a/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html +++ b/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html @@ -13,7 +13,575 @@ }); -

Docker Site Home

-

{{ dockerSite.SiteName }}

+ +
+ +
+

{% trans "Containers" %} + Create +

+

{% trans "Manage containers on server" %}

+
+ +
+
+

+ {% trans "Containers" %} {{ dockerSite.SiteName }} +

+ +
+ + + + + + + {# #} + {# #} + {# #} + + + + + + + + + {# #} + {# #} + {# #} + + + + +
NameLaunchOwnerImageTagActions
+ + + {# #} +
+ + +
+

{% trans "Error message:" %} {$ errorMessage $}

+
+ +
+ +
+ + + + +
+ + +
+ + {% if showUnlistedContainer %} +

+ {% trans "Unlisted Containers" %} +

+ + + + + + + + + + + + {% for container in unlistedContainers %} + + + + + + {% endfor %} + + +
NameStatusActions
{{ container.name }}{{ container.status }} + + + +
+ + {% endif %} + + + + + +
+
+
+
+
+ + +
+

{% trans "Currently managing: " %} {$ cName $} + +

+

+ {% trans "Container ID" %}: {$ cid $} +

+ +
+ + +
+ +
+ +

+ {% trans "Container Information" %} + +

+ + +
+
+ +
+
+
+
+

+ {% trans "Memory Usage" %} +

+
+
+
+
+ +
+
+
+ + +

+ {% trans "CPU Usage" %} +

+
+
+
+
+
+
+ + +
+ +
+
+
+ +
+
+
+
+

Main Actions + +

+ Status: + +
+ + + + +
+
+
+
+ + +
+
+ + +
+
+ + + +
+ +
+ +

+ {% trans "Logs" %} + +

+ + +
+
+ +
+
+ +
+
+
+ + + + + + + +
+
+
+ + {% endblock %} diff --git a/websiteFunctions/templates/websiteFunctions/createWebsite.html b/websiteFunctions/templates/websiteFunctions/createWebsite.html index c9a7225cd..28e2d86da 100755 --- a/websiteFunctions/templates/websiteFunctions/createWebsite.html +++ b/websiteFunctions/templates/websiteFunctions/createWebsite.html @@ -130,6 +130,29 @@ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
@@ -180,7 +203,9 @@ {% else %} - OpenLiteSpeed + Apache (Backend) (For Ubuntu 22 and AlmaLinux 8) - Premium Feature + OpenLiteSpeed + Apache (Backend) (For Ubuntu 22 and AlmaLinux 8) - + Premium Feature {% endif %}