bug fix to wp staging

This commit is contained in:
Usman Nasir
2019-08-03 14:53:31 +05:00
parent e66f061a4a
commit 6e3310d7db
31 changed files with 3953 additions and 343 deletions

View File

@@ -13,7 +13,7 @@ from websiteFunctions.models import Websites
import os import os
from baseTemplate.models import version from baseTemplate.models import version
from plogical.mailUtilities import mailUtilities from plogical.mailUtilities import mailUtilities
from plogical.website import WebsiteManager from websiteFunctions.website import WebsiteManager
from s3Backups.s3Backups import S3Backups from s3Backups.s3Backups import S3Backups
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from plogical.processUtilities import ProcessUtilities from plogical.processUtilities import ProcessUtilities

View File

@@ -1,9 +1,3 @@
import json
import os
from random import randint
from django.shortcuts import HttpResponse
import userManagment.views as um import userManagment.views as um
from backup.backupManager import BackupManager from backup.backupManager import BackupManager
from databases.databaseManager import DatabaseManager from databases.databaseManager import DatabaseManager
@@ -15,22 +9,17 @@ from loginSystem.models import Administrator
from mailServer.mailserverManager import MailServerManager from mailServer.mailserverManager import MailServerManager
from manageSSL.views import issueSSL, obtainHostNameSSL, obtainMailServerSSL from manageSSL.views import issueSSL, obtainHostNameSSL, obtainMailServerSSL
from packages.packagesManager import PackagesManager from packages.packagesManager import PackagesManager
from plogical.acl import ACLManager
from plogical.httpProc import httpProc
from plogical.mysqlUtilities import mysqlUtilities from plogical.mysqlUtilities import mysqlUtilities
from plogical.processUtilities import ProcessUtilities
from plogical.virtualHostUtilities import virtualHostUtilities from plogical.virtualHostUtilities import virtualHostUtilities
from plogical.website import WebsiteManager from websiteFunctions.website import WebsiteManager
from s3Backups.s3Backups import S3Backups from s3Backups.s3Backups import S3Backups
from serverLogs.views import getLogsFromFile from serverLogs.views import getLogsFromFile
from serverStatus.views import topProcessesStatus, killProcess, switchTOLSWSStatus from serverStatus.views import topProcessesStatus, killProcess, switchTOLSWSStatus
from websiteFunctions.models import Websites
from plogical import hashPassword from plogical import hashPassword
from loginSystem.models import ACL from loginSystem.models import ACL
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from managePHP.phpManager import PHPManager from managePHP.phpManager import PHPManager
from managePHP.views import submitExtensionRequest, getRequestStatusApache from managePHP.views import submitExtensionRequest, getRequestStatusApache
from containerization.containerManager import ContainerManager
from containerization.views import * from containerization.views import *

View File

@@ -952,7 +952,7 @@ class preFlightsChecks:
os.chdir(self.path) os.chdir(self.path)
command = "wget http://cyberpanel.sh/CyberPanel.1.8.7.tar.gz" command = "wget http://cyberpanel.sh/CyberPanel.1.8.8.tar.gz"
#command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz" #command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'CyberPanel Download', 'CyberPanel Download',
@@ -961,7 +961,7 @@ class preFlightsChecks:
## ##
count = 0 count = 0
command = "tar zxf CyberPanel.1.8.7.tar.gz" command = "tar zxf CyberPanel.1.8.8.tar.gz"
#command = "tar zxf CyberPanelTemp.tar.gz" #command = "tar zxf CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'Extract CyberPanel',1, 1, os.EX_OSERR) 'Extract CyberPanel',1, 1, os.EX_OSERR)

View File

@@ -218,7 +218,7 @@ def loadLoginPage(request):
firstName="Cyber",lastName="Panel", acl=acl, token=token) firstName="Cyber",lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=7) vers = version(currentVersion="1.8", build=8)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -15,3 +15,4 @@ class Package(models.Model):
dataBases = models.IntegerField(default=0) dataBases = models.IntegerField(default=0)
ftpAccounts = models.IntegerField(default=0) ftpAccounts = models.IntegerField(default=0)
allowedDomains = models.IntegerField(default=0) allowedDomains = models.IntegerField(default=0)
allowFullDomain = models.IntegerField(default=1)

View File

@@ -74,6 +74,12 @@ class PackagesManager:
except: except:
api = '0' api = '0'
try:
allowFullDomain = int(data['allowFullDomain'])
except:
allowFullDomain = 1
if packageSpace < 0 or packageBandwidth < 0 or packageDatabases < 0 or ftpAccounts < 0 or emails < 0 or allowedDomains < 0: if packageSpace < 0 or packageBandwidth < 0 or packageDatabases < 0 or ftpAccounts < 0 or emails < 0 or allowedDomains < 0:
data_ret = {'saveStatus': 0, 'error_message': "All values should be positive or 0."} data_ret = {'saveStatus': 0, 'error_message': "All values should be positive or 0."}
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
@@ -86,7 +92,7 @@ class PackagesManager:
package = Package(admin=admin, packageName=packageName, diskSpace=packageSpace, package = Package(admin=admin, packageName=packageName, diskSpace=packageSpace,
bandwidth=packageBandwidth, ftpAccounts=ftpAccounts, dataBases=packageDatabases, bandwidth=packageBandwidth, ftpAccounts=ftpAccounts, dataBases=packageDatabases,
emailAccounts=emails, allowedDomains=allowedDomains) emailAccounts=emails, allowedDomains=allowedDomains, allowFullDomain=allowFullDomain)
package.save() package.save()
@@ -156,9 +162,10 @@ class PackagesManager:
dataBases = modifyPack.dataBases dataBases = modifyPack.dataBases
emails = modifyPack.emailAccounts emails = modifyPack.emailAccounts
data_ret = {'emails': emails, 'modifyStatus': 1, 'error_message': "None", data_ret = {'emails': emails, 'modifyStatus': 1, 'error_message': "None",
"diskSpace": diskSpace, "bandwidth": bandwidth, "ftpAccounts": ftpAccounts, "diskSpace": diskSpace, "bandwidth": bandwidth, "ftpAccounts": ftpAccounts,
"dataBases": dataBases, "allowedDomains": modifyPack.allowedDomains} "dataBases": dataBases, "allowedDomains": modifyPack.allowedDomains, 'allowFullDomain': modifyPack.allowFullDomain}
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
@@ -194,6 +201,13 @@ class PackagesManager:
modifyPack.dataBases = data['dataBases'] modifyPack.dataBases = data['dataBases']
modifyPack.emailAccounts = data['emails'] modifyPack.emailAccounts = data['emails']
modifyPack.allowedDomains = data['allowedDomains'] modifyPack.allowedDomains = data['allowedDomains']
try:
modifyPack.allowFullDomain = int(data['allowFullDomain'])
except:
modifyPack.allowFullDomain = 1
modifyPack.save() modifyPack.save()
data_ret = {'status': 1, 'saveStatus': 1, 'error_message': "None"} data_ret = {'status': 1, 'saveStatus': 1, 'error_message': "None"}

View File

