mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-31 02:15:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			2528 lines
		
	
	
		
			98 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			2528 lines
		
	
	
		
			98 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/local/CyberCP/bin/python
 | |
| import os
 | |
| import os.path
 | |
| import sys
 | |
| from io import StringIO
 | |
| 
 | |
| import django
 | |
| import paramiko
 | |
| 
 | |
| from plogical.applicationInstaller import ApplicationInstaller
 | |
| from plogical.httpProc import httpProc
 | |
| 
 | |
| sys.path.append('/usr/local/CyberCP')
 | |
| os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
 | |
| django.setup()
 | |
| import json
 | |
| from plogical.acl import ACLManager
 | |
| import plogical.CyberCPLogFileWriter as logging
 | |
| from websiteFunctions.models import Websites, Backups, dest, backupSchedules, BackupJob, GDrive, GDriveSites
 | |
| from plogical.virtualHostUtilities import virtualHostUtilities
 | |
| import subprocess
 | |
| import shlex
 | |
| from django.shortcuts import HttpResponse, render
 | |
| from loginSystem.models import Administrator
 | |
| from plogical.mailUtilities import mailUtilities
 | |
| from random import randint
 | |
| import time
 | |
| import plogical.backupUtilities as backupUtil
 | |
| from plogical.processUtilities import ProcessUtilities
 | |
| from multiprocessing import Process
 | |
| import requests
 | |
| import google.oauth2.credentials
 | |
| import googleapiclient.discovery
 | |
| from googleapiclient.discovery import build
 | |
| from websiteFunctions.models import NormalBackupDests, NormalBackupJobs, NormalBackupSites
 | |
| from plogical.IncScheduler import IncScheduler
 | |
| from django.http import JsonResponse
 | |
| 
 | |
| class BackupManager:
 | |
|     localBackupPath = '/home/cyberpanel/localBackupPath'
 | |
| 
 | |
|     def __init__(self, domain=None, childDomain=None):
 | |
|         self.domain = domain
 | |
|         self.childDomain = childDomain
 | |
| 
 | |
