mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-02-15 02:56:49 +01:00
merge v2.1.2-dev
This commit is contained in:
@@ -43,6 +43,7 @@ class IncJobs(multi.Thread):
|
||||
self.website = ''
|
||||
self.backupDestinations = ''
|
||||
self.jobid = 0
|
||||
self.jobids = ''
|
||||
self.metaPath = ''
|
||||
self.path = ''
|
||||
self.reconstruct = ''
|
||||
@@ -57,9 +58,9 @@ class IncJobs(multi.Thread):
|
||||
self.restorePoint()
|
||||
|
||||
def getRemoteBackups(self):
|
||||
if self.backupDestinations[:4] == 'sftp':
|
||||
path = '/home/backup/%s' % (self.website)
|
||||
command = 'export RESTIC_PASSWORD=%s PATH=${PATH}:/usr/bin && restic -r %s:%s snapshots' % (
|
||||
if self.backupDestinations == 'onedrive':
|
||||
path = '%s' % (self.website)
|
||||
command = 'export RESTIC_PASSWORD=%s PATH=${PATH}:/usr/bin && restic -r rclone:%s:%s snapshots' % (
|
||||
self.passwordFile, self.backupDestinations, path)
|
||||
return ProcessUtilities.outputExecutioner(command, self.externalApp).split('\n')
|
||||
else:
|
||||
@@ -184,8 +185,8 @@ class IncJobs(multi.Thread):
|
||||
|
||||
key, secret = self.getAWSData()
|
||||
|
||||
command = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s forget %s --password-file %s' % (
|
||||
key, secret, self.website, snapshotID, self.passwordFile)
|
||||
command = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s forget %s --prune --password-file %s' % (
|
||||
key, secret, self.website, self.jobids, self.passwordFile)
|
||||
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
@@ -194,11 +195,6 @@ class IncJobs(multi.Thread):
|
||||
else:
|
||||
logging.statusWriter(self.statusPath, 'Failed: %s. [5009]' % (result), 1)
|
||||
return 0
|
||||
|
||||
command = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s prune --password-file %s' % (
|
||||
key, secret, self.website, self.passwordFile)
|
||||
|
||||
ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
else:
|
||||
self.backupDestinations = self.jobid.destination
|
||||
|
||||
@@ -254,7 +250,7 @@ class IncJobs(multi.Thread):
|
||||
|
||||
repoLocation = '/home/%s/incbackup' % (self.website)
|
||||
|
||||
command = 'restic -r %s forget %s --password-file %s' % (repoLocation, self.jobid.snapshotid, self.passwordFile)
|
||||
command = 'restic -r %s forget %s --prune --password-file %s' % (repoLocation, self.jobids, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
if result.find('removed snapshot') > -1 or result.find('deleted') > -1:
|
||||
@@ -263,9 +259,6 @@ class IncJobs(multi.Thread):
|
||||
logging.statusWriter(self.statusPath, 'Failed: %s. [5009]' % (result), 1)
|
||||
return 0
|
||||
|
||||
command = 'restic -r %s prune --password-file %s' % (repoLocation, self.passwordFile)
|
||||
ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
return 1
|
||||
else:
|
||||
repoLocation = '/home/%s/incbackup' % (self.website)
|
||||
@@ -283,17 +276,17 @@ class IncJobs(multi.Thread):
|
||||
## Last argument delete is set when the snapshot is to be deleted from this repo, when this argument is set, any preceding argument is not used
|
||||
|
||||
def sftpFunction(self, backupPath, type, restore=None, delete=None):
|
||||
return 0
|
||||
|
||||
if restore == None:
|
||||
# Define our excludes file for use with restic
|
||||
backupExcludesFile = '/home/%s/backup-exclude.conf' % (self.website.domain)
|
||||
resticBackupExcludeCMD = ' --exclude-file=%s' % (backupExcludesFile)
|
||||
remotePath = '/home/backup/%s' % (self.website.domain)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s --exclude /home/%s/backup' % (
|
||||
remotePath = '%s' % (self.website.domain)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r rclone:%s:%s backup %s --password-file %s --exclude %s --exclude /home/%s/backup' % (
|
||||
self.backupDestinations, remotePath, backupPath, self.passwordFile, self.repoPath, self.website.domain)
|
||||
# If /home/%s/backup-exclude.conf file exists lets pass this to restic by appending the command to end.
|
||||
if os.path.isfile(backupExcludesFile):
|
||||
command = command + resticBackupExcludeCMD
|
||||
command = command + resticBackupExcludeCMD
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
if result.find('saved') == -1:
|
||||
@@ -313,9 +306,9 @@ class IncJobs(multi.Thread):
|
||||
newSnapshot.save()
|
||||
return 1
|
||||
elif delete:
|
||||
repoLocation = '/home/backup/%s' % (self.website)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s forget %s --password-file %s' % (
|
||||
self.jobid.destination, repoLocation, self.jobid.snapshotid, self.passwordFile)
|
||||
repoLocation = '%s' % (self.website)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r rclone:%s:%s forget %s --prune --password-file %s' % (
|
||||
self.jobid.destination, repoLocation, self.jobids, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
if result.find('removed snapshot') > -1 or result.find('deleted') > -1:
|
||||
@@ -323,13 +316,10 @@ class IncJobs(multi.Thread):
|
||||
else:
|
||||
logging.statusWriter(self.statusPath, 'Failed: %s. [5009]' % (result), 1)
|
||||
return 0
|
||||
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s prune --password-file %s' % (self.jobid.destination, repoLocation, self.passwordFile)
|
||||
ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
else:
|
||||
if self.reconstruct == 'remote':
|
||||
repoLocation = '/home/backup/%s' % (self.website)
|
||||
command = 'export RESTIC_PASSWORD=%s PATH=${PATH}:/usr/bin && restic -r %s:%s restore %s --target %s' % (
|
||||
repoLocation = '%s' % (self.website)
|
||||
command = 'export RESTIC_PASSWORD=%s PATH=${PATH}:/usr/bin && restic -r rclone:%s:%s restore %s --target %s' % (
|
||||
self.passwordFile,
|
||||
self.backupDestinations, repoLocation, self.jobid, self.restoreTarget)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
@@ -337,8 +327,8 @@ class IncJobs(multi.Thread):
|
||||
logging.statusWriter(self.statusPath, 'Failed: %s. [5009]' % (result), 1)
|
||||
return 0
|
||||
else:
|
||||
repoLocation = '/home/backup/%s' % (self.website)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s restore %s --target %s --password-file %s' % (
|
||||
repoLocation = '%s' % (self.website)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic -r rclone:%s:%s restore %s --target %s --password-file %s' % (
|
||||
self.jobid.destination, repoLocation, self.jobid.snapshotid, self.restoreTarget, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
if result.find('restoring') == -1:
|
||||
@@ -351,7 +341,7 @@ class IncJobs(multi.Thread):
|
||||
try:
|
||||
|
||||
if self.reconstruct == 'remote':
|
||||
if self.backupDestinations[:4] == 'sftp':
|
||||
if self.backupDestinations == 'onedrive':
|
||||
self.sftpFunction('none', 'none', 1)
|
||||
else:
|
||||
if self.awsFunction('restore', '', self.jobid) == 0:
|
||||
@@ -359,7 +349,7 @@ class IncJobs(multi.Thread):
|
||||
else:
|
||||
if self.jobid.destination == 'local':
|
||||
return self.localFunction('none', 'none', 1)
|
||||
elif self.jobid.destination[:4] == 'sftp':
|
||||
elif self.jobid.destination == 'onedrive':
|
||||
return self.sftpFunction('none', 'none', 1)
|
||||
else:
|
||||
return self.awsFunction('restore', '', self.jobid.snapshotid)
|
||||
@@ -374,7 +364,7 @@ class IncJobs(multi.Thread):
|
||||
try:
|
||||
|
||||
if self.reconstruct == 'remote':
|
||||
if self.backupDestinations[:4] == 'sftp':
|
||||
if self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -399,7 +389,7 @@ class IncJobs(multi.Thread):
|
||||
if self.jobid.destination == 'local':
|
||||
if self.localFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
elif self.jobid.destination[:4] == 'sftp':
|
||||
elif self.jobid.destination == 'onedrive':
|
||||
if self.sftpFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -430,7 +420,7 @@ class IncJobs(multi.Thread):
|
||||
try:
|
||||
|
||||
if self.reconstruct == 'remote':
|
||||
if self.backupDestinations[:4] == 'sftp':
|
||||
if self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -439,7 +429,7 @@ class IncJobs(multi.Thread):
|
||||
else:
|
||||
if self.jobid.destination == 'local':
|
||||
return self.localFunction('none', 'none', 1)
|
||||
elif self.jobid.destination[:4] == 'sftp':
|
||||
elif self.jobid.destination == 'onedrive':
|
||||
return self.sftpFunction('none', 'none', 1)
|
||||
else:
|
||||
return self.awsFunction('restore', '', self.jobid.snapshotid)
|
||||
@@ -454,7 +444,7 @@ class IncJobs(multi.Thread):
|
||||
try:
|
||||
|
||||
if self.reconstruct == 'remote':
|
||||
if self.backupDestinations[:4] == 'sftp':
|
||||
if self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -464,7 +454,7 @@ class IncJobs(multi.Thread):
|
||||
if self.jobid.destination == 'local':
|
||||
if self.localFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
elif self.jobid.destination[:4] == 'sftp':
|
||||
elif self.jobid.destination == 'onedrive':
|
||||
if self.sftpFunction('none', 'none', 1) == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -619,7 +609,7 @@ class IncJobs(multi.Thread):
|
||||
if self.backupDestinations == 'local':
|
||||
if self.localFunction(backupPath, 'data') == 0:
|
||||
return 0
|
||||
elif self.backupDestinations[:4] == 'sftp':
|
||||
elif self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction(backupPath, 'data') == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -669,7 +659,7 @@ class IncJobs(multi.Thread):
|
||||
if self.backupDestinations == 'local':
|
||||
if self.localFunction(dbPathNew, 'database') == 0:
|
||||
return 0
|
||||
elif self.backupDestinations[:4] == 'sftp':
|
||||
elif self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction(dbPathNew, 'database') == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -700,7 +690,7 @@ class IncJobs(multi.Thread):
|
||||
if self.backupDestinations == 'local':
|
||||
if self.localFunction(backupPath, 'email') == 0:
|
||||
return 0
|
||||
elif self.backupDestinations[:4] == 'sftp':
|
||||
elif self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction(backupPath, 'email') == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -723,7 +713,7 @@ class IncJobs(multi.Thread):
|
||||
if self.backupDestinations == 'local':
|
||||
if self.localFunction(backupPath, 'meta') == 0:
|
||||
return 0
|
||||
elif self.backupDestinations[:4] == 'sftp':
|
||||
elif self.backupDestinations == 'onedrive':
|
||||
if self.sftpFunction(backupPath, 'meta') == 0:
|
||||
return 0
|
||||
else:
|
||||
@@ -738,44 +728,42 @@ class IncJobs(multi.Thread):
|
||||
return 0
|
||||
|
||||
def initiateRepo(self):
|
||||
try:
|
||||
logging.statusWriter(self.statusPath, 'Will first initiate backup repo..', 1)
|
||||
|
||||
try:
|
||||
logging.statusWriter(self.statusPath, 'Checking for backup repo..', 1)
|
||||
if self.backupDestinations == 'local':
|
||||
command = 'restic init --repo %s --password-file %s' % (self.repoPath, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
if os.path.exists(ProcessUtilities.debugPath):
|
||||
logging.writeToFile(result)
|
||||
|
||||
if result.find('config file already exists') == -1:
|
||||
logging.statusWriter(self.statusPath, result, 1)
|
||||
|
||||
elif self.backupDestinations[:4] == 'sftp':
|
||||
remotePath = '/home/backup/%s' % (self.website.domain)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic init --repo %s:%s --password-file %s' % (
|
||||
self.backupDestinations, remotePath, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
if os.path.exists(ProcessUtilities.debugPath):
|
||||
logging.writeToFile(result)
|
||||
|
||||
if result.find('config file already exists') == -1:
|
||||
logging.statusWriter(self.statusPath, result, 1)
|
||||
checkcommand = 'restic --repo %s snapshots --password-file %s' % (self.repoPath, self.passwordFile)
|
||||
checkresult = ProcessUtilities.outputExecutioner(checkcommand)
|
||||
|
||||
if checkresult.find('Is there a repository at the following location') > -1:
|
||||
logging.statusWriter(self.statusPath, 'Initiating backup repo..', 1)
|
||||
command = 'restic init --repo %s --password-file %s' % (self.repoPath, self.passwordFile)
|
||||
elif self.backupDestinations == 'onedrive':
|
||||
checkcommand = 'restic -r rclone:%s:%s snapshots --password-file %s ' % (self.backupDestinations, self.website.domain, self.passwordFile)
|
||||
checkresult = ProcessUtilities.outputExecutioner(checkcommand)
|
||||
|
||||
if checkresult.find('Is there a repository at the following location') > -1:
|
||||
logging.statusWriter(self.statusPath, 'Initiating backup repo..', 1)
|
||||
command = 'export PATH=${PATH}:/usr/bin && restic init --repo rclone:%s:%s --password-file %s' % (
|
||||
self.backupDestinations, remotePath, self.passwordFile)
|
||||
else:
|
||||
key, secret = self.getAWSData()
|
||||
command = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s init --password-file %s' % (
|
||||
key, secret, self.website.domain, self.passwordFile)
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
|
||||
checkcommand = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s snapshots --password-file %s' % (
|
||||
key, secret, self.website.domain, self.passwordFile)
|
||||
checkresult = ProcessUtilities.outputExecutioner(checkcommand, self.externalApp)
|
||||
|
||||
if checkresult.find('Is there a repository at the following location') > -1:
|
||||
logging.statusWriter(self.statusPath, 'Initiating backup repo..', 1)
|
||||
key, secret = self.getAWSData()
|
||||
command = 'export AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s && restic -r s3:s3.amazonaws.com/%s init --password-file %s' % (
|
||||
key, secret, self.website.domain, self.passwordFile)
|
||||
|
||||
if checkresult.find('Is there a repository at the following location') > -1:
|
||||
result = ProcessUtilities.outputExecutioner(command, self.externalApp)
|
||||
if os.path.exists(ProcessUtilities.debugPath):
|
||||
logging.writeToFile(result)
|
||||
|
||||
if result.find('config file already exists') == -1:
|
||||
logging.statusWriter(self.statusPath, result, 1)
|
||||
|
||||
logging.statusWriter(self.statusPath,
|
||||
'Repo %s initiated for %s.' % (self.backupDestinations, self.website.domain), 1)
|
||||
logging.statusWriter(self.statusPath, 'Repo %s initiated for %s.' % (self.backupDestinations, self.website.domain), 1)
|
||||
else:
|
||||
logging.statusWriter(self.statusPath, 'OK', 1)
|
||||
|
||||
return 1
|
||||
except BaseException as msg:
|
||||
logging.statusWriter(self.statusPath, '%s. [IncJobs.initiateRepo.47][5009]' % str(msg), 1)
|
||||
@@ -811,9 +799,9 @@ Subject: %s
|
||||
|
||||
### Checking if restic is installed before moving on
|
||||
|
||||
command = 'restic'
|
||||
command = 'restic version'
|
||||
|
||||
if ProcessUtilities.outputExecutioner(command).find('restic is a backup program which') == -1:
|
||||
if ProcessUtilities.outputExecutioner(command).find('compiled with') == -1:
|
||||
try:
|
||||
|
||||
CentOSPath = '/etc/redhat-release'
|
||||
@@ -870,7 +858,7 @@ Subject: %s
|
||||
## Completed password generation
|
||||
|
||||
if self.initiateRepo() == 0:
|
||||
return 0
|
||||
return 0
|
||||
|
||||
if self.prepareBackupMeta() == 0:
|
||||
return 0
|
||||
@@ -921,24 +909,21 @@ Subject: %s
|
||||
self.website = job_snapshots[0].job.website.domain
|
||||
self.externalApp = job_snapshots[0].job.website.externalApp
|
||||
self.passwordFile = '/home/%s/%s' % (self.website, self.website)
|
||||
|
||||
for job_snapshot in job_snapshots:
|
||||
|
||||
## Functions above use the self.jobid varilable to extract information about this snapshot, so this below variable needs to be set
|
||||
|
||||
## Functions above use the self.jobid variable to extract information about this snapshot, so this below variable needs to be set
|
||||
self.jobid = job_snapshot
|
||||
self.jobids = self.jobids + job_snapshot.snapshotid + ' '
|
||||
|
||||
if self.jobid.destination == 'local':
|
||||
self.localFunction('none', 'none', 0, 1)
|
||||
elif self.jobid.destination[:4] == 'sftp':
|
||||
self.sftpFunction('none', 'none', 0, 1)
|
||||
else:
|
||||
self.awsFunction('restore', '', self.jobid.snapshotid, None, 1)
|
||||
if self.jobid.destination == 'local':
|
||||
self.localFunction('none', 'none', 0, 1)
|
||||
elif self.jobid.destination == 'onedrive':
|
||||
self.sftpFunction('none', 'none', 0, 1)
|
||||
else:
|
||||
self.awsFunction('restore', '', 0, None, 1)
|
||||
|
||||
return 1
|
||||
|
||||
except BaseException as msg:
|
||||
logging.statusWriter(self.statusPath, "%s [903:DeleteSnapShot][5009]" % (str(msg)), 1)
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<label class="col-sm-3 control-label">{% trans "Select Type" %} </label>
|
||||
<div class="col-sm-6">
|
||||
<select ng-change="fetchDetails()" ng-model="destinationType" class="form-control">
|
||||
{# <option>SFTP</option>#}
|
||||
<option>SFTP</option>
|
||||
<option>AWS</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -181,4 +181,4 @@
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -291,7 +291,7 @@ def submit_backup_creation(request):
|
||||
|
||||
data = json.loads(request.body)
|
||||
backup_domain = data['websiteToBeBacked']
|
||||
backup_destinations = data['backupDestinations']
|
||||
backup_destinations = 'onedrive'
|
||||
|
||||
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
|
||||
pass
|
||||
|
||||
@@ -297,31 +297,31 @@
|
||||
<ul id="sidebar-menu">
|
||||
<li class="header"><span>{% trans "Overview" %}</span></li>
|
||||
<li>
|
||||
<a href="#" title="{% trans 'Server IP Address' %}">
|
||||
<a id="sidebar-menu-item-server-ip-address" href="#" title="{% trans 'Server IP Address' %}">
|
||||
<i class="glyph-icon tooltip-button icon-laptop" title="{% trans 'Server IP Address' %}"
|
||||
data-original-title=".icon-laptop"></i>
|
||||
<span style="color: #db6868;font-weight: bold;">{{ ipAddress }}</span>
|
||||
</a>
|
||||
<a href="{% url 'index' %}" title="{% trans 'Dashboard' %}">
|
||||
<a id="sidebar-menu-item-dashboard" href="{% url 'index' %}" title="{% trans 'Dashboard' %}">
|
||||
<i class="glyph-icon icon-dashboard"></i>
|
||||
<span>{% trans "Dashboard" %}</span>
|
||||
</a>
|
||||
{% if admin or versionManagement %}
|
||||
<a href="{% url 'versionManagment' %}"
|
||||
<a id="sidebar-menu-item-version-management" href="{% url 'versionManagment' %}"
|
||||
title="{% trans 'Version Management' %}">
|
||||
<i class="glyph-icon tooltip-button icon-info"
|
||||
title="{% trans 'Version Management' %}" data-original-title=".icon-cloud-upload"
|
||||
aria-describedby="tooltip896208"></i>
|
||||
<span>{% trans "Version Management" %}</span>
|
||||
</a>
|
||||
<a href="{% url 'design' %}"
|
||||
<a id="sidebar-menu-item-design" href="{% url 'design' %}"
|
||||
title="{% trans 'Design' %}">
|
||||
<i class="glyph-icon tooltip-button icon-cog"
|
||||
title="{% trans 'Design' %}" data-original-title=".icon-cloud-upload"
|
||||
aria-describedby="tooltip896208"></i>
|
||||
<span>{% trans "Design" %}</span>
|
||||
</a>
|
||||
<a href="https://go.cyberpanel.net/cloud"
|
||||
<a id="sidebar-menu-item-connect" href="https://go.cyberpanel.net/cloud"
|
||||
title="{% trans 'Connect' %}">
|
||||
<i class="glyph-icon tooltip-button icon-link" title="{% trans 'Connect' %}"
|
||||
data-original-title=".icon-cloud-upload" aria-describedby="tooltip896208"></i>
|
||||
@@ -339,7 +339,7 @@
|
||||
<li class="divider"></li>
|
||||
<li class="header"><span>{% trans "Main" %}</span></li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-users">
|
||||
<a href="{% url 'loadUsersHome' %}" title="{% trans 'Users' %}">
|
||||
<i class="glyph-icon icon-users" title="{% trans 'Users' %}"></i>
|
||||
<span>{% trans "Users" %}</span>
|
||||
@@ -389,7 +389,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-websites">
|
||||
<a href="{% url 'loadWebsitesHome' %}" title="{% trans 'Websites' %}">
|
||||
<div class="glyph-icon icon-globe" title="{% trans 'Websites' %}"></div>
|
||||
<span>{% trans "Websites" %}</span>
|
||||
@@ -430,7 +430,7 @@
|
||||
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
<li>
|
||||
<li id="sidebar-menu-item-packages">
|
||||
<a id="packageHome" href="{% url 'packagesHome' %}" title="{% trans 'Packages' %}">
|
||||
<i class="glyph-icon icon-cubes"></i>
|
||||
<span>{% trans "Packages" %}</span>
|
||||
@@ -462,7 +462,7 @@
|
||||
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
<li>
|
||||
<li id="sidebar-menu-item-databases">
|
||||
<a title="{% trans 'Databases' %}">
|
||||
<i class="glyph-icon icon-database" title="{% trans 'Databases' %}"></i>
|
||||
<span>{% trans "Databases" %}</span>
|
||||
@@ -497,7 +497,7 @@
|
||||
|
||||
{% if dnsAsWhole %}
|
||||
|
||||
<li class="dnsAsWhole">
|
||||
<li id="sidebar-menu-item-dns" class="dnsAsWhole">
|
||||
<a title="{% trans 'DNS' %}">
|
||||
<i class="glyph-icon icon-sitemap"></i>
|
||||
<span>{% trans "DNS" %}</span>
|
||||
@@ -545,7 +545,7 @@
|
||||
|
||||
{% if emailAsWhole %}
|
||||
|
||||
<li class="emailAsWhole">
|
||||
<li id="sidebar-menu-item-email" class="emailAsWhole">
|
||||
<a href="{% url 'loadEmailHome' %}" title="{% trans 'Email' %}">
|
||||
<i class="glyph-icon icon-paper-plane"></i>
|
||||
<span>{% trans "Email" %}</span>
|
||||
@@ -596,7 +596,7 @@
|
||||
{% endif %}
|
||||
{% if ftpAsWhole %}
|
||||
|
||||
<li class="ftpAsWhole">
|
||||
<li id="sidebar-menu-item-ftp" class="ftpAsWhole">
|
||||
<a href="{% url 'ftpHome' %}" title="{% trans 'FTP' %}">
|
||||
<i class="glyph-icon icon-cloud-upload"></i>
|
||||
<span>{% trans "FTP" %}</span>
|
||||
@@ -626,7 +626,7 @@
|
||||
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-backup">
|
||||
<a href="{% url 'loadBackupHome' %}" title="{% trans 'Backup' %}">
|
||||
<i class="glyph-icon tooltip-button icon-copy" title=".icon-folder"></i>
|
||||
<span>{% trans "Backup" %}</span>
|
||||
@@ -670,7 +670,7 @@
|
||||
</li>
|
||||
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-incremental-backup">
|
||||
<a href="{% url 'loadBackupHome' %}" title="{% trans 'Incremental Backup - Beta' %}">
|
||||
<i class="glyph-icon tooltip-button icon-save" title="Incremental Backup"></i>
|
||||
<span>{% trans "Incremental Backup" %}</span>
|
||||
@@ -704,7 +704,7 @@
|
||||
</li>
|
||||
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-ssl">
|
||||
<a href="{% url 'loadSSLHome' %}" title="{% trans 'Backup' %}">
|
||||
<i class="glyph-icon tooltip-button icon-lock" title="{% trans 'SSL' %}"></i>
|
||||
<span>{% trans "SSL" %}</span>
|
||||
@@ -762,7 +762,7 @@
|
||||
{# </div><!-- .sidebar-submenu -->#}
|
||||
{# </li>#}
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-cloudlinux">
|
||||
<a href="#" title="{% trans 'CloudLinux' %}">
|
||||
<i class="glyph-icon icon-linecons-fire"></i>
|
||||
<span>{% trans "CloudLinux" %}</span>
|
||||
@@ -794,7 +794,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-containerization">
|
||||
<a href="#" title="{% trans 'Containerization' %}">
|
||||
<i class="glyph-icon icon-linecons-fire"></i>
|
||||
<span>{% trans "Containerization" %}</span>
|
||||
@@ -811,7 +811,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-docker">
|
||||
<a href="#" title="{% trans 'Docker' %}">
|
||||
<i class="glyph-icon icon-cogs"></i>
|
||||
<span>{% trans "Docker Manager" %}</span>
|
||||
@@ -834,7 +834,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-tuning">
|
||||
<a href="#" title="{% trans 'Tuning' %}">
|
||||
<i class="glyph-icon icon-adjust"></i>
|
||||
<span>{% trans "Tuning" %}</span>
|
||||
@@ -853,7 +853,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-server-status">
|
||||
<a href="#" title="{% trans 'Server Status' %}">
|
||||
<i class="glyph-icon icon-cog"></i>
|
||||
<span>{% trans "Server Status" %}</span>
|
||||
@@ -878,7 +878,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-php">
|
||||
<a href="{% url 'loadPHPHome' %}" title="{% trans 'PHP' %}">
|
||||
<i class="glyph-icon icon-code"></i>
|
||||
<span>{% trans "PHP" %}</span>
|
||||
@@ -897,7 +897,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-server-status">
|
||||
<a href="{% url 'logsHome' %}" title="{% trans 'Server Status' %}">
|
||||
<i class="glyph-icon icon-file"></i>
|
||||
<span>{% trans "Logs" %}</span>
|
||||
@@ -931,7 +931,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-security">
|
||||
<a href="{% url 'securityHome' %}" title="{% trans 'Security' %}">
|
||||
<i class="glyph-icon icon-shield"></i>
|
||||
<span>{% trans "Security" %}</span>
|
||||
@@ -968,7 +968,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li class="emailAsWhole">
|
||||
<li id="sidebar-menu-item-mail-settings" class="emailAsWhole">
|
||||
<a href="#" title="{% trans 'Mail Settings' %}">
|
||||
<i class="glyph-icon icon-envelope"></i>
|
||||
<span>{% trans "Mail Settings" %}</span>
|
||||
@@ -1000,7 +1000,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-manage-services">
|
||||
<a href="#" title="{% trans 'Manage Services' %}">
|
||||
<i class="glyph-icon icon-folder-open"></i>
|
||||
<span>{% trans "Manage Services" %}</span>
|
||||
@@ -1028,7 +1028,7 @@
|
||||
</div><!-- .sidebar-submenu -->
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<li id="sidebar-menu-item-plugins">
|
||||
<a href="#" title="{% trans 'Plugins' %}">
|
||||
<i class="glyph-icon icon-plug"></i>
|
||||
<span>{% trans "Plugins" %}</span>
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
[CyberPanel]
|
||||
name=CyberPanel
|
||||
baseurl=https://rep.cyberpanel.net/
|
||||
gpgkey=https://rep.cyberpanel.net/RPM-GPG-KEY-cyberpanel
|
||||
gpgcheck=1
|
||||
Reference in New Issue
Block a user