merge v2.1.2-dev

This commit is contained in:
Usman Nasir
2022-04-30 00:24:40 +05:00
5 changed files with 102 additions and 122 deletions

View File

@@ -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

View File

@@ -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 %}

View File

@@ -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

View File

@@ -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>

View File

@@ -1,5 +0,0 @@
[CyberPanel]
name=CyberPanel
baseurl=https://rep.cyberpanel.net/
gpgkey=https://rep.cyberpanel.net/RPM-GPG-KEY-cyberpanel
gpgcheck=1