|     def loadBackupHome(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             proc = httpProc(request, 'backup/index.html', currentACL)
 | |
|             return proc.render()
 | |
|         except BaseException as msg:
 | |
|             return HttpResponse(str(msg))
 | |
| 
 | |
|     def backupSite(self, request=None, userID=None, data=None):
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
| 
 | |
|         command = 'chmod 755 /home/backup'
 | |
|         ProcessUtilities.executioner(command)
 | |
| 
 | |
|         proc = httpProc(request, 'backup/backup.html', {'websiteList': websitesName}, 'createBackup')
 | |
|         return proc.render()
 | |
| 
 | |
|     def RestoreV2backupSite(self, request=None, userID=None, data=None):
 | |
|         if ACLManager.CheckForPremFeature('all'):
 | |
|             BackupStat = 1
 | |
|         else:
 | |
|             BackupStat = 0
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(request, 'IncBackups/RestoreV2Backup.html', {'websiteList': websitesName, 'BackupStat': BackupStat}, 'createBackup')
 | |
|         return proc.render()
 | |
| 
 | |
|     def CreateV2backupSite(self, request=None, userID=None, data=None):
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(request, 'IncBackups/CreateV2Backup.html', {'websiteList': websitesName}, 'createBackup')
 | |
|         return proc.render()
 | |
|     def DeleteRepoV2(self, request=None, userID=None, data=None):
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(request, 'IncBackups/DeleteV2repo.html', {'websiteList': websitesName}, 'createBackup')
 | |
|         return proc.render()
 | |
| 
 | |
|     def schedulev2Backups(self, request=None, userID=None, data=None):
 | |
| 
 | |
|         if ACLManager.CheckForPremFeature('all'):
 | |
|             BackupStat = 1
 | |
|         else:
 | |
|             BackupStat = 0
 | |
| 
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(request, 'IncBackups/ScheduleV2Backup.html', {'websiteList': websitesName, "BackupStat": BackupStat}, 'createBackup')
 | |
|         return proc.render()
 | |
| 
 | |
|     def gDrive(self, request=None, userID=None, data=None):
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         admin = Administrator.objects.get(pk=userID)
 | |
|         gDriveAcctsList = []
 | |
|         gDriveAccts = admin.gdrive_set.all()
 | |
|         for items in gDriveAccts:
 | |
|             gDriveAcctsList.append(items.name)
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(request, 'backup/googleDrive.html', {'accounts': gDriveAcctsList, 'websites': websitesName},
 | |
|                         'createBackup')
 | |
|         return proc.render()
 | |
| 
 | |
|     def gDriveSetup(self, userID=None, request=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0:
 | |
|                 return ACLManager.loadError()
 | |
| 
 | |
|             gDriveData = {}
 | |
|             gDriveData['token'] = request.GET.get('t')
 | |
|             gDriveData['refresh_token'] = request.GET.get('r')
 | |
|             gDriveData['token_uri'] = request.GET.get('to')
 | |
|             gDriveData['scopes'] = request.GET.get('s')
 | |
| 
 | |
|             gD = GDrive(owner=admin, name=request.GET.get('n'), auth=json.dumps(gDriveData))
 | |
|             gD.save()
 | |
| 
 | |
|             return self.gDrive(request, userID)
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def fetchDriveLogs(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             recordsToShow = int(data['recordsToShow'])
 | |
|             page = int(str(data['page']).strip('\n'))
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             logs = gD.gdrivejoblogs_set.all().order_by('-id')
 | |
| 
 | |
|             from s3Backups.s3Backups import S3Backups
 | |
| 
 | |
|             pagination = S3Backups.getPagination(len(logs), recordsToShow)
 | |
|             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow)
 | |
|             logs = logs[finalPageNumber:endPageNumber]
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
|             counter = 0
 | |
| 
 | |
|             from plogical.backupSchedule import backupSchedule
 | |
| 
 | |
|             for log in logs:
 | |
| 
 | |
|                 if log.status == backupSchedule.INFO:
 | |
|                     status = 'INFO'
 | |
|                 else:
 | |
|                     status = 'ERROR'
 | |
| 
 | |
|                 dic = {
 | |
|                     'type': status,
 | |
|                     'message': log.message
 | |
|                 }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|                 counter = counter + 1
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
| 
 | |
|             data_ret = {'status': 1, 'logs': json_data, 'pagination': pagination}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def fetchgDriveSites(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             recordsToShow = int(data['recordsToShow'])
 | |
|             page = int(str(data['page']).strip('\n'))
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             websites = gD.gdrivesites_set.all()
 | |
| 
 | |
|             from s3Backups.s3Backups import S3Backups
 | |
| 
 | |
|             pagination = S3Backups.getPagination(len(websites), recordsToShow)
 | |
|             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow)
 | |
|             finalWebsites = websites[finalPageNumber:endPageNumber]
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
|             counter = 0
 | |
| 
 | |
|             from plogical.backupSchedule import backupSchedule
 | |
| 
 | |
|             for website in finalWebsites:
 | |
| 
 | |
|                 dic = {
 | |
|                     'name': website.domain
 | |
|                 }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|                 counter = counter + 1
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
| 
 | |
|             currently = gD.runTime
 | |
| 
 | |
|             data_ret = {'status': 1, 'websites': json_data, 'pagination': pagination, 'currently': currently}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def addSitegDrive(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             selectedWebsite = data['selectedWebsite']
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL) == 1 and ACLManager.checkOwnership(
 | |
|                     selectedWebsite, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             gdSite = GDriveSites(owner=gD, domain=selectedWebsite)
 | |
|             gdSite.save()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def deleteAccountgDrive(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL):
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             gD.delete()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def changeAccountFrequencygDrive(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             backupFrequency = data['backupFrequency']
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL):
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             gD.runTime = backupFrequency
 | |
| 
 | |
|             gD.save()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
| 
 | |
|     def changeFileRetention(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             Retentiontime = data['Retentiontime']
 | |
|             # logging.CyberCPLogFileWriter.writeToFile("...... FileRetentiontime...%s "%Retentiontime)
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
|             # logging.CyberCPLogFileWriter.writeToFile("...... GDrive obj...%s " % GDrive)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL):
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
| 
 | |
| 
 | |
|             conf = gD.auth
 | |
|             # logging.CyberCPLogFileWriter.writeToFile("...... conf...%s " % conf)
 | |
|             config = json.loads(conf)
 | |
|             # logging.CyberCPLogFileWriter.writeToFile("...... config...%s " % config)
 | |
|             config['FileRetentiontime'] = Retentiontime
 | |
| 
 | |
|             gD.auth=json.dumps(config)
 | |
|             gD.save()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def deleteSitegDrive(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             website = data['website']
 | |
| 
 | |
|             gD = GDrive.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.checkGDriveOwnership(gD, admin, currentACL) == 1 and ACLManager.checkOwnership(website, admin,
 | |
|                                                                                                          currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('status', 0)
 | |
| 
 | |
|             sites = GDriveSites.objects.filter(owner=gD, domain=website)
 | |
| 
 | |
|             for items in sites:
 | |
|                 items.delete()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def restoreSite(self, request=None, userID=None, data=None):
 | |
|         path = os.path.join("/home", "backup")
 | |
|         if not os.path.exists(path):
 | |
|             proc = httpProc(request, 'backup/restore.html', None, 'restoreBackup')
 | |
|             return proc.render()
 | |
|         else:
 | |
|             all_files = []
 | |
|             ext = ".tar.gz"
 | |
| 
 | |
|             command = 'sudo chown -R  cyberpanel:cyberpanel ' + path
 | |
|             ACLManager.executeCall(command)
 | |
| 
 | |
|             files = os.listdir(path)
 | |
|             for filename in files:
 | |
|                 if filename.endswith(ext):
 | |
|                     all_files.append(filename)
 | |
|             proc = httpProc(request, 'backup/restore.html', {'backups': all_files}, 'restoreBackup')
 | |
|             return proc.render()
 | |
| 
 | |
|     def getCurrentBackups(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             backupDomain = data['websiteToBeBacked']
 | |
| 
 | |
|             if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('fetchStatus', 0)
 | |
| 
 | |
|             if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             website = Websites.objects.get(domain=backupDomain)
 | |
| 
 | |
|             backups = website.backups_set.all()
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
| 
 | |
|             for items in backups:
 | |
|                 if items.status == 0:
 | |
|                     status = "Pending"
 | |
|                 else:
 | |
|                     status = "Completed"
 | |
|                 dic = {'id': items.id,
 | |
|                        'file': items.fileName,
 | |
|                        'date': items.date,
 | |
|                        'size': items.size,
 | |
|                        'status': status
 | |
|                        }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
|             final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data})
 | |
|             return HttpResponse(final_json)
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def submitBackupCreation(self, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             backupDomain = data['websiteToBeBacked']
 | |
|             website = Websites.objects.get(domain=backupDomain)
 | |
| 
 | |
|             if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson('metaStatus', 0)
 | |
| 
 | |
|             ## defining paths
 | |
| 
 | |
|             ## /home/example.com/backup
 | |
|             backupPath = os.path.join("/home", backupDomain, "backup/")
 | |
|             backupDomainName = data['websiteToBeBacked']
 | |
|             backupName = 'backup-' + backupDomainName + "-" + time.strftime("%m.%d.%Y_%H-%M-%S")
 | |
| 
 | |
|             ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52
 | |
|             tempStoragePath = os.path.join(backupPath, backupName)
 | |
| 
 | |
|             p = Process(target=backupUtil.submitBackupCreation,
 | |
|                         args=(tempStoragePath, backupName, backupPath, backupDomain))
 | |
|             p.start()
 | |
| 
 | |
|             time.sleep(2)
 | |
| 
 | |
|             final_json = json.dumps(
 | |
|                 {'status': 1, 'metaStatus': 1, 'error_message': "None", 'tempStorage': tempStoragePath})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(str(msg))
 | |
|             final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def backupStatus(self, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             backupDomain = data['websiteToBeBacked']
 | |
|             status = os.path.join("/home", backupDomain, "backup/status")
 | |
|             backupFileNamePath = os.path.join("/home", backupDomain, "backup/backupFileName")
 | |
|             pid = os.path.join("/home", backupDomain, "backup/pid")
 | |
| 
 | |
|             domain = Websites.objects.get(domain=backupDomain)
 | |
| 
 | |
|             ## read file name
 | |
| 
 | |
|             try:
 | |
|                 command = "sudo cat " + backupFileNamePath
 | |
|                 fileName = ProcessUtilities.outputExecutioner(command, domain.externalApp)
 | |
|                 if fileName.find('No such file or directory') > -1:
 | |
|                     final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0, "abort": 0})
 | |
|                     return HttpResponse(final_json)
 | |
|             except:
 | |
|                 fileName = "Fetching.."
 | |
| 
 | |
|             ## file name read ends
 | |
| 
 | |
|             if os.path.exists(status):
 | |
|                 command = "sudo cat " + status
 | |
|                 status = ProcessUtilities.outputExecutioner(command, domain.externalApp)
 | |
| 
 | |
|                 if status.find("Completed") > -1:
 | |
| 
 | |
|                     ### Removing Files
 | |
| 
 | |
|                     command = 'sudo rm -f ' + status
 | |
|                     ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                     command = 'sudo rm -f ' + backupFileNamePath
 | |
|                     ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                     command = 'sudo rm -f ' + pid
 | |
|                     ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                     final_json = json.dumps(
 | |
|                         {'backupStatus': 1, 'error_message': "None", "status": status, "abort": 1,
 | |
|                          'fileName': fileName, })
 | |
|                     return HttpResponse(final_json)
 | |
| 
 | |
|                 elif status.find("[5009]") > -1:
 | |
|                     ## removing status file, so that backup can re-run
 | |
|                     try:
 | |
|                         command = 'sudo rm -f ' + status
 | |
|                         ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                         command = 'sudo rm -f ' + backupFileNamePath
 | |
|                         ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                         command = 'sudo rm -f ' + pid
 | |
|                         ProcessUtilities.executioner(command, domain.externalApp)
 | |
| 
 | |
|                         backupObs = Backups.objects.filter(fileName=fileName)
 | |
|                         for items in backupObs:
 | |
|                             items.delete()
 | |
| 
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|                     final_json = json.dumps(
 | |
|                         {'backupStatus': 1, 'fileName': fileName, 'error_message': "None", "status": status,
 | |
|                          "abort": 1})
 | |
|                     return HttpResponse(final_json)
 | |
|                 else:
 | |
|                     final_json = json.dumps(
 | |
|                         {'backupStatus': 1, 'error_message': "None", 'fileName': fileName, "status": status,
 | |
|                          "abort": 0})
 | |
|                     return HttpResponse(final_json)
 | |
|             else:
 | |
|                 final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0, "abort": 0})
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'backupStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]")
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def cancelBackupCreation(self, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             backupCancellationDomain = data['backupCancellationDomain']
 | |
|             fileName = data['fileName']
 | |
| 
 | |
|             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py"
 | |
|             execPath = execPath + " cancelBackupCreation --backupCancellationDomain " + backupCancellationDomain + " --fileName " + fileName
 | |
|             subprocess.call(shlex.split(execPath))
 | |
| 
 | |
|             try:
 | |
|                 backupOb = Backups.objects.get(fileName=fileName)
 | |
|                 backupOb.delete()
 | |
|             except BaseException as msg:
 | |
|                 logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]")
 | |
| 
 | |
|             final_json = json.dumps({'abortStatus': 1, 'error_message': "None", "status": 0})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'abortStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def deleteBackup(self, userID=None, data=None):
 | |
|         try:
 | |
|             backupID = data['backupID']
 | |
|             backup = Backups.objects.get(id=backupID)
 | |
| 
 | |
|             domainName = backup.website.domain
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             if ACLManager.checkOwnership(domainName, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             path = "/home/" + domainName + "/backup/" + backup.fileName + ".tar.gz"
 | |
|             command = 'sudo rm -f ' + path
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             backup.delete()
 | |
| 
 | |
|             final_json = json.dumps({'status': 1, 'deleteStatus': 1, 'error_message': "None"})
 | |
|             return HttpResponse(final_json)
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'deleteStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
| 
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def submitRestore(self, data=None, userID=None):
 | |
|         try:
 | |
|             backupFile = data['backupFile']
 | |
|             originalFile = "/home/backup/" + backupFile
 | |
| 
 | |
|             if not os.path.exists(originalFile):
 | |
|                 dir = data['dir']
 | |
|             else:
 | |
|                 dir = "CyberPanelRestore"
 | |
| 
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             if currentACL['admin'] == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             execPath = "sudo nice -n 10 /usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py"
 | |
|             execPath = execPath + " submitRestore --backupFile " + backupFile + " --dir " + dir
 | |
|             ProcessUtilities.popenExecutioner(execPath)
 | |
|             time.sleep(4)
 | |
| 
 | |
|             final_dic = {'restoreStatus': 1, 'error_message': "None"}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'restoreStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def restoreStatus(self, data=None):
 | |
|         try:
 | |
|             backupFile = data['backupFile'].strip(".tar.gz")
 | |
| 
 | |
|             path = os.path.join("/home", "backup", data['backupFile'])
 | |
| 
 | |
|             if os.path.exists(path):
 | |
|                 path = os.path.join("/home", "backup", backupFile)
 | |
|             elif os.path.exists(data['backupFile']):
 | |
|                 path = data['backupFile'].strip(".tar.gz")
 | |
|             else:
 | |
|                 dir = data['dir']
 | |
|                 path = "/home/backup/transfer-" + str(dir) + "/" + backupFile
 | |
| 
 | |
|             if os.path.exists(path):
 | |
|                 try:
 | |
|                     execPath = "sudo cat " + path + "/status"
 | |
|                     status = ProcessUtilities.outputExecutioner(execPath)
 | |
| 
 | |
|                     if status.find("Done") > -1:
 | |
| 
 | |
|                         command = "sudo rm -rf " + path
 | |
|                         ProcessUtilities.executioner(command)
 | |
| 
 | |
|                         final_json = json.dumps(
 | |
|                             {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 1,
 | |
|                              'running': 'Completed'})
 | |
|                         return HttpResponse(final_json)
 | |
|                     elif status.find("[5009]") > -1:
 | |
|                         ## removing temporarily generated files while restoring
 | |
|                         command = "sudo rm -rf " + path
 | |
|                         ProcessUtilities.executioner(command)
 | |
|                         final_json = json.dumps({'restoreStatus': 1, 'error_message': "None",
 | |
|                                                  "status": status, 'abort': 1, 'alreadyRunning': 0,
 | |
|                                                  'running': 'Error'})
 | |
|                         return HttpResponse(final_json)
 | |
|                     else:
 | |
|                         final_json = json.dumps(
 | |
|                             {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0,
 | |
|                              'running': 'Running..'})
 | |
|                         return HttpResponse(final_json)
 | |
| 
 | |
|                 except BaseException as msg:
 | |
|                     logging.CyberCPLogFileWriter.writeToFile(str(msg))
 | |
|                     status = "Just Started"
 | |
|                     final_json = json.dumps(
 | |
|                         {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0,
 | |
|                          'running': 'Running..'})
 | |
|                     return HttpResponse(final_json)
 | |
|             else:
 | |
|                 final_json = json.dumps(
 | |
|                     {'restoreStatus': 1, 'error_message': "None", "status": "OK To Run", 'running': 'Halted',
 | |
|                      'abort': 1})
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'restoreStatus': 0, 'error_message': str(msg), 'abort': 0, 'running': 'Running..', 'status': ''}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def backupDestinations(self, request=None, userID=None, data=None):
 | |
|         proc = httpProc(request, 'backup/backupDestinations.html', {}, 'addDeleteDestinations')
 | |
|         return proc.render()
 | |
| 
 | |
|     def submitDestinationCreation(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0:
 | |
|                 return ACLManager.loadErrorJson('destStatus', 0)
 | |
| 
 | |
|             finalDic = {}
 | |
| 
 | |
|             if data['type'] == 'SFTP':
 | |
| 
 | |
|                 finalDic['ipAddress'] = data['IPAddress']
 | |
|                 finalDic['password'] = data['password']
 | |
| 
 | |
|                 try:
 | |
|                     finalDic['port'] = data['backupSSHPort']
 | |
|                 except:
 | |
|                     finalDic['port'] = "22"
 | |
| 
 | |
|                 try:
 | |
|                     finalDic['user'] = data['userName']
 | |
|                 except:
 | |
|                     finalDic['user'] = "root"
 | |
| 
 | |
|                 execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py"
 | |
|                 execPath = execPath + " submitDestinationCreation --ipAddress " + finalDic['ipAddress'] + " --password " \
 | |
|                            + finalDic['password'] + " --port " + finalDic['port'] + ' --user %s' % (finalDic['user'])
 | |
| 
 | |
|                 if os.path.exists(ProcessUtilities.debugPath):
 | |
|                     logging.CyberCPLogFileWriter.writeToFile(execPath)
 | |
| 
 | |
|                 output = ProcessUtilities.outputExecutioner(execPath)
 | |
| 
 | |
|                 if os.path.exists(ProcessUtilities.debugPath):
 | |
|                     logging.CyberCPLogFileWriter.writeToFile(output)
 | |
| 
 | |
|                 if output.find('1,') > -1:
 | |
| 
 | |
|                     config = {'type': data['type'], 'ip': data['IPAddress'], 'username': data['userName'],
 | |
|                               'port': data['backupSSHPort'], 'path': data['path']}
 | |
|                     nd = NormalBackupDests(name=data['name'], config=json.dumps(config))
 | |
|                     nd.save()
 | |
| 
 | |
|                     final_dic = {'status': 1, 'destStatus': 1, 'error_message': "None"}
 | |
|                     final_json = json.dumps(final_dic)
 | |
|                     return HttpResponse(final_json)
 | |
|                 else:
 | |
|                     final_dic = {'status': 0, 'destStatus': 0, 'error_message': output}
 | |
|                     final_json = json.dumps(final_dic)
 | |
|                     return HttpResponse(final_json)
 | |
|             else:
 | |
|                 config = {'type': data['type'], 'path': data['path']}
 | |
|                 nd = NormalBackupDests(name=data['name'], config=json.dumps(config))
 | |
|                 nd.save()
 | |
| 
 | |
|                 final_dic = {'status': 1, 'destStatus': 1, 'error_message': "None"}
 | |
|                 final_json = json.dumps(final_dic)
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'destStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def getCurrentBackupDestinations(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0:
 | |
|                 return ACLManager.loadErrorJson('fetchStatus', 0)
 | |
| 
 | |
|             destinations = NormalBackupDests.objects.all()
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
| 
 | |
|             for items in destinations:
 | |
| 
 | |
|                 config = json.loads(items.config)
 | |
| 
 | |
|                 if config['type'] == data['type']:
 | |
|                     if config['type'] == 'SFTP':
 | |
|                         dic = {
 | |
|                             'name': items.name,
 | |
|                             'ip': config['ip'],
 | |
|                             'username': config['username'],
 | |
|                             'path': config['path'],
 | |
|                             'port': config['port'],
 | |
|                         }
 | |
|                     else:
 | |
|                         dic = {
 | |
|                             'name': items.name,
 | |
|                             'path': config['path'],
 | |
|                         }
 | |
| 
 | |
|                     if checker == 0:
 | |
|                         json_data = json_data + json.dumps(dic)
 | |
|                         checker = 1
 | |
|                     else:
 | |
|                         json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
|             final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def getConnectionStatus(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0:
 | |
|                 return ACLManager.loadErrorJson('connStatus', 0)
 | |
| 
 | |
|             ipAddress = data['IPAddress']
 | |
| 
 | |
|             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py"
 | |
|             execPath = execPath + " getConnectionStatus --ipAddress " + ipAddress
 | |
| 
 | |
|             output = ProcessUtilities.executioner(execPath)
 | |
| 
 | |
|             if output.find('1,') > -1:
 | |
|                 final_dic = {'connStatus': 1, 'error_message': "None"}
 | |
|                 final_json = json.dumps(final_dic)
 | |
|                 return HttpResponse(final_json)
 | |
|             else:
 | |
|                 final_dic = {'connStatus': 0, 'error_message': output}
 | |
|                 final_json = json.dumps(final_dic)
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'connStatus': 1, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def deleteDestination(self, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0:
 | |
|                 return ACLManager.loadErrorJson('delStatus', 0)
 | |
| 
 | |
|             nameOrPath = data['nameOrPath']
 | |
|             type = data['type']
 | |
| 
 | |
|             NormalBackupDests.objects.get(name=nameOrPath).delete()
 | |
| 
 | |
|             final_dic = {'status': 1, 'delStatus': 1, 'error_message': "None"}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'delStatus': 1, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def scheduleBackup(self, request, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadError()
 | |
|             
 | |
|             destinations = NormalBackupDests.objects.all()
 | |
|             dests = []
 | |
|             for dest in destinations:
 | |
|                 dests.append(dest.name)
 | |
|             websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|             proc = httpProc(request, 'backup/backupSchedule.html', {'destinations': dests, 'websites': websitesName},
 | |
|                             'scheduleBackups')
 | |
|             return proc.render()
 | |
|         except Exception as msg:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [scheduleBackup]')
 | |
|             return HttpResponse("Error: " + str(msg))
 | |
| 
 | |
|     def getCurrentBackupSchedules(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('fetchStatus', 0)
 | |
| 
 | |
|             records = backupSchedules.objects.all()
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
| 
 | |
|             for items in records:
 | |
|                 dic = {'id': items.id,
 | |
|                        'destLoc': items.dest.destLoc,
 | |
|                        'frequency': items.frequency,
 | |
|                        }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
|             final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "data": json_data})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'fetchStatus': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def submitBackupSchedule(self, userID=None, data=None):
 | |
|         try:
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             name = data['name']
 | |
|             backupFrequency = data['backupFrequency']
 | |
|             backupRetention = data['backupRetention']
 | |
| 
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             nbd = NormalBackupDests.objects.get(name=selectedAccount)
 | |
| 
 | |
|             config = {'frequency': backupFrequency,
 | |
|                       'retention': backupRetention}
 | |
| 
 | |
|             # Check if a job with this name already exists
 | |
|             existing_job = NormalBackupJobs.objects.filter(name=name).first()
 | |
|             if existing_job:
 | |
|                 # Update existing job instead of creating a new one
 | |
|                 existing_job.owner = nbd
 | |
|                 existing_job.config = json.dumps(config)
 | |
|                 existing_job.save()
 | |
|             else:
 | |
|                 # Create new job
 | |
|                 nbj = NormalBackupJobs(owner=nbd, name=name, config=json.dumps(config))
 | |
|                 nbj.save()
 | |
| 
 | |
|             final_json = json.dumps({'status': 1, 'scheduleStatus': 0})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_json = json.dumps({'status': 0, 'scheduleStatus': 0, 'error_message': str(msg)})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def scheduleDelete(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             backupDest = data['destLoc']
 | |
|             backupFreq = data['frequency']
 | |
|             findTxt = ""
 | |
| 
 | |
|             if backupDest == "Home" and backupFreq == "Daily":
 | |
|                 findTxt = "0 3"
 | |
|             elif backupDest == "Home" and backupFreq == "Weekly":
 | |
|                 findTxt = "0 0"
 | |
|             elif backupDest != "Home" and backupFreq == "Daily":
 | |
|                 findTxt = "0 3"
 | |
|             elif backupDest != "Home" and backupFreq == "Weekly":
 | |
|                 findTxt = "0 0"
 | |
| 
 | |
|             ###
 | |
| 
 | |
|             logging.CyberCPLogFileWriter.writeToFile(findTxt)
 | |
|             logging.CyberCPLogFileWriter.writeToFile(backupFreq)
 | |
| 
 | |
|             path = "/etc/crontab"
 | |
| 
 | |
|             command = "cat " + path
 | |
|             output = ProcessUtilities.outputExecutioner(command).split('\n')
 | |
|             tempCronPath = "/home/cyberpanel/" + str(randint(1000, 9999))
 | |
| 
 | |
|             writeToFile = open(tempCronPath, 'w')
 | |
| 
 | |
|             for items in output:
 | |
|                 if (items.find(findTxt) > -1 and items.find("backupScheduleLocal.py") > -1) or (
 | |
|                         items.find(findTxt) > -1 and items.find('backupSchedule.py')):
 | |
|                     continue
 | |
|                 else:
 | |
|                     writeToFile.writelines(items + '\n')
 | |
| 
 | |
|             writeToFile.close()
 | |
| 
 | |
|             command = "sudo mv " + tempCronPath + " " + path
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             command = 'chown root:root %s' % (path)
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             command = "sudo systemctl restart crond"
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             destination = dest.objects.get(destLoc=backupDest)
 | |
|             newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq)
 | |
|             newSchedule.delete()
 | |
| 
 | |
|             final_json = json.dumps({'delStatus': 1, 'error_message': "None"})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_json = json.dumps({'delStatus': 0, 'error_message': str(msg)})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def remoteBackups(self, request, userID=None, data=None):
 | |
|         proc = httpProc(request, 'backup/remoteBackups.html', None, 'remoteBackups')
 | |
|         return proc.render()
 | |
| 
 | |
|     def submitRemoteBackups(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             ipAddress = data['ipAddress']
 | |
|             password = data['password']
 | |
| 
 | |
|             ## Ask for Remote version of CyberPanel
 | |
| 
 | |
|             try:
 | |
|                 finalData = json.dumps({'username': "admin", "password": password})
 | |
| 
 | |
|                 url = "https://" + ipAddress + ":8090/api/cyberPanelVersion"
 | |
| 
 | |
|                 r = requests.post(url, data=finalData, verify=False)
 | |
| 
 | |
|                 data = json.loads(r.text)
 | |
| 
 | |
|                 if data['getVersion'] == 1:
 | |
| 
 | |
|                     if float(data['currentVersion']) >= 1.6 and data['build'] >= 0:
 | |
|                         pass
 | |
|                     else:
 | |
|                         data_ret = {'status': 0,
 | |
|                                     'error_message': "Your version does not match with version of remote server.",
 | |
|                                     "dir": "Null"}
 | |
|                         data_ret = json.dumps(data_ret)
 | |
|                         return HttpResponse(data_ret)
 | |
|                 else:
 | |
|                     data_ret = {'status': 0,
 | |
|                                 'error_message': "Not able to fetch version of remote server. Error Message: " +
 | |
|                                                  data[
 | |
|                                                      'error_message'], "dir": "Null"}
 | |
|                     data_ret = json.dumps(data_ret)
 | |
|                     return HttpResponse(data_ret)
 | |
| 
 | |
| 
 | |
|             except BaseException as msg:
 | |
|                 data_ret = {'status': 0,
 | |
|                             'error_message': "Not able to fetch version of remote server. Error Message: " + str(
 | |
|                                 msg),
 | |
|                             "dir": "Null"}
 | |
|                 data_ret = json.dumps(data_ret)
 | |
|                 return HttpResponse(data_ret)
 | |
| 
 | |
|             ## Fetch public key of remote server!
 | |
| 
 | |
|             finalData = json.dumps({'username': "admin", "password": password})
 | |
| 
 | |
|             url = "https://" + ipAddress + ":8090/api/fetchSSHkey"
 | |
|             r = requests.post(url, data=finalData, verify=False)
 | |
|             data = json.loads(r.text)
 | |
| 
 | |
|             if data['pubKeyStatus'] == 1:
 | |
|                 pubKey = data["pubKey"].strip("\n")
 | |
|             else:
 | |
|                 final_json = json.dumps({'status': 0,
 | |
|                                          'error_message': "I am sorry, I could not fetch key from remote server. Error Message: " +
 | |
|                                                           data['error_message']
 | |
|                                          })
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|             ## write key
 | |
| 
 | |
|             ## Writing key to a temporary location, to be read later by backup process.
 | |
| 
 | |
|             mailUtilities.checkHome()
 | |
| 
 | |
|             pathToKey = "/home/cyberpanel/" + str(randint(1000, 9999))
 | |
| 
 | |
|             vhost = open(pathToKey, "w")
 | |
|             vhost.write(pubKey)
 | |
|             vhost.close()
 | |
| 
 | |
|             ##
 | |
| 
 | |
|             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py"
 | |
|             execPath = execPath + " writeAuthKey --pathToKey " + pathToKey
 | |
|             output = ProcessUtilities.outputExecutioner(execPath)
 | |
| 
 | |
|             if output.find("1,None") > -1:
 | |
|                 pass
 | |
|             else:
 | |
|                 final_json = json.dumps({'status': 0, 'error_message': output})
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|             ##
 | |
| 
 | |
|             try:
 | |
|                 finalData = json.dumps({'username': "admin", "password": password})
 | |
| 
 | |
|                 url = "https://" + ipAddress + ":8090/api/fetchAccountsFromRemoteServer"
 | |
| 
 | |
|                 r = requests.post(url, data=finalData, verify=False)
 | |
| 
 | |
|                 data = json.loads(r.text)
 | |
| 
 | |
|                 if data['fetchStatus'] == 1:
 | |
|                     json_data = data['data']
 | |
|                     data_ret = {'status': 1, 'error_message': "None",
 | |
|                                 "dir": "Null", 'data': json_data}
 | |
|                     data_ret = json.dumps(data_ret)
 | |
|                     return HttpResponse(data_ret)
 | |
|                 else:
 | |
|                     data_ret = {'status': 0,
 | |
|                                 'error_message': "Not able to fetch accounts from remote server. Error Message: " +
 | |
|                                                  data['error_message'], "dir": "Null"}
 | |
|                     data_ret = json.dumps(data_ret)
 | |
|                     return HttpResponse(data_ret)
 | |
|             except BaseException as msg:
 | |
|                 data_ret = {'status': 0,
 | |
|                             'error_message': "Not able to fetch accounts from remote server. Error Message: " + str(
 | |
|                                 msg), "dir": "Null"}
 | |
|                 data_ret = json.dumps(data_ret)
 | |
|                 return HttpResponse(data_ret)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_json = json.dumps({'status': 0, 'error_message': str(msg)})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def starRemoteTransfer(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('remoteTransferStatus', 0)
 | |
| 
 | |
|             ipAddress = data['ipAddress']
 | |
|             password = data['password']
 | |
|             accountsToTransfer = data['accountsToTransfer']
 | |
| 
 | |
|             try:
 | |
| 
 | |
|                 #this command is for enable permit root login over SSH:
 | |
|                 command = "sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config && sudo service ssh restart"
 | |
|                 ProcessUtilities.executioner(command, None, True)
 | |
| 
 | |
| 
 | |
|                 # this command is for enable permit root login over SSH:
 | |
|                 command = "sudo sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && sudo systemctl restart sshd"
 | |
|                 ProcessUtilities.executioner(command, None, True)
 | |
| 
 | |
|                 # this command is for get port of SSH:
 | |
|                 command = """grep -oP '^Port \K\d+' /etc/ssh/sshd_config | head -n 1"""
 | |
|                 output = ProcessUtilities.outputExecutioner(command)
 | |
|                 port = output.strip('\n')
 | |
| 
 | |
| 
 | |
|                 ### if value of port return empty then int function fails which means port is not set so defaults to 22
 | |
|                 try:
 | |
|                     portT = int(port)
 | |
|                 except:
 | |
|                     port = '22'
 | |
| 
 | |
| 
 | |
|                 ipFile = os.path.join("/etc", "cyberpanel", "machineIP")
 | |
|                 f = open(ipFile)
 | |
|                 ownIP = f.read()
 | |
| 
 | |
|                 finalData = json.dumps({'username': "admin", "password": password, "ipAddress": ownIP,
 | |
|                                         "accountsToTransfer": accountsToTransfer, 'port': port})
 | |
| 
 | |
|                 url = "https://" + ipAddress + ":8090/api/remoteTransfer"
 | |
| 
 | |
|                 r = requests.post(url, data=finalData, verify=False)
 | |
| 
 | |
|                 if os.path.exists('/usr/local/CyberCP/debug'):
 | |
|                     message = 'Remote transfer initiation status: %s' % (r.text)
 | |
|                     logging.CyberCPLogFileWriter.writeToFile(message)
 | |
| 
 | |
|                 data = json.loads(r.text)
 | |
| 
 | |
|                 if data['transferStatus'] == 1:
 | |
| 
 | |
|                     ## Create local backup dir
 | |
| 
 | |
|                     localBackupDir = os.path.join("/home", "backup")
 | |
| 
 | |
|                     if not os.path.exists(localBackupDir):
 | |
|                         command = "sudo mkdir " + localBackupDir
 | |
|                         ProcessUtilities.executioner(command)
 | |
| 
 | |
|                     ## create local directory that will host backups
 | |
| 
 | |
|                     localStoragePath = "/home/backup/transfer-" + str(data['dir'])
 | |
| 
 | |
|                     ## making local storage directory for backups
 | |
| 
 | |
|                     command = "sudo mkdir " + localStoragePath
 | |
|                     ProcessUtilities.executioner(command)
 | |
| 
 | |
|                     command = 'chmod 600 %s' % (localStoragePath)
 | |
|                     ProcessUtilities.executioner(command)
 | |
| 
 | |
|                     final_json = json.dumps(
 | |
|                         {'remoteTransferStatus': 1, 'error_message': "None", "dir": data['dir']})
 | |
|                     return HttpResponse(final_json)
 | |
|                 else:
 | |
|                     final_json = json.dumps({'remoteTransferStatus': 0,
 | |
|                                              'error_message': "Can not initiate remote transfer. Error message: " +
 | |
|                                                               data['error_message']})
 | |
|                     return HttpResponse(final_json)
 | |
| 
 | |
|             except BaseException as msg:
 | |
|                 final_json = json.dumps({'remoteTransferStatus': 0,
 | |
|                                          'error_message': "Can not initiate remote transfer. Error message: " +
 | |
|                                                           str(msg)})
 | |
|                 return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_json = json.dumps({'remoteTransferStatus': 0, 'error_message': str(msg)})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|     def getRemoteTransferStatus(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('remoteTransferStatus', 0)
 | |
| 
 | |
|             ipAddress = data['ipAddress']
 | |
|             password = data['password']
 | |
|             dir = data['dir']
 | |
|             username = "admin"
 | |
| 
 | |
|             finalData = json.dumps({'dir': dir, "username": username, "password": password})
 | |
|             r = requests.post("https://" + ipAddress + ":8090/api/FetchRemoteTransferStatus", data=finalData,
 | |
|                               verify=False)
 | |
| 
 | |
|             data = json.loads(r.text)
 | |
| 
 | |
|             if data['fetchStatus'] == 1:
 | |
|                 if data['status'].find("Backups are successfully generated and received on") > -1:
 | |
| 
 | |
|                     data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'],
 | |
|                             'backupsSent': 1}
 | |
|                     json_data = json.dumps(data)
 | |
|                     return HttpResponse(json_data)
 | |
|                 elif data['status'].find("[5010]") > -1:
 | |
|                     data = {'remoteTransferStatus': 0, 'error_message': data['status'],
 | |
|                             'backupsSent': 0}
 | |
|                     json_data = json.dumps(data)
 | |
|                     return HttpResponse(json_data)
 | |
|                 else:
 | |
|                     data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'],
 | |
|                             'backupsSent': 0}
 | |
|                     json_data = json.dumps(data)
 | |
|                     return HttpResponse(json_data)
 | |
|             else:
 | |
|                 data = {'remoteTransferStatus': 0, 'error_message': data['error_message'],
 | |
|                         'backupsSent': 0}
 | |
|                 json_data = json.dumps(data)
 | |
|                 return HttpResponse(json_data)
 | |
|         except BaseException as msg:
 | |
|             data = {'remoteTransferStatus': 0, 'error_message': str(msg), 'backupsSent': 0}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def remoteBackupRestore(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('remoteTransferStatus', 0)
 | |
| 
 | |
|             backupDir = data['backupDir']
 | |
| 
 | |
|             backupDirComplete = "/home/backup/transfer-" + str(backupDir)
 | |
|             # adminEmail = admin.email
 | |
| 
 | |
|             ##
 | |
| 
 | |
|             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py"
 | |
|             execPath = execPath + " remoteBackupRestore --backupDirComplete " + backupDirComplete + " --backupDir " + str(
 | |
|                 backupDir)
 | |
| 
 | |
|             ProcessUtilities.popenExecutioner(execPath)
 | |
| 
 | |
|             time.sleep(3)
 | |
| 
 | |
|             data = {'remoteRestoreStatus': 1, 'error_message': 'None'}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data = {'remoteRestoreStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def localRestoreStatus(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('remoteTransferStatus', 0)
 | |
| 
 | |
|             backupDir = data['backupDir']
 | |
| 
 | |
|             # admin = Administrator.objects.get(userName=username)
 | |
|             backupLogPath = "/home/backup/transfer-" + backupDir + "/" + "backup_log"
 | |
| 
 | |
|             removalPath = "/home/backup/transfer-" + str(backupDir)
 | |
| 
 | |
|             time.sleep(3)
 | |
| 
 | |
|             command = "sudo cat " + backupLogPath
 | |
|             status = ProcessUtilities.outputExecutioner(command)
 | |
| 
 | |
| 
 | |
|             if status.find("Error") > -1:
 | |
|                 Error_find = "There was an error during the backup process. Please review the log for more information."
 | |
|                 status = status + Error_find
 | |
| 
 | |
| 
 | |
| 
 | |
|             if status.find("completed[success]") > -1:
 | |
|                 command = "rm -rf " + removalPath
 | |
|                 ProcessUtilities.executioner(command)
 | |
|                 data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 1}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|             elif status.find("[5010]") > -1:
 | |
|                 command = "sudo rm -rf " + removalPath
 | |
|                 ProcessUtilities.executioner(command)
 | |
|                 data = {'remoteTransferStatus': 0, 'error_message': status,
 | |
|                         "status": "None", "complete": 0}
 | |
|                 json_data = json.dumps(data)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|             else:
 | |
|                 data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 0}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data = {'remoteTransferStatus': 0, 'error_message': str(msg), "status": "None", "complete": 0}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def cancelRemoteBackup(self, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('cancelStatus', 0)
 | |
| 
 | |
|             ipAddress = data['ipAddress']
 | |
|             password = data['password']
 | |
|             dir = data['dir']
 | |
|             username = "admin"
 | |
| 
 | |
|             finalData = json.dumps({'dir': dir, "username": username, "password": password})
 | |
|             r = requests.post("https://" + ipAddress + ":8090/api/cancelRemoteTransfer", data=finalData,
 | |
|                               verify=False)
 | |
| 
 | |
|             data = json.loads(r.text)
 | |
| 
 | |
|             if data['cancelStatus'] == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 logging.CyberCPLogFileWriter.writeToFile(
 | |
|                     "Some error cancelling at remote server, see the log file for remote server.")
 | |
| 
 | |
|             path = "/home/backup/transfer-" + str(dir)
 | |
|             pathpid = path + "/pid"
 | |
| 
 | |
|             command = "sudo cat " + pathpid
 | |
|             pid = ProcessUtilities.outputExecutioner(command)
 | |
| 
 | |
|             command = "sudo kill -KILL " + pid
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             command = "sudo rm -rf " + path
 | |
|             ProcessUtilities.executioner(command)
 | |
| 
 | |
|             data = {'cancelStatus': 1, 'error_message': "None"}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data = {'cancelStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def backupLogs(self, request=None, userID=None, data=None):
 | |
|         all_files = []
 | |
|         logFiles = BackupJob.objects.all().order_by('-id')
 | |
|         for logFile in logFiles:
 | |
|             all_files.append(logFile.logFile)
 | |
|         proc = httpProc(request, 'backup/backupLogs.html', {'backups': all_files}, 'admin')
 | |
|         return proc.render()
 | |
| 
 | |
|     def fetchLogs(self, userID=None, data=None):
 | |
|         try:
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if currentACL['admin'] == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadError()
 | |
| 
 | |
|             page = int(str(data['page']).rstrip('\n'))
 | |
|             recordsToShow = int(data['recordsToShow'])
 | |
|             logFile = data['logFile']
 | |
| 
 | |
|             logJob = BackupJob.objects.get(logFile=logFile)
 | |
| 
 | |
|             logs = logJob.backupjoblogs_set.all()
 | |
| 
 | |
|             from s3Backups.s3Backups import S3Backups
 | |
|             from plogical.backupSchedule import backupSchedule
 | |
| 
 | |
|             pagination = S3Backups.getPagination(len(logs), recordsToShow)
 | |
|             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow)
 | |
|             finalLogs = logs[finalPageNumber:endPageNumber]
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
|             counter = 0
 | |
| 
 | |
|             for log in finalLogs:
 | |
| 
 | |
|                 if log.status == backupSchedule.INFO:
 | |
|                     status = 'INFO'
 | |
|                 else:
 | |
|                     status = 'ERROR'
 | |
| 
 | |
|                 dic = {
 | |
|                     'LEVEL': status, "Message": log.message
 | |
|                 }
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
|                 counter = counter + 1
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
| 
 | |
|             if logJob.location == backupSchedule.LOCAL:
 | |
|                 location = 'local'
 | |
|             else:
 | |
|                 location = 'remote'
 | |
| 
 | |
|             data = {
 | |
|                 'status': 1,
 | |
|                 'error_message': 'None',
 | |
|                 'logs': json_data,
 | |
|                 'pagination': pagination,
 | |
|                 'jobSuccessSites': logJob.jobSuccessSites,
 | |
|                 'jobFailedSites': logJob.jobFailedSites,
 | |
|                 'location': location
 | |
|             }
 | |
| 
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data = {'remoteRestoreStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def fetchgNormalSites(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
|             recordsToShow = int(data['recordsToShow'])
 | |
|             page = int(str(data['page']).strip('\n'))
 | |
| 
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             try:
 | |
|                 nbd = NormalBackupJobs.objects.get(name=selectedAccount)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbd = NormalBackupJobs.objects.filter(name=selectedAccount).first()
 | |
| 
 | |
|             websites = nbd.normalbackupsites_set.all()
 | |
| 
 | |
|             from s3Backups.s3Backups import S3Backups
 | |
| 
 | |
|             pagination = S3Backups.getPagination(len(websites), recordsToShow)
 | |
|             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow)
 | |
|             finalWebsites = websites[finalPageNumber:endPageNumber]
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
|             counter = 0
 | |
| 
 | |
|             from plogical.backupSchedule import backupSchedule
 | |
| 
 | |
|             for website in finalWebsites:
 | |
| 
 | |
|                 dic = {
 | |
|                     'name': website.domain.domain
 | |
|                 }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|                 counter = counter + 1
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
| 
 | |
|             config = json.loads(nbd.config)
 | |
| 
 | |
|             try:
 | |
|                 lastRun = config[IncScheduler.lastRun]
 | |
|             except:
 | |
|                 lastRun = 'Never'
 | |
| 
 | |
|             try:
 | |
|                 allSites = config[IncScheduler.allSites]
 | |
|             except:
 | |
|                 allSites = 'Selected Only'
 | |
| 
 | |
|             try:
 | |
|                 frequency = config[IncScheduler.frequency]
 | |
|             except:
 | |
|                 frequency = 'Never'
 | |
| 
 | |
|             try:
 | |
|                 retention = config[IncScheduler.retention]
 | |
|             except:
 | |
|                 retention = 'Never'
 | |
| 
 | |
|             try:
 | |
|                 currentStatus = config[IncScheduler.currentStatus]
 | |
|             except:
 | |
|                 currentStatus = 'Not running'
 | |
| 
 | |
|             data_ret = {
 | |
|                 'status': 1,
 | |
|                 'websites': json_data,
 | |
|                 'pagination': pagination,
 | |
|                 'lastRun': lastRun,
 | |
|                 'allSites': allSites,
 | |
|                 'currently': frequency,
 | |
|                 'currentStatus': currentStatus
 | |
|             }
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def fetchNormalJobs(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedAccount = data['selectedAccount']
 | |
| 
 | |
|             nbd = NormalBackupDests.objects.get(name=selectedAccount)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             allJobs = nbd.normalbackupjobs_set.all()
 | |
| 
 | |
|             alljbs = []
 | |
| 
 | |
|             for items in allJobs:
 | |
|                 alljbs.append(items.name)
 | |
| 
 | |
|             data_ret = {'status': 1, 'jobs': alljbs}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def addSiteNormal(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             selectedJob = data['selectedJob']
 | |
|             type = data['type']
 | |
| 
 | |
|             try:
 | |
|                 nbj = NormalBackupJobs.objects.get(name=selectedJob)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbj = NormalBackupJobs.objects.filter(name=selectedJob).first()
 | |
| 
 | |
|             if type == 'all':
 | |
|                 config = json.loads(nbj.config)
 | |
| 
 | |
|                 try:
 | |
|                     if config[IncScheduler.allSites] == 'all':
 | |
|                         config[IncScheduler.allSites] = 'Selected Only'
 | |
|                         nbj.config = json.dumps(config)
 | |
|                         nbj.save()
 | |
|                         data_ret = {'status': 1}
 | |
|                         json_data = json.dumps(data_ret)
 | |
|                         return HttpResponse(json_data)
 | |
|                 except:
 | |
|                     pass
 | |
|                 config[IncScheduler.allSites] = type
 | |
|                 nbj.config = json.dumps(config)
 | |
|                 nbj.save()
 | |
| 
 | |
|                 data_ret = {'status': 1}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|             selectedWebsite = data['selectedWebsite']
 | |
| 
 | |
|             website = Websites.objects.get(domain=selectedWebsite)
 | |
| 
 | |
|             try:
 | |
|                 NormalBackupSites.objects.get(owner=nbj, domain=website)
 | |
|             except:
 | |
|                 NormalBackupSites(owner=nbj, domain=website).save()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def deleteSiteNormal(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedJob = data['selectedJob']
 | |
|             selectedWebsite = data['website']
 | |
| 
 | |
|             try:
 | |
|                 nbj = NormalBackupJobs.objects.get(name=selectedJob)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbj = NormalBackupJobs.objects.filter(name=selectedJob).first()
 | |
|             website = Websites.objects.get(domain=selectedWebsite)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             try:
 | |
|                 NormalBackupSites.objects.get(owner=nbj, domain=website).delete()
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def changeAccountFrequencyNormal(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedJob = data['selectedJob']
 | |
|             backupFrequency = data['backupFrequency']
 | |
| 
 | |
| 
 | |
|             try:
 | |
|                 nbj = NormalBackupJobs.objects.get(name=selectedJob)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbj = NormalBackupJobs.objects.filter(name=selectedJob).first()
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             config = json.loads(nbj.config)
 | |
|             config[IncScheduler.frequency] = backupFrequency
 | |
|             try:
 | |
|                 backupRetention = data['backupRetention']
 | |
|                 config[IncScheduler.retention] = backupRetention
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
| 
 | |
|             nbj.config = json.dumps(config)
 | |
|             nbj.save()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
| 
 | |
|     def deleteAccountNormal(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedJob = data['selectedJob']
 | |
| 
 | |
|             try:
 | |
|                 nbj = NormalBackupJobs.objects.get(name=selectedJob)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbj = NormalBackupJobs.objects.filter(name=selectedJob).first()
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             nbj.delete()
 | |
| 
 | |
|             data_ret = {'status': 1}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def fetchNormalLogs(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
| 
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
| 
 | |
|             selectedJob = data['selectedJob']
 | |
|             recordsToShow = int(data['recordsToShow'])
 | |
|             page = int(str(data['page']).strip('\n'))
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'scheduleBackups') == 0:
 | |
|                 return ACLManager.loadErrorJson('scheduleStatus', 0)
 | |
| 
 | |
|             try:
 | |
|                 nbj = NormalBackupJobs.objects.get(name=selectedJob)
 | |
|             except NormalBackupJobs.MultipleObjectsReturned:
 | |
|                 # If multiple jobs exist with same name, get the first one
 | |
|                 nbj = NormalBackupJobs.objects.filter(name=selectedJob).first()
 | |
| 
 | |
|             logs = nbj.normalbackupjoblogs_set.all().order_by('-id')
 | |
| 
 | |
|             from s3Backups.s3Backups import S3Backups
 | |
| 
 | |
|             pagination = S3Backups.getPagination(len(logs), recordsToShow)
 | |
|             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow)
 | |
|             logs = logs[finalPageNumber:endPageNumber]
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
|             counter = 0
 | |
| 
 | |
|             from plogical.backupSchedule import backupSchedule
 | |
| 
 | |
|             for log in logs:
 | |
| 
 | |
|                 if log.status == backupSchedule.INFO:
 | |
|                     status = 'INFO'
 | |
|                 else:
 | |
|                     status = 'ERROR'
 | |
| 
 | |
|                 dic = {
 | |
|                     'type': status,
 | |
|                     'message': log.message
 | |
|                 }
 | |
| 
 | |
|                 if checker == 0:
 | |
|                     json_data = json_data + json.dumps(dic)
 | |
|                     checker = 1
 | |
|                 else:
 | |
|                     json_data = json_data + ',' + json.dumps(dic)
 | |
| 
 | |
|                 counter = counter + 1
 | |
| 
 | |
|             json_data = json_data + ']'
 | |
| 
 | |
|             data_ret = {'status': 1, 'logs': json_data, 'pagination': pagination}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def CreateV2BackupStatus(self, userID=None, data=None):
 | |
|         try:
 | |
|             domain = data['domain']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             if ACLManager.checkOwnership(domain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadError()
 | |
| 
 | |
|             statusFile = f'/home/cyberpanel/{domain}_rustic_backup_log'
 | |
| 
 | |
|             if ACLManager.CheckStatusFilleLoc(statusFile, domain):
 | |
|                 pass
 | |
|             else:
 | |
|                 data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "100",
 | |
|                             'currentStatus': 'Invalid status file.'}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|             #currentStatus:"cat: /home/cyberpanel/9219: No such file or directory"
 | |
| 
 | |
|             statusData = ProcessUtilities.outputExecutioner("cat " + statusFile).splitlines()
 | |
| 
 | |
|             lastLine = statusData[-1]
 | |
| 
 | |
|             if lastLine.find('[200]') > -1:
 | |
|                 command = 'rm -f ' + statusFile
 | |
|                 subprocess.call(shlex.split(command))
 | |
|                 data_ret = {'abort': 1, 'installStatus': 1, 'installationProgress': "100",
 | |
|                             'currentStatus': 'Successfully Created.'}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
|             elif lastLine.find('[404]') > -1:
 | |
|                 data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "0",
 | |
|                             'error_message': ProcessUtilities.outputExecutioner("cat " + statusFile).splitlines()}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
|             else:
 | |
|                 progress = lastLine.split(',')
 | |
|                 currentStatus = progress[0]
 | |
|                 try:
 | |
|                     installationProgress = progress[1]
 | |
|                 except:
 | |
|                     installationProgress = 0
 | |
|                 data_ret = {'abort': 0, 'installStatus': 0, 'installationProgress': installationProgress,
 | |
|                             'currentStatus': currentStatus}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'abort': 0, 'installStatus': 0, 'installationProgress': "0", 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def OneClickBackups(self, request=None, userID=None, data=None):
 | |
|         user = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|         data = {}
 | |
| 
 | |
|         import requests
 | |
|         try:
 | |
|             if request.GET.get('status', 'none') == 'success':
 | |
|                 plan_name = request.GET.get('planName')
 | |
|                 months = request.GET.get('months')
 | |
|                 monthly_price = request.GET.get('monthlyPrice')
 | |
|                 yearly_price = request.GET.get('yearlyPrice')
 | |
|                 customer = request.GET.get('customer')
 | |
|                 subscription = request.GET.get('subscription')
 | |
| 
 | |
|                 from IncBackups.models import OneClickBackups
 | |
| 
 | |
|                 if months == '1':
 | |
|                     price = monthly_price
 | |
|                 else:
 | |
|                     price = yearly_price
 | |
| 
 | |
|                 try:
 | |
| 
 | |
|                     userName = user.userName.lower()
 | |
| 
 | |
|                     not_allowed_characters = [
 | |
|                         ' ', '/', '\\', '@', '!', '#', '$', '%', '^', '&', '*', '(', ')', '+', '=',
 | |
|                         '{', '}', '[', ']', ':', ';', '"', "'", '<', '>', ',', '?', '|', '`', '~'
 | |
|                     ]
 | |
| 
 | |
|                     for items in not_allowed_characters:
 | |
|                         userName = userName.replace(items, '')
 | |
| 
 | |
|                     import plogical.randomPassword as randomPassword
 | |
| 
 | |
|                     backup_plan = OneClickBackups(
 | |
|                         owner=user,
 | |
|                         planName=plan_name,
 | |
|                         months=months,
 | |
|                         price=price,
 | |
|                         customer=customer,
 | |
|                         subscription=subscription,
 | |
|                         sftpUser=f'{userName}_{randomPassword.generate_pass(8)}'.lower(),
 | |
|                     )
 | |
|                     backup_plan.save()
 | |
| 
 | |
|                     ####
 | |
| 
 | |
|                     import requests
 | |
|                     import json
 | |
| 
 | |
| 
 | |
|                     # Define the URL of the endpoint
 | |
|                     url = 'http://platform.cyberpersons.com/Billing/CreateSFTPAccount'  # Replace with your actual endpoint URL
 | |
| 
 | |
|                     # Define the payload to send in the POST request
 | |
|                     payload = {
 | |
|                         'sub': subscription,
 | |
|                         'key': ProcessUtilities.outputExecutioner(f'cat /root/.ssh/cyberpanel.pub'),  # Replace with the actual SSH public key
 | |
|                         'sftpUser': backup_plan.sftpUser,
 | |
|                         'serverIP': ACLManager.fetchIP(), # Replace with the actual server IP,
 | |
|                         'planName': plan_name
 | |
|                     }
 | |
| 
 | |
|                     # Convert the payload to JSON format
 | |
|                     headers = {'Content-Type': 'application/json'}
 | |
|                     dataRet = json.dumps(payload)
 | |
| 
 | |
|                     # Make the POST request
 | |
|                     response = requests.post(url, headers=headers, data=dataRet)
 | |
| 
 | |
|                     # Handle the response
 | |
|                     if response.status_code == 200:
 | |
|                         response_data = response.json()
 | |
|                         if response_data.get('status') == 1:
 | |
| 
 | |
|                             ocbkup = OneClickBackups.objects.get(owner=user,subscription=subscription)
 | |
|                             ocbkup.state = 1
 | |
|                             ocbkup.save()
 | |
| 
 | |
|                             finalDic = {}
 | |
| 
 | |
|                             finalDic['IPAddress'] = response_data.get('ipAddress')
 | |
|                             finalDic['password'] = 'NOT-NEEDED'
 | |
|                             finalDic['backupSSHPort'] = '22'
 | |
|                             finalDic['userName'] = backup_plan.sftpUser
 | |
|                             finalDic['type'] = 'SFTP'
 | |
|                             finalDic['path'] = 'cpbackups'
 | |
|                             finalDic['name'] = backup_plan.sftpUser
 | |
| 
 | |
|                             wm = BackupManager()
 | |
|                             response_inner = wm.submitDestinationCreation(userID, finalDic)
 | |
| 
 | |
|                             response_data_inner = json.loads(response_inner.content.decode('utf-8'))
 | |
| 
 | |
|                             # Extract the value of 'status'
 | |
|                             if response_data_inner.get('status') == 0:
 | |
|                                 data['status'] = 0
 | |
|                                 data[
 | |
|                                     'message'] = f"[2109] Failed to create sftp account {response_data_inner.get('error_message')}"
 | |
|                                 print("Failed to create SFTP account:", response_data_inner.get('error_message'))
 | |
|                             else:
 | |
|                                 data['status'] = 1
 | |
| 
 | |
|                         else:
 | |
|                             data['status'] = 0
 | |
|                             data['message'] = f"[1985] Failed to create sftp account {response_data.get('error_message')}"
 | |
|                             print("Failed to create SFTP account:", response_data.get('error_message'))
 | |
|                     else:
 | |
|                         print("Failed to connect to the server. Status code:", response.status_code)
 | |
|                         print("Response:", response.text)
 | |
|                         data['status'] = 0
 | |
|                         data['message'] = f"[1991] Failed to create sftp account {response.text}"
 | |
| 
 | |
|                     ####
 | |
| 
 | |
|                 except BaseException as msg:
 | |
|                     data['status'] = 4
 | |
|                     data['message'] = str(msg)
 | |
| 
 | |
|             elif request.GET.get('status', 'none') == 'cancelled':
 | |
|                 data['status'] = 0
 | |
|             else:
 | |
|                 data['status'] = 2
 | |
|         except BaseException as msg:
 | |
|             data['status'] = 0
 | |
|             data['message'] = f"[2038] Unkown error occured in purchase process. Error message: {str(msg)}"
 | |
| 
 | |
| 
 | |
|         url = 'https://platform.cyberpersons.com/Billing/FetchBackupPlans'
 | |
| 
 | |
|         try:
 | |
|             response = requests.get(url)
 | |
|             response.raise_for_status()  # Check if the request was successful
 | |
|             data['plans'] = response.json()  # Convert the response to a Python dictionary
 | |
|         except requests.exceptions.HTTPError as http_err:
 | |
|             print(f'HTTP error occurred: {http_err}')
 | |
|         except Exception as err:
 | |
|             print(f'Other error occurred: {err}')
 | |
| 
 | |
|         data['bPlans'] = user.oneclickbackups_set.all()
 | |
| 
 | |
|         proc = httpProc(request, 'backup/oneClickBackups.html', data, 'addDeleteDestinations')
 | |
|         return proc.render()
 | |
| 
 | |
|     def ManageOCBackups(self, request=None, userID=None, data=None):
 | |
|         userID = request.session['userID']
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         admin = Administrator.objects.get(pk=userID)
 | |
|         from IncBackups.models import OneClickBackups
 | |
|         ocb = OneClickBackups.objects.get(pk = request.GET.get('id'), owner=admin)
 | |
|         destinations = [NormalBackupDests.objects.get(name=ocb.sftpUser)]
 | |
|         dests = []
 | |
|         for dest in destinations:
 | |
|             dests.append(dest.name)
 | |
| 
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
| 
 | |
|         proc = httpProc(request, 'backup/OneClickBackupSchedule.html', {'destination': NormalBackupDests.objects.get(name=ocb.sftpUser).name, 'websites': websitesName},
 | |
|                         'scheduleBackups')
 | |
|         return proc.render()
 | |
| 
 | |
|     def RestoreOCBackups(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             if currentACL['admin'] == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             from IncBackups.models import OneClickBackups
 | |
|             
 | |
|             # Check if an ID was provided
 | |
|             backup_id = request.GET.get('id')
 | |
|             if not backup_id:
 | |
|                 # If no ID provided, redirect to manage backups page
 | |
|                 from django.shortcuts import redirect
 | |
|                 return redirect('/backup/ManageOCBackups')
 | |
|             
 | |
|             try:
 | |
|                 ocb = OneClickBackups.objects.get(pk=backup_id, owner=admin)
 | |
|             except OneClickBackups.DoesNotExist:
 | |
|                 return ACLManager.loadErrorJson('restoreStatus', 0)
 | |
|         except Exception as msg:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [RestoreOCBackups]')
 | |
|             return HttpResponse("Error: " + str(msg))
 | |
| 
 | |
|         # Load the private key
 | |
|         finalDirs = []
 | |
|         
 | |
|         try:
 | |
|             nbd = NormalBackupDests.objects.get(name=ocb.sftpUser)
 | |
|             ip = json.loads(nbd.config)['ip']
 | |
|         except Exception as e:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(f"Failed to get backup destination: {str(e)} [RestoreOCBackups]")
 | |
|             return HttpResponse(f"Error: Failed to get backup destination configuration. {str(e)}")
 | |
| 
 | |
|         # Connect to the remote server using the private key
 | |
|         ssh = paramiko.SSHClient()
 | |
|         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 | |
|         
 | |
|         try:
 | |
|             # Read the private key content
 | |
|             private_key_path = '/root/.ssh/cyberpanel'
 | |
|             
 | |
|             # Check if file exists using ProcessUtilities (runs with proper privileges)
 | |
|             check_exists = ProcessUtilities.outputExecutioner(f'test -f {private_key_path} && echo "EXISTS" || echo "NOT_EXISTS"').strip()
 | |
|             
 | |
|             if check_exists == "NOT_EXISTS":
 | |
|                 logging.CyberCPLogFileWriter.writeToFile(f"SSH key not found at {private_key_path} [RestoreOCBackups]")
 | |
|                 return HttpResponse(f"Error: SSH key not found at {private_key_path}. Please ensure One-click Backup is properly configured.")
 | |
|             
 | |
|             # Read the key content using ProcessUtilities
 | |
|             key_content = ProcessUtilities.outputExecutioner(f'sudo cat {private_key_path}').rstrip('\n')
 | |
|             
 | |
|             if not key_content or key_content.startswith('cat:'):
 | |
|                 logging.CyberCPLogFileWriter.writeToFile(f"Failed to read SSH key at {private_key_path} [RestoreOCBackups]")
 | |
|                 return HttpResponse(f"Error: Could not read SSH key at {private_key_path}. Please check permissions.")
 | |
| 
 | |
|             # Load the private key from the content
 | |
|             key_file = StringIO(key_content)
 | |
|             
 | |
|             # Try different key types
 | |
|             key = None
 | |
|             try:
 | |
|                 key = paramiko.RSAKey.from_private_key(key_file)
 | |
|             except:
 | |
|                 try:
 | |
|                     key_file.seek(0)
 | |
|                     key = paramiko.Ed25519Key.from_private_key(key_file)
 | |
|                 except:
 | |
|                     try:
 | |
|                         key_file.seek(0)
 | |
|                         key = paramiko.ECDSAKey.from_private_key(key_file)
 | |
|                     except:
 | |
|                         key_file.seek(0)
 | |
|                         key = paramiko.DSSKey.from_private_key(key_file)
 | |
|             
 | |
|             # Connect to the server using the private key
 | |
|             ssh.connect(ip, username=ocb.sftpUser, pkey=key, timeout=30)
 | |
|             
 | |
|             # Command to list directories under the specified path
 | |
|             command = f"ls -d cpbackups/*/ 2>/dev/null || echo 'NO_DIRS_FOUND'"
 | |
| 
 | |
|             # Execute the command
 | |
|             stdin, stdout, stderr = ssh.exec_command(command)
 | |
| 
 | |
|             # Read the results
 | |
|             output = stdout.read().decode().strip()
 | |
|             
 | |
|             if output == 'NO_DIRS_FOUND' or not output:
 | |
|                 finalDirs = []
 | |
|             else:
 | |
|                 directories = output.splitlines()
 | |
|                 # Print directories
 | |
|                 for directory in directories:
 | |
|                     if directory and '/' in directory:
 | |
|                         finalDirs.append(directory.split('/')[1])
 | |
|                         
 | |
|         except paramiko.AuthenticationException as e:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(f"SSH Authentication failed: {str(e)} [RestoreOCBackups]")
 | |
|             return HttpResponse("Error: SSH Authentication failed. Please check your One-click Backup configuration.")
 | |
|         except paramiko.SSHException as e:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(f"SSH Connection failed: {str(e)} [RestoreOCBackups]")
 | |
|             return HttpResponse(f"Error: Failed to connect to backup server: {str(e)}")
 | |
|         except Exception as e:
 | |
|             logging.CyberCPLogFileWriter.writeToFile(f"Unexpected error during SSH operation: {str(e)} [RestoreOCBackups]")
 | |
|             return HttpResponse(f"Error: Failed to retrieve backup list: {str(e)}")
 | |
|         finally:
 | |
|             try:
 | |
|                 ssh.close()
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|         proc = httpProc(request, 'backup/restoreOCBackups.html', {'directories': finalDirs},
 | |
|                         'scheduleBackups')
 | |
|         return proc.render()
 | |
| 
 | |
|     def fetchOCSites(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
|             id = data['idValue']
 | |
|             folder = data['folder']
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             from IncBackups.models import OneClickBackups
 | |
|             ocb = OneClickBackups.objects.get(pk = id, owner=admin)
 | |
| 
 | |
|             # Load the private key
 | |
| 
 | |
|             nbd = NormalBackupDests.objects.get(name=ocb.sftpUser)
 | |
|             ip = json.loads(nbd.config)['ip']
 | |
| 
 | |
|             # Connect to the remote server using the private key
 | |
|             ssh = paramiko.SSHClient()
 | |
|             ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 | |
|             # Read the private key content
 | |
|             private_key_path = '/root/.ssh/cyberpanel'
 | |
|             key_content = ProcessUtilities.outputExecutioner(f'cat {private_key_path}').rstrip('\n')
 | |
| 
 | |
|             # Load the private key from the content
 | |
|             key_file = StringIO(key_content)
 | |
|             key = paramiko.RSAKey.from_private_key(key_file)
 | |
|             # Connect to the server using the private key
 | |
|             ssh.connect(ip, username=ocb.sftpUser, pkey=key)
 | |
|             # Command to list directories under the specified path
 | |
|             command = f"ls -d cpbackups/{folder}/*"
 | |
| 
 | |
|             # Execute the command
 | |
|             stdin, stdout, stderr = ssh.exec_command(command)
 | |
| 
 | |
|             # Read the results
 | |
|             directories = stdout.read().decode().splitlines()
 | |
| 
 | |
|             finalDirs = []
 | |
| 
 | |
|             # Print directories
 | |
|             for directory in directories:
 | |
|                 finalDirs.append(directory.split('/')[2])
 | |
| 
 | |
|             data_ret = {'status': 1, 'finalDirs': finalDirs}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def StartOCRestore(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
|             userID = request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if currentACL['admin'] == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             data = json.loads(request.body)
 | |
|             id = data['idValue']
 | |
|             folder = data['folder']
 | |
|             backupfile = data['backupfile']
 | |
| 
 | |
| 
 | |
|             extraArgs = {}
 | |
|             extraArgs['id'] = id
 | |
|             extraArgs['folder'] = folder
 | |
|             extraArgs['backupfile'] = backupfile
 | |
|             extraArgs['userID'] = userID
 | |
|             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999))
 | |
| 
 | |
|             statusFile = open(extraArgs['tempStatusPath'], 'w')
 | |
|             statusFile.writelines("Restore started..")
 | |
|             statusFile.close()
 | |
| 
 | |
|             background = ApplicationInstaller('StartOCRestore', extraArgs)
 | |
|             background.start()
 | |
| 
 | |
|             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None',
 | |
|                         'tempStatusPath': extraArgs['tempStatusPath']}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def DeployAccount(self, request=None, userID=None, data=None):
 | |
|         user = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|         userID = request.session['userID']
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
|         import json
 | |
| 
 | |
|         data = json.loads(request.body)
 | |
|         id = data['id']
 | |
| 
 | |
|         from IncBackups.models import OneClickBackups
 | |
|         ocb = OneClickBackups.objects.get(pk=id, owner=user)
 | |
| 
 | |
|         data = {}
 | |
| 
 | |
|         ####
 | |
| 
 | |
|         import requests
 | |
|         import json
 | |
| 
 | |
|         # Define the URL of the endpoint
 | |
|         url = 'http://platform.cyberpersons.com/Billing/CreateSFTPAccount'  # Replace with your actual endpoint URL
 | |
| 
 | |
|         # Define the payload to send in the POST request
 | |
|         payload = {
 | |
|             'sub': ocb.subscription,
 | |
|             'key': ProcessUtilities.outputExecutioner(f'cat /root/.ssh/cyberpanel.pub'),
 | |
|             # Replace with the actual SSH public key
 | |
|             'sftpUser': ocb.sftpUser,
 | |
|             'serverIP': ACLManager.fetchIP(),  # Replace with the actual server IP
 | |
|             'planName': ocb.planName
 | |
|         }
 | |
| 
 | |
|         # Convert the payload to JSON format
 | |
|         headers = {'Content-Type': 'application/json'}
 | |
|         dataRet = json.dumps(payload)
 | |
| 
 | |
|         # Make the POST request
 | |
|         response = requests.post(url, headers=headers, data=dataRet)
 | |
| 
 | |
|         # Handle the response
 | |
|         # Handle the response
 | |
|         if response.status_code == 200:
 | |
|             response_data = response.json()
 | |
|             if response_data.get('status') == 1:
 | |
| 
 | |
|                 ocb.state = 1
 | |
|                 ocb.save()
 | |
| 
 | |
|                 print("SFTP account created successfully.")
 | |
| 
 | |
|                 finalDic = {}
 | |
| 
 | |
|                 finalDic['IPAddress'] = response_data.get('ipAddress')
 | |
|                 finalDic['password'] = 'NOT-NEEDED'
 | |
|                 finalDic['backupSSHPort'] = '22'
 | |
|                 finalDic['userName'] = ocb.sftpUser
 | |
|                 finalDic['type'] = 'SFTP'
 | |
|                 finalDic['path'] = 'cpbackups'
 | |
|                 finalDic['name'] = ocb.sftpUser
 | |
| 
 | |
|                 wm = BackupManager()
 | |
|                 response_inner = wm.submitDestinationCreation(userID, finalDic)
 | |
| 
 | |
|                 response_data_inner = json.loads(response_inner.content.decode('utf-8'))
 | |
| 
 | |
|                 # Extract the value of 'status'
 | |
|                 if response_data_inner.get('status') == 0:
 | |
|                     data_ret = {'status': 1, 'error_message': response_data_inner.get('error_message')}
 | |
|                     json_data = json.dumps(data_ret)
 | |
|                     return HttpResponse(json_data)
 | |
|                 else:
 | |
|                     data_ret = {'status': 1,}
 | |
|                     json_data = json.dumps(data_ret)
 | |
|                     return HttpResponse(json_data)
 | |
| 
 | |
|             else:
 | |
| 
 | |
|                 if response_data.get('error_message') == "Already deployed.":
 | |
|                     ocb.state = 1
 | |
|                     ocb.save()
 | |
| 
 | |
|                     print("SFTP account created successfully.")
 | |
| 
 | |
|                     finalDic = {}
 | |
| 
 | |
|                     finalDic['IPAddress'] = response_data.get('ipAddress')
 | |
|                     finalDic['password'] = 'NOT-NEEDED'
 | |
|                     finalDic['backupSSHPort'] = '22'
 | |
|                     finalDic['userName'] = ocb.sftpUser
 | |
|                     finalDic['type'] = 'SFTP'
 | |
|                     finalDic['path'] = 'cpbackups'
 | |
|                     finalDic['name'] = ocb.sftpUser
 | |
| 
 | |
|                     wm = BackupManager()
 | |
|                     response_inner = wm.submitDestinationCreation(userID, finalDic)
 | |
| 
 | |
|                     response_data_inner = json.loads(response_inner.content.decode('utf-8'))
 | |
| 
 | |
|                     # Extract the value of 'status'
 | |
|                     if response_data_inner.get('status') == 0:
 | |
|                         data_ret = {'status': 1, 'error_message': response_data_inner.get('error_message')}
 | |
|                         json_data = json.dumps(data_ret)
 | |
|                         return HttpResponse(json_data)
 | |
|                     else:
 | |
|                         data_ret = {'status': 1, }
 | |
|                         json_data = json.dumps(data_ret)
 | |
|                         return HttpResponse(json_data)
 | |
| 
 | |
|                 data_ret = {'status': 0, 'error_message': response_data.get('error_message')}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
|         else:
 | |
|             data['message'] = f"[1991] Failed to create sftp account {response.text}"
 | |
|             data_ret = {'status': 0, 'error_message': response.text}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def ReconfigureSubscription(self, request=None, userID=None, data=None):
 | |
|         try:
 | |
|             if not data:
 | |
|                 return JsonResponse({'status': 0, 'error_message': 'No data provided'})
 | |
| 
 | |
|             subscription_id = data['subscription_id']
 | |
|             customer_id = data['customer_id']
 | |
|             plan_name = data['plan_name']
 | |
|             amount = data['amount']
 | |
|             interval = data['interval']
 | |
| 
 | |
|             # Call platform API to update SFTP key
 | |
|             import requests
 | |
|             import json
 | |
| 
 | |
|             url = 'http://platform.cyberpersons.com/Billing/ReconfigureSubscription'
 | |
|             
 | |
|             payload = {
 | |
|                 'subscription_id': subscription_id,
 | |
|                 'key': ProcessUtilities.outputExecutioner(f'cat /root/.ssh/cyberpanel.pub'),
 | |
|                 'serverIP': ACLManager.fetchIP(),
 | |
|                 'email': data['email'],
 | |
|                 'code': data['code']
 | |
|             }
 | |
| 
 | |
|             headers = {'Content-Type': 'application/json'}
 | |
|             response = requests.post(url, headers=headers, data=json.dumps(payload))
 | |
| 
 | |
|             if response.status_code == 200:
 | |
|                 response_data = response.json()
 | |
|                 if response_data.get('status') == 1:
 | |
|                     # Create OneClickBackups record
 | |
|                     from IncBackups.models import OneClickBackups
 | |
|                     backup_plan = OneClickBackups(
 | |
|                         owner=Administrator.objects.get(pk=userID),
 | |
|                         planName=plan_name,
 | |
|                         months='1' if interval == 'month' else '12',
 | |
|                         price=amount,
 | |
|                         customer=customer_id,
 | |
|                         subscription=subscription_id,
 | |
|                         sftpUser=response_data.get('sftpUser'),
 | |
|                         state=1  # Set as active since SFTP is already configured
 | |
|                     )
 | |
|                     backup_plan.save()
 | |
| 
 | |
|                     # Create SFTP destination in CyberPanel
 | |
|                     finalDic = {
 | |
|                         'IPAddress': response_data.get('ipAddress'),
 | |
|                         'password': 'NOT-NEEDED',
 | |
|                         'backupSSHPort': '22',
 | |
|                         'userName': response_data.get('sftpUser'),
 | |
|                         'type': 'SFTP',
 | |
|                         'path': 'cpbackups',
 | |
|                         'name': response_data.get('sftpUser')
 | |
|                     }
 | |
| 
 | |
|                     wm = BackupManager()
 | |
|                     response_inner = wm.submitDestinationCreation(userID, finalDic)
 | |
|                     response_data_inner = json.loads(response_inner.content.decode('utf-8'))
 | |
| 
 | |
|                     if response_data_inner.get('status') == 0:
 | |
|                         return JsonResponse({'status': 0, 'error_message': response_data_inner.get('error_message')})
 | |
| 
 | |
|                     return JsonResponse({'status': 1})
 | |
|                 else:
 | |
|                     return JsonResponse({'status': 0, 'error_message': response_data.get('error_message')})
 | |
|             else:
 | |
|                 return JsonResponse({'status': 0, 'error_message': f'Platform API error: {response.text}'})
 | |
| 
 | |
|         except Exception as e:
 | |
|             return JsonResponse({'status': 0, 'error_message': str(e)})
 | |
| 
 | |
| 
 |