@@ -3,13 +3,11 @@
*/ */
/** /**
* Created by usman on 7/25/17. * Created by usman on 7/25/17.
*/ */
/* Utilities */ /* Utilities */
function getCookie(name) { function getCookie(name) {
@@ -31,72 +29,74 @@ function getCookie(name) {
/* Utilities ends here */ /* Utilities ends here */
/* Java script code to create Pacakge */ /* Java script code to create Pacakge */
$("#packageCreationFailed").hide(); $("#packageCreationFailed").hide();
$("#packageCreated").hide(); $("#packageCreated").hide();
app.controller('createPackage', function ($scope, $http) {
app.controller('createPackage', function($scope,$http) {
//$scope.pname = /([A-Z]){3,10}/gi; //$scope.pname = /([A-Z]){3,10}/gi;
$scope.insertPackInDB = function(){ $scope.insertPackInDB = function () {
var packageName = $scope.packageName;
var diskSpace = $scope.diskSpace;
var bandwidth = $scope.bandwidth;
var ftpAccounts = $scope.ftpAccounts;
var dataBases = $scope.dataBases;
var emails = $scope.emails;
url = "/packages/submitPackage"; var packageName = $scope.packageName;
var diskSpace = $scope.diskSpace;
var bandwidth = $scope.bandwidth;
var ftpAccounts = $scope.ftpAccounts;
var dataBases = $scope.dataBases;
var emails = $scope.emails;
var data = { if($scope.allowFullDomain === undefined){
packageName: packageName, $scope.allowFullDomain = 0;
diskSpace: diskSpace, }
bandwidth: bandwidth,
ftpAccounts: ftpAccounts,
dataBases: dataBases,
emails:emails,
allowedDomains:$scope.allowedDomains
};
var config = {
headers : {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { url = "/packages/submitPackage";
console.log(response.data)
if (response.data.saveStatus == 0) var data = {
{ packageName: packageName,
$scope.errorMessage = response.data.error_message; diskSpace: diskSpace,
$("#packageCreationFailed").fadeIn(); bandwidth: bandwidth,
$("#packageCreated").hide(); ftpAccounts: ftpAccounts,
dataBases: dataBases,
emails: emails,
allowedDomains: $scope.allowedDomains,
allowFullDomain: $scope.allowFullDomain
};
} var config = {
else{ headers: {
$("#packageCreationFailed").hide(); 'X-CSRFToken': getCookie('csrftoken')
$("#packageCreated").fadeIn(); }
$scope.createdPackage = $scope.packageName; };
} $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
} function ListInitialDatas(response) {
function cantLoadInitialDatas(response) { console.log(response.data)
console.log("not good");
} if (response.data.saveStatus == 0) {
$scope.errorMessage = response.data.error_message;
$("#packageCreationFailed").fadeIn();
$("#packageCreated").hide();
} else {
$("#packageCreationFailed").hide();
$("#packageCreated").fadeIn();
$scope.createdPackage = $scope.packageName;
}
}
function cantLoadInitialDatas(response) {
console.log("not good");
}
}; };
@@ -107,7 +107,6 @@ app.controller('createPackage', function($scope,$http) {
/* Java script code to to create Pacakge ends here */ /* Java script code to to create Pacakge ends here */
/* Java script code to delete Pacakge */ /* Java script code to delete Pacakge */
@@ -117,62 +116,60 @@ $("#deleteSuccess").hide();
$("#deletePackageButton").hide(); $("#deletePackageButton").hide();
app.controller('deletePackage', function($scope,$http) { app.controller('deletePackage', function ($scope, $http) {
$scope.deletePackage = function(){ $scope.deletePackage = function () {
$("#deletePackageButton").fadeIn(); $("#deletePackageButton").fadeIn();
}; };
$scope.deletePackageFinal = function(){ $scope.deletePackageFinal = function () {
var packageName = $scope.packageToBeDeleted; var packageName = $scope.packageToBeDeleted;
url = "/packages/submitDelete";
url = "/packages/submitDelete"; var data = {
packageName: packageName,
};
var data = { var config = {
packageName: packageName, headers: {
}; 'X-CSRFToken': getCookie('csrftoken')
}
};
var config = { $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
headers : {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data) console.log(response.data)
if (response.data.deleteStatus == 0) if (response.data.deleteStatus == 0) {
{ $scope.errorMessage = response.data.error_message;
$scope.errorMessage = response.data.error_message; $("#deleteFailure").fadeIn();
$("#deleteFailure").fadeIn(); $("#deleteSuccess").hide();
$("#deleteSuccess").hide(); $("#deletePackageButton").hide();
$("#deletePackageButton").hide();
} } else {
else{ $("#deleteFailure").hide();
$("#deleteFailure").hide(); $("#deleteSuccess").fadeIn();
$("#deleteSuccess").fadeIn(); $("#deletePackageButton").hide();
$("#deletePackageButton").hide(); $scope.deletedPackage = packageName;
$scope.deletedPackage = packageName;
} }
} }
function cantLoadInitialDatas(response) {
console.log("not good"); function cantLoadInitialDatas(response) {
} console.log("not good");
}
}; };
@@ -180,11 +177,9 @@ app.controller('deletePackage', function($scope,$http) {
}); });
/* Java script code to delete package ends here */ /* Java script code to delete package ends here */
/* Java script code modify package */ /* Java script code modify package */
$("#packageDetailsToBeModified").hide(); $("#packageDetailsToBeModified").hide();
@@ -194,9 +189,9 @@ $("#modifyButton").hide();
$("#packageLoading").hide(); $("#packageLoading").hide();
$("#successfullyModified").hide(); $("#successfullyModified").hide();
app.controller('modifyPackages', function($scope,$http) { app.controller('modifyPackages', function ($scope, $http) {
$scope.fetchDetails = function(){ $scope.fetchDetails = function () {
$("#packageLoading").show(); $("#packageLoading").show();
$("#successfullyModified").hide(); $("#successfullyModified").hide();
@@ -207,63 +202,65 @@ app.controller('modifyPackages', function($scope,$http) {
url = "/packages/submitModify"; url = "/packages/submitModify";
var data = { var data = {
packageName: packageName, packageName: packageName,
}; };
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
if (response.data.modifyStatus == 0) if (response.data.modifyStatus === 0) {
{ $scope.errorMessage = response.data.error_message;
$scope.errorMessage = response.data.error_message; $("#modifyFailure").fadeIn();
$("#modifyFailure").fadeIn(); $("#modifySuccess").hide();
$("#modifySuccess").hide(); $("#modifyButton").hide();
$("#modifyButton").hide(); $("#packageLoading").hide();
$("#packageLoading").hide();
} } else {
else{ $("#modifyButton").show();
$("#modifyButton").show(); $scope.diskSpace = response.data.diskSpace;
$scope.diskSpace = response.data.diskSpace; $scope.bandwidth = response.data.bandwidth;
$scope.bandwidth = response.data.bandwidth; $scope.ftpAccounts = response.data.ftpAccounts;
$scope.ftpAccounts = response.data.ftpAccounts; $scope.dataBases = response.data.dataBases;
$scope.dataBases = response.data.dataBases; $scope.emails = response.data.emails;
$scope.emails = response.data.emails; $scope.allowedDomains = response.data.allowedDomains;
$scope.allowedDomains = response.data.allowedDomains;
$scope.modifyButton = "Save Details"
$("#packageDetailsToBeModified").fadeIn();
$("#modifyFailure").hide();
$("#modifySuccess").fadeIn();
$("#packageLoading").hide();
}
if (response.data.allowFullDomain === 1) {
$scope.allowFullDomain = true;
} else {
$scope.allowFullDomain = false;
} }
function cantLoadInitialDatas(response) {
console.log("not good"); $scope.modifyButton = "Save Details"
}
$("#packageDetailsToBeModified").fadeIn();
$("#modifyFailure").hide();
$("#modifySuccess").fadeIn();
$("#packageLoading").hide();
}
}
function cantLoadInitialDatas(response) {
console.log("not good");
}
}; };
$scope.modifyPackageFunc = function () { $scope.modifyPackageFunc = function () {
var packageName = $scope.packageToBeModified; var packageName = $scope.packageToBeModified;
@@ -281,56 +278,53 @@ app.controller('modifyPackages', function($scope,$http) {
url = "/packages/saveChanges"; url = "/packages/saveChanges";
var data = { var data = {
packageName: packageName, packageName: packageName,
diskSpace:diskSpace, diskSpace: diskSpace,
bandwidth:bandwidth, bandwidth: bandwidth,
ftpAccounts:ftpAccounts, ftpAccounts: ftpAccounts,
dataBases:dataBases, dataBases: dataBases,
emails:emails, emails: emails,
allowedDomains:$scope.allowedDomains, allowedDomains: $scope.allowedDomains,
}; allowFullDomain: $scope.allowFullDomain
};
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
if (response.data.saveStatus == 0) if (response.data.saveStatus === 0) {
{ $scope.errorMessage = response.data.error_message;
$scope.errorMessage = response.data.error_message; $("#modifyFailure").fadeIn();
$("#modifyFailure").fadeIn(); $("#modifySuccess").hide();
$("#modifySuccess").hide(); $("#modifyButton").hide();
$("#modifyButton").hide(); $("#packageLoading").hide();
$("#packageLoading").hide();
} } else {
else{ $("#modifyButton").hide();
$("#modifyButton").hide();
$("#successfullyModified").fadeIn(); $("#successfullyModified").fadeIn();
$("#modifyFailure").hide(); $("#modifyFailure").hide();
$("#packageLoading").hide(); $("#packageLoading").hide();
$scope.packageModified = packageName; $scope.packageModified = packageName;
}
} }
}
function cantLoadInitialDatas(response) {
console.log("not good");
}
function cantLoadInitialDatas(response) {
console.log("not good");
}
}; };
@@ -338,5 +332,4 @@ app.controller('modifyPackages', function($scope,$http) {
}); });
/* Java script code to Modify Pacakge ends here */ /* Java script code to Modify Pacakge ends here */

View File

@@ -3,112 +3,127 @@
{% block title %}{% trans "Create Package - CyberPanel" %}{% endblock %} {% block title %}{% trans "Create Package - CyberPanel" %}{% endblock %}
{% block content %} {% block content %}
{% load static %} {% load static %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} --> <!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "Create Package" %}</h2>
<p>{% trans "Packages define resources for your websites, you need to add package before creating a website." %}</p>
</div>
<div class="panel">
<div class="panel-body">
<h3 class="content-box-header">
{% trans "Package Details" %}
</h3>
<div ng-controller="createPackage" class="example-box-wrapper">
<form name="createPackageFrm" action="/" id="createPackages" class="form-horizontal bordered-row panel-body">
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Package Name" %}</label>
<div class="col-sm-6">
<input name="pname" type="text" class="form-control" ng-model="packageName" required>
</div>
<div class="current-pack">{{ admin }}_{$ packageName $}</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Domains" %}</label>
<div class="col-sm-6">
<input name="dspace" type="number" class="form-control" ng-model="allowedDomains" required>
</div>
<div class="current-pack"> {% trans "(0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Disk Space" %}</label>
<div class="col-sm-6">
<input name="dspace" type="number" class="form-control" ng-model="diskSpace" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Bandwidth" %}</label>
<div class="col-sm-6">
<input name="bwidth" type="number" class="form-control" ng-model="bandwidth" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "FTP Accounts" %}</label>
<div class="col-sm-6">
<input name="eaccts" type="number" class="form-control" ng-model="ftpAccounts" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Databases" %}</label>
<div class="col-sm-6">
<input name="dbases" type="number" class="form-control" ng-model="dataBases" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Emails" %}</label>
<div class="col-sm-6">
<input name="emails" type="number" class="form-control" ng-model="emails" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-click="insertPackInDB()" class="btn btn-primary btn-lg">{% trans "Create Package" %}</button>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<div id="packageCreationFailed" class="alert alert-danger">
<p>{% trans "Cannot create package. Error message:" %} {$ errorMessage $}</p>
</div>
<div id="packageCreated" class="alert alert-success">
<p>{% trans "Package" %} <strong>{$ createdPackage $}</strong> {% trans "Successfully Created" %}</p>
</div>
</div>
</div>
</form>
<div class="container">
<div id="page-title">
<h2>{% trans "Create Package" %}</h2>
<p>{% trans "Packages define resources for your websites, you need to add package before creating a website." %}</p>
</div> </div>
<div class="panel">
<div class="panel-body">
<h3 class="content-box-header">
{% trans "Package Details" %}
</h3>
<div ng-controller="createPackage" class="example-box-wrapper">
<form name="createPackageFrm" action="/" id="createPackages"
class="form-horizontal bordered-row panel-body">
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Package Name" %}</label>
<div class="col-sm-6">
<input name="pname" type="text" class="form-control" ng-model="packageName" required>
</div>
<div class="current-pack">{{ admin }}_{$ packageName $}</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Domains" %}</label>
<div class="col-sm-6">
<input name="dspace" type="number" class="form-control" ng-model="allowedDomains"
required>
</div>
<div class="current-pack"> {% trans "(0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Disk Space" %}</label>
<div class="col-sm-6">
<input name="dspace" type="number" class="form-control" ng-model="diskSpace" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Bandwidth" %}</label>
<div class="col-sm-6">
<input name="bwidth" type="number" class="form-control" ng-model="bandwidth" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "FTP Accounts" %}</label>
<div class="col-sm-6">
<input name="eaccts" type="number" class="form-control" ng-model="ftpAccounts" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Databases" %}</label>
<div class="col-sm-6">
<input name="dbases" type="number" class="form-control" ng-model="dataBases" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Emails" %}</label>
<div class="col-sm-6">
<input name="emails" type="number" class="form-control" ng-model="emails" required>
</div>
</div>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Additional Features" %}</label>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="allowFullDomain" type="checkbox" value="">
Allow Creation of Fully Qualified Domain as Child-Domains
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-click="insertPackInDB()"
class="btn btn-primary btn-lg">{% trans "Create Package" %}</button>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<div id="packageCreationFailed" class="alert alert-danger">
<p>{% trans "Cannot create package. Error message:" %} {$ errorMessage $}</p>
</div>
<div id="packageCreated" class="alert alert-success">
<p>{% trans "Package" %} <strong>{$ createdPackage
$}</strong> {% trans "Successfully Created" %}</p>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -83,6 +83,19 @@
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Additional Features" %}</label>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="allowFullDomain" type="checkbox" value="">
Allow Creation of Fully Qualified Domain as Child-Domains
</label>
</div>
</div>
</div>
</div> </div>

View File

@@ -108,6 +108,18 @@ class ACLManager:
return finalResponse return finalResponse
@staticmethod
def checkUserOwnerShip(currentACL, owner, user):
if currentACL['admin'] == 1:
return 1
elif owner == user:
return 1
elif owner.pk == user.owner:
return 1
else:
return 0
@staticmethod @staticmethod
def currentContextPermission(currentACL, context): def currentContextPermission(currentACL, context):
try: try:

View File

@@ -31,7 +31,7 @@ def main():
firstName="Cyber", lastName="Panel", acl=acl, token=token) firstName="Cyber", lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=7) vers = version(currentVersion="1.8", build=8)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -51,6 +51,9 @@ class cPanelImporter:
self.mailFormat = 1 self.mailFormat = 1
def PHPDecider(self): def PHPDecider(self):
if self.PHPVersion == 'inherit':
self.PHPVersion = 'PHP 7.2'
if self.PHPVersion.find('53') > -1: if self.PHPVersion.find('53') > -1:
self.PHPVersion = 'PHP 5.3' self.PHPVersion = 'PHP 5.3'
elif self.PHPVersion.find('54') > -1: elif self.PHPVersion.find('54') > -1:

View File

@@ -145,7 +145,7 @@ class mysqlUtilities:
return str(msg) return str(msg)
@staticmethod @staticmethod
def createDatabaseBackup(databaseName,tempStoragePath): def createDatabaseBackup(databaseName, tempStoragePath):
try: try:
passFile = "/etc/cyberpanel/mysqlPassword" passFile = "/etc/cyberpanel/mysqlPassword"
f = open(passFile) f = open(passFile)
@@ -191,7 +191,7 @@ password=%s
return 0 return 0
@staticmethod @staticmethod
def restoreDatabaseBackup(databaseName, tempStoragePath,dbPassword): def restoreDatabaseBackup(databaseName, tempStoragePath, dbPassword, passwordCheck = None, additionalName = None):
try: try:
passFile = "/etc/cyberpanel/mysqlPassword" passFile = "/etc/cyberpanel/mysqlPassword"
@@ -217,25 +217,33 @@ password=%s
command = 'chown cyberpanel:cyberpanel %s' % (cnfPath) command = 'chown cyberpanel:cyberpanel %s' % (cnfPath)
subprocess.call(shlex.split(command)) subprocess.call(shlex.split(command))
command = 'sudo mysql --defaults-extra-file=/home/cyberpanel/.my.cnf --host=localhost ' + databaseName command = 'mysql --defaults-extra-file=/home/cyberpanel/.my.cnf --host=localhost ' + databaseName
cmd = shlex.split(command) cmd = shlex.split(command)
with open(tempStoragePath + "/" + databaseName + '.sql', 'r') as f: if additionalName == None:
res = subprocess.call(cmd, stdin=f) with open(tempStoragePath + "/" + databaseName + '.sql', 'r') as f:
res = subprocess.call(cmd, stdin=f)
if res != 0:
logging.CyberCPLogFileWriter.writeToFile("Could not restore MYSQL database: " + databaseName +"! [restoreDatabaseBackup]")
return 0
else:
with open(tempStoragePath + "/" + additionalName + '.sql', 'r') as f:
res = subprocess.call(cmd, stdin=f)
if res == 1: if res != 0:
logging.CyberCPLogFileWriter.writeToFile("Could not restore MYSQL database: " +databaseName +"! [restoreDatabaseBackup]") logging.CyberCPLogFileWriter.writeToFile("Could not restore MYSQL database: " + additionalName + "! [restoreDatabaseBackup]")
return 0 return 0
connection, cursor = mysqlUtilities.setupConnection() if passwordCheck == None:
connection, cursor = mysqlUtilities.setupConnection()
if connection == 0: if connection == 0:
return 0 return 0
passwordCMD = "use mysql;SET PASSWORD FOR '" + databaseName + "'@'localhost' = '" + dbPassword + "';FLUSH PRIVILEGES;" passwordCMD = "use mysql;SET PASSWORD FOR '" + databaseName + "'@'localhost' = '" + dbPassword + "';FLUSH PRIVILEGES;"
cursor.execute(passwordCMD) cursor.execute(passwordCMD)
connection.close() connection.close()
return 1 return 1
except BaseException, msg: except BaseException, msg:

View File

@@ -270,4 +270,13 @@ class ProcessUtilities(multi.Thread):
logging.writeToFile(str(msg) + " [popenExecutioner]") logging.writeToFile(str(msg) + " [popenExecutioner]")
@staticmethod
def BuildCommand(path, functionName, parameters):
execPath = "python %s %s " % (path, functionName)
for key, value in parameters.iteritems():
execPath = execPath + ' --%s %s' % (key, value)
return execPath

View File

@@ -1443,7 +1443,8 @@ class Upgrade:
impFile = ['/etc/pure-ftpd/pure-ftpd.conf', '/etc/pure-ftpd/pureftpd-pgsql.conf', impFile = ['/etc/pure-ftpd/pure-ftpd.conf', '/etc/pure-ftpd/pureftpd-pgsql.conf',
'/etc/pure-ftpd/pureftpd-mysql.conf', '/etc/pure-ftpd/pureftpd-ldap.conf', '/etc/pure-ftpd/pureftpd-mysql.conf', '/etc/pure-ftpd/pureftpd-ldap.conf',
'/etc/dovecot/dovecot.conf', '/etc/pdns/pdns.conf', '/etc/pure-ftpd/db/mysql.conf', '/etc/powerdns/pdns.conf'] '/etc/dovecot/dovecot.conf', '/etc/pdns/pdns.conf', '/etc/pure-ftpd/db/mysql.conf',
'/etc/powerdns/pdns.conf']
for items in impFile: for items in impFile:
command = 'chmod 600 %s' % (items) command = 'chmod 600 %s' % (items)
@@ -1477,7 +1478,6 @@ class Upgrade:
command = 'chmod 644 /etc/postfix/main.cf' command = 'chmod 644 /etc/postfix/main.cf'
subprocess.call(command, shell=True) subprocess.call(command, shell=True)
Upgrade.stdOut("Permissions updated.") Upgrade.stdOut("Permissions updated.")
except BaseException, msg: except BaseException, msg:
@@ -1498,6 +1498,14 @@ class Upgrade:
'lsphp7?-sqlite3 lsphp7?-tidy' 'lsphp7?-sqlite3 lsphp7?-tidy'
Upgrade.executioner(command, 'Install PHP 73, 0') Upgrade.executioner(command, 'Install PHP 73, 0')
CentOSPath = '/etc/redhat-release'
if not os.path.exists(CentOSPath):
command = 'cp /usr/local/lsws/lsphp71/bin/php /usr/bin/'
Upgrade.executioner(command, 'Set default PHP 7.0, 0')
@staticmethod @staticmethod
def someDirectories(): def someDirectories():
command = "mkdir -p /usr/local/lscpd/admin/" command = "mkdir -p /usr/local/lscpd/admin/"
@@ -1520,11 +1528,11 @@ class Upgrade:
if os.path.exists(CentOSPath): if os.path.exists(CentOSPath):
path = '/etc/yum.repos.d/dovecot.repo' path = '/etc/yum.repos.d/dovecot.repo'
content = """[dovecot-2.3-latest] content = """[dovecot-2.3-latest]
name=Dovecot 2.3 CentOS $releasever - $basearch name=Dovecot 2.3 CentOS $releasever - $basearch
baseurl=http://repo.dovecot.org/ce-2.3-latest/centos/$releasever/RPMS/$basearch baseurl=http://repo.dovecot.org/ce-2.3-latest/centos/$releasever/RPMS/$basearch
gpgkey=https://repo.dovecot.org/DOVECOT-REPO-GPG gpgkey=https://repo.dovecot.org/DOVECOT-REPO-GPG
gpgcheck=1 gpgcheck=1
enabled=1""" enabled=1"""
writeToFile = open(path, 'w') writeToFile = open(path, 'w')
writeToFile.write(content) writeToFile.write(content)
writeToFile.close() writeToFile.close()
@@ -1580,8 +1588,17 @@ class Upgrade:
pass pass
try: try:
command = 'apt upgrade -y' command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y'
subprocess.call(command, shell=True)
command = 'dpkg --configure -a'
Upgrade.executioner(command, 0) Upgrade.executioner(command, 0)
command = 'apt --fix-broken install -y'
Upgrade.executioner(command, 0)
command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y'
subprocess.call(command, shell=True)
except: except:
pass pass
@@ -1591,12 +1608,12 @@ class Upgrade:
data = open(path, 'r').readlines() data = open(path, 'r').readlines()
updatePasswords = 1 updatePasswords = 0
writeToFile = open(path, 'w') writeToFile = open(path, 'w')
for items in data: for items in data:
if items.find('default_pass_scheme') > -1: if items.find('default_pass_scheme') > -1:
updatePasswords = 0 updatePasswords = 1
continue continue
else: else:
writeToFile.writelines(items) writeToFile.writelines(items)

View File

@@ -103,7 +103,12 @@ class vhost:
try: try:
os.makedirs(pathLogs) os.makedirs(pathLogs)
command = "chown %s:%s %s" % ('root', 'nobody', pathLogs) if ProcessUtilities.decideDistro() == ProcessUtilities.centos:
groupName = 'nobody'
else:
groupName = 'nogroup'
command = "chown %s:%s %s" % ('root', groupName, pathLogs)
cmd = shlex.split(command) cmd = shlex.split(command)
subprocess.call(cmd, stdout=FNULL, stderr=subprocess.STDOUT) subprocess.call(cmd, stdout=FNULL, stderr=subprocess.STDOUT)

View File

@@ -1019,6 +1019,15 @@ class virtualHostUtilities:
master = Websites.objects.get(domain=masterDomain) master = Websites.objects.get(domain=masterDomain)
domainsInPackage = master.package.allowedDomains domainsInPackage = master.package.allowedDomains
if master.package.allowFullDomain == 0:
if virtualHostName.find(masterDomain) > -1:
pass
else:
logging.CyberCPLogFileWriter.statusWriter(tempStatusPath,
'Fully qualified domain is not allowed in the package. [404]')
return 0, "Fully qualified domain is not allowed in the package."
if domainsInPackage == 0: if domainsInPackage == 0:
pass pass
elif domainsInPackage > master.childdomains_set.all().count(): elif domainsInPackage > master.childdomains_set.all().count():

View File

@@ -35,7 +35,6 @@ MarkupSafe==0.11
mock==2.0.0 mock==2.0.0
parsedatetime==2.4 parsedatetime==2.4
pbr==4.0.4 pbr==4.0.4
perf==0.1
pexpect==4.4.0 pexpect==4.4.0
prettytable==0.7.2 prettytable==0.7.2
psutil==5.4.3 psutil==5.4.3

View File

@@ -65,7 +65,6 @@ def litespeedStatus(request):
return render(request, "serverStatus/litespeedStatus.html", {"processList": processList, return render(request, "serverStatus/litespeedStatus.html", {"processList": processList,
"liteSpeedVersionStatus": "For some reaons not able to load version details, see CyberCP main log file.", "liteSpeedVersionStatus": "For some reaons not able to load version details, see CyberCP main log file.",
'OLS': OLS}) 'OLS': OLS})
if (processList != 0): if (processList != 0):
dataForHtml = {"processList": processList, "lsversion": lsversion, "modules": modules, dataForHtml = {"processList": processList, "lsversion": lsversion, "modules": modules,
"loadedModules": loadedModules, 'OLS': OLS} "loadedModules": loadedModules, 'OLS': OLS}

View File

@@ -447,9 +447,8 @@ app.controller('deleteWebsiteControl', function ($scope, $http) {
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data)
if (response.data.websiteDeleteStatus == 0) { if (response.data.websiteDeleteStatus === 0) {
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#websiteDeleteFailure").fadeIn(); $("#websiteDeleteFailure").fadeIn();
$("#websiteDeleteSuccess").hide(); $("#websiteDeleteSuccess").hide();
@@ -471,7 +470,6 @@ app.controller('deleteWebsiteControl', function ($scope, $http) {
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good");
} }
@@ -4943,7 +4941,6 @@ app.controller('sshAccess', function ($scope, $http, $timeout) {
} else { } else {
new PNotify({ new PNotify({
title: 'Error!', title: 'Error!',
text: response.data.error_message, text: response.data.error_message,
@@ -4970,3 +4967,299 @@ app.controller('sshAccess', function ($scope, $http, $timeout) {
}); });
/* Java script code to cloneWebsite */
app.controller('cloneWebsite', function ($scope, $http, $timeout, $window) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
var statusFile;
$scope.startCloning = function () {
$scope.cyberpanelLoading = false;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = true;
$scope.currentStatus = "Cloning started..";
url = "/websites/startCloning";
var data = {
masterDomain: $("#domainName").text(),
domainName: $scope.domain
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.status === 1) {
statusFile = response.data.tempStatusPath;
getCreationStatus();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
};
$scope.goBack = function () {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
$("#installProgress").css("width", "0%");
};
function getCreationStatus() {
url = "/websites/installWordpressStatus";
var data = {
statusFile: statusFile
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.abort === 1) {
if (response.data.installStatus === 1) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$("#installProgress").css("width", "100%");
$scope.installPercentage = "100";
$scope.currentStatus = response.data.currentStatus;
$timeout.cancel();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
$("#installProgress").css("width", "0%");
$scope.installPercentage = "0";
$scope.goBackDisable = false;
}
} else {
$("#installProgress").css("width", response.data.installationProgress + "%");
$scope.installPercentage = response.data.installationProgress;
$scope.currentStatus = response.data.currentStatus;
$timeout(getCreationStatus, 1000);
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
}
});
/* Java script code to cloneWebsite ends here */
/* Java script code to syncWebsite */
app.controller('syncWebsite', function ($scope, $http, $timeout, $window) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
var statusFile;
$scope.startSyncing = function () {
$scope.cyberpanelLoading = false;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = true;
$scope.currentStatus = "Cloning started..";
url = "/websites/startSync";
var data = {
childDomain: $("#childDomain").text(),
eraseCheck: $scope.eraseCheck,
dbCheck: $scope.dbCheck,
copyChanged: $scope.copyChanged
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.status === 1) {
statusFile = response.data.tempStatusPath;
getCreationStatus();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
};
$scope.goBack = function () {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
$("#installProgress").css("width", "0%");
};
function getCreationStatus() {
url = "/websites/installWordpressStatus";
var data = {
statusFile: statusFile
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.abort === 1) {
if (response.data.installStatus === 1) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$("#installProgress").css("width", "100%");
$scope.installPercentage = "100";
$scope.currentStatus = response.data.currentStatus;
$timeout.cancel();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
$("#installProgress").css("width", "0%");
$scope.installPercentage = "0";
$scope.goBackDisable = false;
}
} else {
$("#installProgress").css("width", response.data.installationProgress + "%");
$scope.installPercentage = response.data.installationProgress;
$scope.currentStatus = response.data.currentStatus;
$timeout(getCreationStatus, 1000);
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
}
});
/* Java script code to syncWebsite ends here */

View File

@@ -365,12 +365,10 @@ def submitUserDeletion(request):
currentACL = ACLManager.loadedACL(userID) currentACL = ACLManager.loadedACL(userID)
if accountUsername == 'admin': currentUser = Administrator.objects.get(pk=userID)
data_ret = {'status': 0, 'deleteStatus': 0, 'error_message': 'You can not delete the super user.'} userInQuestion = Administrator.objects.get(userName=accountUsername)
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
if currentACL['admin'] == 1: if ACLManager.checkUserOwnerShip(currentACL, currentUser, userInQuestion):
user = Administrator.objects.get(userName=accountUsername) user = Administrator.objects.get(userName=accountUsername)
user.delete() user.delete()
@@ -378,7 +376,7 @@ def submitUserDeletion(request):
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
else: else:
data_ret = {'status': 0, 'deleteStatus': 1, 'error_message': 'Not enough privileges.'} data_ret = {'status': 0, 'deleteStatus': 0, 'error_message': 'Not enough privileges.'}
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)

View File

@@ -0,0 +1,227 @@
#!/usr/local/CyberCP/bin/python2
import threading as multi
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from plogical.virtualHostUtilities import virtualHostUtilities
from plogical.processUtilities import ProcessUtilities
from .models import Websites, ChildDomains
from plogical.applicationInstaller import ApplicationInstaller
from plogical.mysqlUtilities import mysqlUtilities
from random import randint
import os
class StagingSetup(multi.Thread):
def __init__(self, function, extraArgs):
multi.Thread.__init__(self)
self.function = function
self.extraArgs = extraArgs
def run(self):
try:
if self.function == 'startCloning':
self.startCloning()
elif self.function == 'startSyncing':
self.startSyncing()
except BaseException, msg:
logging.writeToFile( str(msg) + ' [StagingSetup.run]')
def startCloning(self):
try:
tempStatusPath = self.extraArgs['tempStatusPath']
masterDomain = self.extraArgs['masterDomain']
domain = self.extraArgs['domain']
admin = self.extraArgs['admin']
website = Websites.objects.get(domain=masterDomain)
## Creating Child Domain
path = "/home/" + masterDomain + "/public_html/" + domain
logging.statusWriter(tempStatusPath, 'Creating domain for staging environment..,5')
phpSelection = 'PHP 7.1'
execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py"
execPath = execPath + " createDomain --masterDomain " + masterDomain + " --virtualHostName " + domain + \
" --phpVersion '" + phpSelection + "' --ssl 0 --dkimCheck 0 --openBasedir 0 --path " + path + ' --websiteOwner ' \
+ admin.userName + ' --tempStatusPath %s' % (tempStatusPath + '1') + " --apache 0"
ProcessUtilities.executioner(execPath)
domainCreationStatusPath = tempStatusPath + '1'
data = open(domainCreationStatusPath, 'r').read()
if data.find('[200]') > -1:
pass
else:
logging.statusWriter(tempStatusPath, 'Failed to create child-domain for staging enviroment. [404]')
return 0
logging.statusWriter(tempStatusPath, 'Domain successfully created..,15')
## Copying Data
masterPath = '/home/%s/public_html' % (masterDomain)
command = 'rsync -avzh --exclude "%s" --exclude "wp-content/plugins/litespeed-cache" %s/ %s' % (domain, masterPath, path)
ProcessUtilities.executioner(command, website.externalApp)
logging.statusWriter(tempStatusPath, 'Data copied..,50')
## Creating Database
logging.statusWriter(tempStatusPath, 'Creating and copying database..,50')
dbNameRestore, dbUser, dbPassword = ApplicationInstaller(None, None).dbCreation(tempStatusPath, website)
# Create dump of existing database
configPath = '%s/wp-config.php' % (masterPath)
if not os.path.exists(configPath):
logging.statusWriter(tempStatusPath, 'WordPress is not detected. [404]')
return 0
data = open(configPath, 'r').readlines()
for items in data:
if items.find('DB_NAME') > -1:
dbName = items.split("'")[3]
if mysqlUtilities.createDatabaseBackup(dbName, '/home/cyberpanel'):
break
else:
raise BaseException('Failed to create database backup.')
databasePath = '%s/%s.sql' % ('/home/cyberpanel', dbName)
command = "sed -i 's/%s/%s/g' %s" % (masterDomain, domain, databasePath)
ProcessUtilities.executioner(command, 'cyberpanel')
if not mysqlUtilities.restoreDatabaseBackup(dbNameRestore, '/home/cyberpanel', None, 1, dbName):
try:
os.remove(databasePath)
except:
pass
raise BaseException('Failed to restore database backup.')
try:
os.remove(databasePath)
except:
pass
## Update final config file
pathFinalConfig = '%s/wp-config.php' % (path)
data = open(pathFinalConfig, 'r').readlines()
tmp = "/tmp/" + str(randint(1000, 9999))
writeToFile = open(tmp, 'w')
for items in data:
if items.find('DB_NAME') > -1:
writeToFile.write("define( 'DB_NAME', '%s' );\n" % (dbNameRestore))
elif items.find('DB_USER') > -1:
writeToFile.write("define( 'DB_USER', '%s' );\n" % (dbUser))
elif items.find('DB_PASSWORD') > -1:
writeToFile.write("define( 'DB_PASSWORD', '%s' );\n" % (dbPassword))
else:
writeToFile.write(items)
writeToFile.close()
command = 'mv %s %s' % (tmp, pathFinalConfig)
ProcessUtilities.executioner(command, website.externalApp)
logging.statusWriter(tempStatusPath, 'Database synced..,100')
try:
os.path.remove(databasePath)
except:
pass
logging.statusWriter(tempStatusPath, 'Data copied..,[200]')
return 0
except BaseException, msg:
mesg = '%s. [404]' % (str(msg))
logging.statusWriter(tempStatusPath, mesg)
def startSyncing(self):
try:
tempStatusPath = self.extraArgs['tempStatusPath']
childDomain = self.extraArgs['childDomain']
eraseCheck = self.extraArgs['eraseCheck']
dbCheck = self.extraArgs['dbCheck']
copyChanged = self.extraArgs['copyChanged']
child = ChildDomains.objects.get(domain=childDomain)
configPath = '%s/wp-config.php' % (child.path)
if not os.path.exists(configPath):
logging.statusWriter(tempStatusPath, 'WordPress is not detected. [404]')
return 0
if dbCheck:
logging.statusWriter(tempStatusPath, 'Syncing databases..,10')
## Create backup of child-domain database
configPath = '%s/wp-config.php' % (child.path)
data = open(configPath, 'r').readlines()
for items in data:
if items.find('DB_NAME') > -1:
dbName = items.split("'")[3]
if mysqlUtilities.createDatabaseBackup(dbName, '/home/cyberpanel'):
break
else:
raise BaseException('Failed to create database backup.')
databasePath = '%s/%s.sql' % ('/home/cyberpanel', dbName)
command = "sed -i 's/%s/%s/g' %s" % (child.domain, child.master.domain, databasePath)
ProcessUtilities.executioner(command, 'cyberpanel')
## Restore to master domain
masterPath = '/home/%s/public_html' % (child.master.domain)
configPath = '%s/wp-config.php' % (masterPath)
data = open(configPath, 'r').readlines()
for items in data:
if items.find('DB_NAME') > -1:
dbNameRestore = items.split("'")[3]
if not mysqlUtilities.restoreDatabaseBackup(dbNameRestore, '/home/cyberpanel', None, 1, dbName):
try:
os.remove(databasePath)
except:
pass
raise BaseException('Failed to restore database backup.')
try:
os.remove(databasePath)
except:
pass
if eraseCheck:
sourcePath = child.path
destinationPath = '/home/%s/public_html' % (child.master.domain)
command = 'rsync -avzh --exclude "wp-config.php" %s/ %s' % (sourcePath, destinationPath)
ProcessUtilities.executioner(command, child.master.externalApp)
elif copyChanged:
sourcePath = child.path
destinationPath = '/home/%s/public_html' % (child.master.domain)
command = 'rsync -avzh --exclude "wp-config.php" %s/ %s' % (sourcePath, destinationPath)
ProcessUtilities.executioner(command, child.master.externalApp)
logging.statusWriter(tempStatusPath, 'Data copied..,[200]')
return 0
except BaseException, msg:
mesg = '%s. [404]' % (str(msg))
logging.statusWriter(tempStatusPath, mesg)

View File

@@ -286,7 +286,6 @@ app.controller('listWebsites', function ($scope, $http) {
} else { } else {
$("#listFail").fadeIn(); $("#listFail").fadeIn();
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
console.log(response.data);
} }
} }
@@ -447,9 +446,8 @@ app.controller('deleteWebsiteControl', function ($scope, $http) {
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data)
if (response.data.websiteDeleteStatus == 0) { if (response.data.websiteDeleteStatus === 0) {
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#websiteDeleteFailure").fadeIn(); $("#websiteDeleteFailure").fadeIn();
$("#websiteDeleteSuccess").hide(); $("#websiteDeleteSuccess").hide();
@@ -471,7 +469,6 @@ app.controller('deleteWebsiteControl', function ($scope, $http) {
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good");
} }
@@ -4943,7 +4940,6 @@ app.controller('sshAccess', function ($scope, $http, $timeout) {
} else { } else {
new PNotify({ new PNotify({
title: 'Error!', title: 'Error!',
text: response.data.error_message, text: response.data.error_message,
@@ -4970,3 +4966,299 @@ app.controller('sshAccess', function ($scope, $http, $timeout) {
}); });
/* Java script code to cloneWebsite */
app.controller('cloneWebsite', function ($scope, $http, $timeout, $window) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
var statusFile;
$scope.startCloning = function () {
$scope.cyberpanelLoading = false;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = true;
$scope.currentStatus = "Cloning started..";
url = "/websites/startCloning";
var data = {
masterDomain: $("#domainName").text(),
domainName: $scope.domain
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.status === 1) {
statusFile = response.data.tempStatusPath;
getCreationStatus();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
};
$scope.goBack = function () {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
$("#installProgress").css("width", "0%");
};
function getCreationStatus() {
url = "/websites/installWordpressStatus";
var data = {
statusFile: statusFile
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.abort === 1) {
if (response.data.installStatus === 1) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$("#installProgress").css("width", "100%");
$scope.installPercentage = "100";
$scope.currentStatus = response.data.currentStatus;
$timeout.cancel();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
$("#installProgress").css("width", "0%");
$scope.installPercentage = "0";
$scope.goBackDisable = false;
}
} else {
$("#installProgress").css("width", response.data.installationProgress + "%");
$scope.installPercentage = response.data.installationProgress;
$scope.currentStatus = response.data.currentStatus;
$timeout(getCreationStatus, 1000);
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
}
});
/* Java script code to cloneWebsite ends here */
/* Java script code to syncWebsite */
app.controller('syncWebsite', function ($scope, $http, $timeout, $window) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
var statusFile;
$scope.startSyncing = function () {
$scope.cyberpanelLoading = false;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = true;
$scope.currentStatus = "Cloning started..";
url = "/websites/startSync";
var data = {
childDomain: $("#childDomain").text(),
eraseCheck: $scope.eraseCheck,
dbCheck: $scope.dbCheck,
copyChanged: $scope.copyChanged
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.status === 1) {
statusFile = response.data.tempStatusPath;
getCreationStatus();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
};
$scope.goBack = function () {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = false;
$scope.installationProgress = true;
$scope.goBackDisable = true;
$("#installProgress").css("width", "0%");
};
function getCreationStatus() {
url = "/websites/installWordpressStatus";
var data = {
statusFile: statusFile
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.abort === 1) {
if (response.data.installStatus === 1) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$("#installProgress").css("width", "100%");
$scope.installPercentage = "100";
$scope.currentStatus = response.data.currentStatus;
$timeout.cancel();
} else {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
$scope.currentStatus = response.data.error_message;
$("#installProgress").css("width", "0%");
$scope.installPercentage = "0";
$scope.goBackDisable = false;
}
} else {
$("#installProgress").css("width", response.data.installationProgress + "%");
$scope.installPercentage = response.data.installationProgress;
$scope.currentStatus = response.data.currentStatus;
$timeout(getCreationStatus, 1000);
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.installationDetailsForm = true;
$scope.installationProgress = false;
$scope.goBackDisable = false;
}
}
});
/* Java script code to syncWebsite ends here */

View File

@@ -47,7 +47,6 @@
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Domain Name" %}</label> <label class="col-sm-3 control-label">{% trans "Domain Name" %}</label>
<div class="col-sm-6"> <div class="col-sm-6">
@@ -78,7 +77,6 @@
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Additional Features" %}</label> <label class="col-sm-3 control-label">{% trans "Additional Features" %}</label>
<div class="col-sm-9"> <div class="col-sm-9">
@@ -109,7 +107,6 @@
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-4"> <div class="col-sm-4">
@@ -120,7 +117,6 @@
</div> </div>
</div> </div>
<div ng-hide="installationProgress" class="form-group"> <div ng-hide="installationProgress" class="form-group">
<label class="col-sm-2 control-label"></label> <label class="col-sm-2 control-label"></label>
<div class="col-sm-7"> <div class="col-sm-7">

View File

@@ -26,6 +26,7 @@
<h3 class="content-box-header"> <h3 class="content-box-header">
{% trans "Resource Usage" %} {% trans "Resource Usage" %}
<a style="float: right; margin-left: 2%" class="btn btn-border btn-alt border-azure btn-link font-azure" href="/websites/{{ domain }}/{{ childDomain }}/syncToMaster" title=""><span>{% trans "Copy/Sync to Master" %}</span></a>
</h3> </h3>
<div class=""> <div class="">

View File

@@ -0,0 +1,88 @@
{% extends "baseTemplate/index.html" %}
{% load i18n %}
{% block title %}{% trans "Set up Staging Enviroment - CyberPanel" %}{% endblock %}
{% block content %}
{% load static %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "Set up Staging Enviroment" %}</h2>
<p>{% trans "Set up staging enviroment for " %} {{ domainName }}. {% trans ". Any domain that you will choose here will be created as child-domain for this master site." %}</p>
</div>
<div ng-controller="cloneWebsite" class="panel">
<div class="panel-body">
<h3 class="title-hero">
{% trans "Set up staging enviroment for " %}<span id="domainName">{{ domainName }}</span> <img
ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
<form name="websiteCreationForm" action="/" id="createPackages"
class="form-horizontal bordered-row">
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label"></label>
<label class="col-sm-4 control-label">{% trans "Domain that you will enter below will be created as child-domain to " %}
<spam id="domainName">{{ domainName }}</spam>
{% trans '.' %}</label>
</div>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Domain" %}</label>
<div class="col-sm-6">
<input type="text" class="form-control" ng-model="domain" required>
</div>
</div>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-click="startCloning()"
class="btn btn-primary btn-lg btn-block">{% trans "Start Cloning" %}</button>
</div>
</div>
<div ng-hide="installationProgress" class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-7">
<div class="alert alert-success text-center">
<h2>{$ currentStatus $}</h2>
</div>
<div class="progress">
<div id="installProgress" class="progress-bar" role="progressbar" aria-valuenow="70"
aria-valuemin="0" aria-valuemax="100" style="width:0%">
<span class="sr-only">70% Complete</span>
</div>
</div>
</div>
</div>
<div ng-hide="installationProgress" class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-disabled="goBackDisable" ng-click="goBack()"
class="btn btn-primary btn-lg">{% trans "Go Back" %}</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,104 @@
{% extends "baseTemplate/index.html" %}
{% load i18n %}
{% block title %}{% trans "Sync to Master - CyberPanel" %}{% endblock %}
{% block content %}
{% load static %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "Sync your site to Master" %}</h2>
<p>{% trans "Right now you can only sync your child domains to master domains."%} {{ childDomain }} {% trans " will be synced to " %} {{ domainName }}.</p>
</div>
<div ng-controller="syncWebsite" class="panel">
<div class="panel-body">
<h3 class="title-hero">
{% trans "Sync " %}<span id="childDomain">{{ childDomain }}</span> {% trans "to " %} <span id="domainName">{{ domainName }}</span><img
ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
<form name="websiteCreationForm" action="/" id="createPackages"
class="form-horizontal bordered-row">
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "What to Sync" %}</label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="eraseCheck" type="checkbox" value="">
Copy Complete Data
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="dbCheck" type="checkbox" value="">
Sync Database
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="copyChanged" type="checkbox" value="">
Copy Changed Files
</label>
</div>
</div>
</div>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-click="startSyncing()"
class="btn btn-primary btn-lg btn-block">{% trans "Start Syncing" %}</button>
</div>
</div>
<div ng-hide="installationProgress" class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-7">
<div class="alert alert-success text-center">
<h2>{$ currentStatus $}</h2>
</div>
<div class="progress">
<div id="installProgress" class="progress-bar" role="progressbar" aria-valuenow="70"
aria-valuemin="0" aria-valuemax="100" style="width:0%">
<span class="sr-only">70% Complete</span>
</div>
</div>
</div>
</div>
<div ng-hide="installationProgress" class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-4">
<button type="button" ng-disabled="goBackDisable" ng-click="goBack()"
class="btn btn-primary btn-lg">{% trans "Go Back" %}</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -26,6 +26,7 @@
<h3 class="content-box-header"> <h3 class="content-box-header">
{% trans "Resource Usage" %} <img ng-hide="domainLoading" src="/static/images/loading.gif"> {% trans "Resource Usage" %} <img ng-hide="domainLoading" src="/static/images/loading.gif">
<a style="float: right; margin-left: 2%" class="btn btn-border btn-alt border-azure btn-link font-azure" href="/websites/{{ domain }}/setupStaging" title=""><span>{% trans "Clone/Staging" %}</span></a>
<a style="float: right" class="btn btn-border btn-alt border-blue-alt btn-link font-blue-alt" href="/websites/{{ domain }}/sshAccess" title=""><span>{% trans "Set up SSH Access" %}</span></a> <a style="float: right" class="btn btn-border btn-alt border-blue-alt btn-link font-blue-alt" href="/websites/{{ domain }}/sshAccess" title=""><span>{% trans "Set up SSH Access" %}</span></a>
</h3> </h3>

View File

@@ -96,6 +96,13 @@ urlpatterns = [
url(r'^(?P<domain>(.*))/sshAccess$', views.sshAccess, name='sshAccess'), url(r'^(?P<domain>(.*))/sshAccess$', views.sshAccess, name='sshAccess'),
url(r'^saveSSHAccessChanges$', views.saveSSHAccessChanges, name='saveSSHAccessChanges'), url(r'^saveSSHAccessChanges$', views.saveSSHAccessChanges, name='saveSSHAccessChanges'),
## Staging Enviroment
url(r'^(?P<domain>(.*))/setupStaging$', views.setupStaging, name='setupStaging'),
url(r'^startCloning$', views.startCloning, name='startCloning'),
url(r'^(?P<domain>(.*))/(?P<childDomain>(.*))/syncToMaster$', views.syncToMaster, name='syncToMaster'),
url(r'^startSync$', views.startSync, name='startSync'),
url(r'^(?P<domain>(.*))/gitNotify$', views.gitNotify, name='gitNotify'), url(r'^(?P<domain>(.*))/gitNotify$', views.gitNotify, name='gitNotify'),
url(r'^detachRepo$', views.detachRepo, name='detachRepo'), url(r'^detachRepo$', views.detachRepo, name='detachRepo'),

View File

@@ -6,7 +6,7 @@ from django.http import HttpResponse
from loginSystem.models import Administrator from loginSystem.models import Administrator
from loginSystem.views import loadLoginPage from loginSystem.views import loadLoginPage
import json import json
from plogical.website import WebsiteManager from websiteFunctions.website import WebsiteManager
from websiteFunctions.pluginManager import pluginManager from websiteFunctions.pluginManager import pluginManager
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
@@ -622,3 +622,38 @@ def saveSSHAccessChanges(request):
return wm.saveSSHAccessChanges(userID, json.loads(request.body)) return wm.saveSSHAccessChanges(userID, json.loads(request.body))
except KeyError: except KeyError:
return redirect(loadLoginPage) return redirect(loadLoginPage)
def setupStaging(request, domain):
try:
userID = request.session['userID']
wm = WebsiteManager(domain)
return wm.setupStaging(request, userID)
except KeyError:
return redirect(loadLoginPage)
def startCloning(request):
try:
userID = request.session['userID']
wm = WebsiteManager()
return wm.startCloning(userID, json.loads(request.body))
except KeyError:
return redirect(loadLoginPage)
def syncToMaster(request, domain, childDomain):
try:
userID = request.session['userID']
wm = WebsiteManager(domain)
return wm.syncToMaster(request, userID, None, childDomain)
except KeyError:
return redirect(loadLoginPage)
def startSync(request):
try:
userID = request.session['userID']
wm = WebsiteManager()
return wm.startSync(userID, json.loads(request.body))
except KeyError:
return redirect(loadLoginPage)

2482
websiteFunctions/website.py Executable file

File diff suppressed because it is too large Load Diff