File: //usr/local/CyberCP/IncBackups/views.py
import json
import os
import stat
import time
from pathlib import Path
from random import randint
from django.shortcuts import HttpResponse, redirect
from backup.backupManager import BackupManager
from loginSystem.models import Administrator
from loginSystem.views import loadLoginPage
from plogical.Backupsv2 import CPBackupsV2
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from plogical.acl import ACLManager
from plogical.httpProc import httpProc
from plogical.processUtilities import ProcessUtilities as pu
from plogical.virtualHostUtilities import virtualHostUtilities as vhu
from websiteFunctions.models import Websites
from .IncBackupProvider import IncBackupProvider
from .IncBackupPath import IncBackupPath
from .IncBackupsControl import IncJobs
from .models import IncJob, BackupJob, JobSites
def def_renderer(request, templateName, args, context=None):
proc = httpProc(request, templateName,
args, context)
return proc.render()
def _get_destinations(local: bool = False):
destinations = []
if local:
destinations.append('local')
path = Path(IncBackupPath.SFTP.value)
if path.exists():
for item in path.iterdir():
destinations.append('sftp:%s' % item.name)
path = Path(IncBackupPath.AWS.value)
if path.exists():
for item in path.iterdir():
destinations.append('s3:s3.amazonaws.com/%s' % item.name)
return destinations
def _get_user_acl(request):
user_id = request.session['userID']
current_acl = ACLManager.loadedACL(user_id)
return user_id, current_acl
def create_backup(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0:
return ACLManager.loadError()
websites = ACLManager.findAllSites(current_acl, user_id)
destinations = _get_destinations(local=True)
return def_renderer(request, 'IncBackups/createBackup.html',
{'websiteList': websites, 'destinations': destinations}, 'createBackup')
except BaseException as msg:
logging.writeToFile(str(msg))
return redirect(loadLoginPage)
def backup_destinations(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0:
return ACLManager.loadError()
return def_renderer(request, 'IncBackups/incrementalDestinations.html', {}, 'addDeleteDestinations')
except BaseException as msg:
logging.writeToFile(str(msg))
return redirect(loadLoginPage)
def add_destination(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0:
return ACLManager.loadErrorJson('destStatus', 0)
data = json.loads(request.body)
if data['type'].lower() == IncBackupProvider.SFTP.name.lower():
path = Path(IncBackupPath.SFTP.value)
path.mkdir(exist_ok=True)
ip_address = data['IPAddress']
password = data['password']
address_file = path / ip_address
port = data.get('backupSSHPort', '22')
if address_file.exists():
final_dic = {'status': 0, 'error_message': 'This destination already exists.'}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
python_path = Path('/usr/local/CyberCP/bin/python')
backup_utils = Path(vhu.cyberPanel) / "plogical/backupUtilities.py"
exec_args = "submitDestinationCreation --ipAddress %s --password %s --port %s --user %s" % \
(ip_address, password, port, 'root')
exec_cmd = "%s %s %s" % (python_path, backup_utils, exec_args)
if Path(pu.debugPath).exists():
logging.writeToFile(exec_cmd)
output = pu.outputExecutioner(exec_cmd)
if Path(pu.debugPath).exists():
logging.writeToFile(output)
if output.find('1,') > -1:
content = '%s\n%s' % (ip_address, port)
with open(address_file, 'w') as outfile:
outfile.write(content)
command = 'cat /root/.ssh/config'
current_config = pu.outputExecutioner(command)
tmp_file = '/home/cyberpanel/sshconfig'
with open(tmp_file, 'w') as outfile:
if current_config.find('cat') == -1:
outfile.write(current_config)
content = "Host %s\n" \
" IdentityFile ~/.ssh/cyberpanel\n" \
" Port %s\n" % (ip_address, port)
if current_config.find(ip_address) == -1:
outfile.write(content)
command = 'mv %s /root/.ssh/config' % tmp_file
pu.executioner(command)
command = 'chown root:root /root/.ssh/config'
pu.executioner(command)
final_dic = {'status': 1, 'error_message': 'None'}
else:
final_dic = {'status': 0, 'error_message': output}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
if data['type'].lower() == IncBackupProvider.AWS.name.lower():
path = Path(IncBackupPath.AWS.value)
path.mkdir(exist_ok=True)
access_key = data['AWS_ACCESS_KEY_ID']
secret_key = data['AWS_SECRET_ACCESS_KEY']
aws_file = path / access_key
with open(aws_file, 'w') as outfile:
outfile.write(secret_key)
aws_file.chmod(stat.S_IRUSR | stat.S_IWUSR)
final_dic = {'status': 1}
final_json = json.dumps(final_dic)
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 populate_current_records(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(request.body)
json_data = []
if data['type'].lower() == IncBackupProvider.SFTP.name.lower():
path = Path(IncBackupPath.SFTP.value)
if path.exists():
for item in path.iterdir():
with open(item, 'r') as infile:
_file = infile.readlines()
json_data.append({
'ip': _file[0].strip('\n'),
'port': _file[1],
})
else:
final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''})
return HttpResponse(final_json)
if data['type'].lower() == IncBackupProvider.AWS.name.lower():
path = Path(IncBackupPath.AWS.value)
if path.exists():
for item in path.iterdir():
json_data.append({'AWS_ACCESS_KEY_ID': item.name})
else:
final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''})
return HttpResponse(final_json)
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 remove_destination(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0:
return ACLManager.loadErrorJson('destStatus', 0)
data = json.loads(request.body)
if 'IPAddress' in data:
file_name = data['IPAddress']
if data['type'].lower() == IncBackupProvider.SFTP.name.lower():
dest_file = Path(IncBackupPath.SFTP.value) / file_name
dest_file.unlink()
if data['type'].lower() == IncBackupProvider.AWS.name.lower():
dest_file = Path(IncBackupPath.AWS.value) / file_name
dest_file.unlink()
final_dic = {'status': 1, 'error_message': 'None'}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'destStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def fetch_current_backups(request):
try:
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
data = json.loads(request.body)
backup_domain = data['websiteToBeBacked']
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('fetchStatus', 0)
if 'backupDestinations' in data:
backup_destinations = data['backupDestinations']
extra_args = {'website': backup_domain, 'backupDestinations': backup_destinations}
if 'password' in data:
extra_args['password'] = data['password']
else:
final_json = json.dumps({'status': 0, 'error_message': "Please supply the password."})
return HttpResponse(final_json)
start_job = IncJobs('Dummy', extra_args)
return start_job.fetchCurrentBackups()
else:
website = Websites.objects.get(domain=backup_domain)
backups = website.incjob_set.all()
json_data = []
for backup in reversed(backups):
snapshots = []
jobs = backup.jobsnapshots_set.all()
for job in jobs:
snapshots.append({'type': job.type, 'snapshotid': job.snapshotid, 'destination': job.destination})
json_data.append({'id': backup.id,
'date': str(backup.date),
'snapshots': snapshots
})
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 submit_backup_creation(request):
try:
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
data = json.loads(request.body)
backup_domain = data['websiteToBeBacked']
backup_destinations = data['backupDestinations']
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('metaStatus', 0)
temp_path = Path("/home/cyberpanel/") / str(randint(1000, 9999))
extra_args = {}
extra_args['website'] = backup_domain
extra_args['tempPath'] = str(temp_path)
extra_args['backupDestinations'] = backup_destinations
extra_args['websiteData'] = data['websiteData'] if 'websiteData' in data else False
extra_args['websiteEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False
extra_args['websiteSSLs'] = data['websiteSSLs'] if 'websiteSSLs' in data else False
extra_args['websiteDatabases'] = data['websiteDatabases'] if 'websiteDatabases' in data else False
start_job = IncJobs('createBackup', extra_args)
start_job.start()
time.sleep(2)
final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': str(temp_path)})
return HttpResponse(final_json)
except BaseException as msg:
logging.writeToFile(str(msg))
final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def get_backup_status(request):
try:
data = json.loads(request.body)
status = data['tempPath']
backup_domain = data['websiteToBeBacked']
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('fetchStatus', 0)
if ACLManager.CheckStatusFilleLoc(status):
pass
else:
data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "100",
'currentStatus': 'Invalid status file.'}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
## file name read ends
if os.path.exists(status):
command = "cat " + status
result = pu.outputExecutioner(command, 'cyberpanel')
if result.find("Completed") > -1:
### Removing Files
os.remove(status)
final_json = json.dumps(
{'backupStatus': 1, 'error_message': "None", "status": result, "abort": 1})
return HttpResponse(final_json)
elif result.find("[5009]") > -1:
## removing status file, so that backup can re-run
try:
os.remove(status)
except:
pass
final_json = json.dumps(
{'backupStatus': 1, 'error_message': "None", "status": result,
"abort": 1})
return HttpResponse(final_json)
else:
final_json = json.dumps(
{'backupStatus': 1, 'error_message': "None", "status": result,
"abort": 0})
return HttpResponse(final_json)
else:
final_json = json.dumps({'backupStatus': 1, 'error_message': "None", "status": 1, "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.writeToFile(str(msg) + " [backupStatus]")
return HttpResponse(final_json)
def delete_backup(request):
try:
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
data = json.loads(request.body)
backup_domain = data['websiteToBeBacked']
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('fetchStatus', 0)
backup_id = data['backupID']
inc_job = IncJob.objects.get(id=backup_id)
job = IncJobs(None, None)
job.DeleteSnapShot(inc_job)
inc_job.delete()
final_dic = {'status': 1, 'error_message': 'None'}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'destStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def fetch_restore_points(request):
try:
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
data = json.loads(request.body)
backup_domain = data['websiteToBeBacked']
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(request.body)
job_id = data['id']
inc_job = IncJob.objects.get(id=job_id)
backups = inc_job.jobsnapshots_set.all()
json_data = []
for items in backups:
json_data.append({'id': items.id,
'snapshotid': items.snapshotid,
'type': items.type,
'destination': items.destination,
})
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 restore_point(request):
try:
user_id, current_acl = _get_user_acl(request)
admin = Administrator.objects.get(pk=user_id)
data = json.loads(request.body)
backup_domain = data['websiteToBeBacked']
job_id = data['jobid']
if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1:
pass
else:
return ACLManager.loadErrorJson('metaStatus', 0)
temp_path = Path("/home/cyberpanel/") / str(randint(1000, 9999))
if data['reconstruct'] == 'remote':
extraArgs = {}
extraArgs['website'] = backup_domain
extraArgs['jobid'] = job_id
extraArgs['tempPath'] = str(temp_path)
extraArgs['reconstruct'] = data['reconstruct']
extraArgs['backupDestinations'] = data['backupDestinations']
extraArgs['password'] = data['password']
extraArgs['path'] = data['path']
else:
extraArgs = {}
extraArgs['website'] = backup_domain
extraArgs['jobid'] = job_id
extraArgs['tempPath'] = str(temp_path)
extraArgs['reconstruct'] = data['reconstruct']
start_job = IncJobs('restorePoint', extraArgs)
start_job.start()
time.sleep(2)
final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': str(temp_path)})
return HttpResponse(final_json)
except BaseException as msg:
logging.writeToFile(str(msg))
final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def schedule_backups(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadError()
websites = ACLManager.findAllSites(current_acl, user_id)
destinations = _get_destinations(local=True)
return def_renderer(request, 'IncBackups/backupSchedule.html',
{'websiteList': websites, 'destinations': destinations}, 'scheduleBackups')
except BaseException as msg:
logging.writeToFile(str(msg))
return redirect(loadLoginPage)
def submit_backup_schedule(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('scheduleStatus', 0)
data = json.loads(request.body)
backup_dest = data['backupDestinations']
backup_freq = data['backupFreq']
backup_retention = data['backupRetention']
backup_sites = data['websitesToBeBacked']
backup_data = 1 if 'websiteData' in data else 0
backup_emails = 1 if 'websiteEmails' in data else 0
backup_databases = 1 if 'websiteDatabases' in data else 0
backup_job = BackupJob(websiteData=backup_data, websiteDataEmails=backup_emails,
websiteDatabases=backup_databases, destination=backup_dest, frequency=backup_freq,
retention=backup_retention)
backup_job.save()
for site in backup_sites:
backup_site_job = JobSites(job=backup_job, website=site)
backup_site_job.save()
final_json = json.dumps({'status': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException as msg:
final_json = json.dumps({'status': 0, 'error_message': str(msg)})
return HttpResponse(final_json)
def get_current_backup_schedules(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
records = BackupJob.objects.all()
json_data = []
for items in records:
json_data.append({'id': items.id,
'destination': items.destination,
'frequency': items.frequency,
'retention': items.retention,
'numberOfSites': items.jobsites_set.all().count()
})
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 fetch_sites(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(request.body)
job = BackupJob.objects.get(pk=data['id'])
json_data = []
for jobsite in job.jobsites_set.all():
json_data.append({'id': jobsite.id,
'website': jobsite.website,
})
final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data,
'websiteData': job.websiteData, 'websiteDatabases': job.websiteDatabases,
'websiteEmails': job.websiteDataEmails})
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 schedule_delete(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('scheduleStatus', 0)
data = json.loads(request.body)
job_id = data['id']
backup_job = BackupJob.objects.get(id=job_id)
backup_job.delete()
final_json = json.dumps({'status': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException as msg:
final_json = json.dumps({'status': 0, 'error_message': str(msg)})
return HttpResponse(final_json)
def restore_remote_backups(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0:
return ACLManager.loadError()
websites = ACLManager.findAllSites(current_acl, user_id)
destinations = _get_destinations()
return def_renderer(request, 'IncBackups/restoreRemoteBackups.html',
{'websiteList': websites, 'destinations': destinations}, 'createBackup')
except BaseException as msg:
logging.writeToFile(str(msg))
return redirect(loadLoginPage)
def save_changes(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('scheduleStatus', 0)
data = json.loads(request.body)
job_id = data['id']
backup_data = data['websiteData'] if 'websiteData' in data else 0
backup_emails = data['websiteEmails'] if 'websiteEmails' in data else 0
backup_databases = data['websiteDatabases'] if 'websiteDatabases' in data else 0
job = BackupJob.objects.get(pk=job_id)
job.websiteData = int(backup_data)
job.websiteDatabases = int(backup_databases)
job.websiteDataEmails = int(backup_emails)
job.save()
final_json = json.dumps({'status': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException as msg:
final_json = json.dumps({'status': 0, 'error_message': str(msg)})
return HttpResponse(final_json)
def remove_site(request):
try:
_, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('scheduleStatus', 0)
data = json.loads(request.body)
job_id = data['id']
website = data['website']
job = BackupJob.objects.get(pk=job_id)
site = JobSites.objects.get(job=job, website=website)
site.delete()
final_json = json.dumps({'status': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException as msg:
final_json = json.dumps({'status': 0, 'error_message': str(msg)})
return HttpResponse(final_json)
def add_website(request):
try:
_, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'scheduleBackups') == 0:
return ACLManager.loadErrorJson('scheduleStatus', 0)
data = json.loads(request.body)
job_id = data['id']
website = data['website']
job = BackupJob.objects.get(pk=job_id)
try:
JobSites.objects.get(job=job, website=website)
except BaseException:
site = JobSites(job=job, website=website)
site.save()
final_json = json.dumps({'status': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException as msg:
final_json = json.dumps({'status': 0, 'error_message': str(msg)})
return HttpResponse(final_json)
#### Backups v2
def ConfigureV2Backup(request):
try:
user_id, current_acl = _get_user_acl(request)
if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0:
return ACLManager.loadError()
if ACLManager.CheckForPremFeature('all'):
BackupStat = 1
else:
BackupStat = 0
websites = ACLManager.findAllSites(current_acl, user_id)
#
# destinations = _get_destinations(local=True)
proc = httpProc(request, 'IncBackups/ConfigureV2Backup.html', {'websiteList': websites, 'BackupStat': BackupStat})
return proc.render()
except BaseException as msg:
logging.writeToFile(str(msg))
return redirect(loadLoginPage)
def ConfigureV2BackupSetup(request):
try:
userID = request.session['userID']
req_data={}
req_data['name'] = 'GDrive'
req_data['token'] = request.GET.get('t')
req_data['refresh_token'] = request.GET.get('r')
req_data['token_uri'] = request.GET.get('to')
req_data['scopes'] = request.GET.get('s')
req_data['accountname'] = request.GET.get('n')
req_data['client_id'] = request.GET.get('client_id')
req_data['client_secret'] = request.GET.get('client_secret')
website = request.GET.get('d')
# logging.writeToFile('domainname is ====%s'%(request.GET.get))
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(website, admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
cpbuv2 = CPBackupsV2(
{'domain': website, 'BasePath': '/home/backup', 'BackupDatabase': 1, 'BackupData': 1,
'BackupEmails': 1, 'BackendName': 'testremote'})
status, message = cpbuv2.SetupRcloneBackend(CPBackupsV2.GDrive, req_data)
from plogical.processUtilities import ProcessUtilities
if os.path.exists(ProcessUtilities.debugPath):
logging.writeToFile(f'Response from SetupRcloneBackend is {str(status)} and message {str(message)}')
if status == 0:
data_ret = {'status': 0, 'error_message': message}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
return ConfigureV2Backup(request)
except BaseException as msg:
logging.writeToFile("Error configure"+str(msg))
data_ret = {'status': 0, 'error_message': str(msg) + request.get_raw_uri() }
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def CreateV2Backup(request):
try:
userID = request.session['userID']
bm = BackupManager()
return bm.CreateV2backupSite(request, userID)
except KeyError:
return redirect(loadLoginPage)
def DeleteRepoV2(request):
try:
userID = request.session['userID']
bm = BackupManager()
return bm.DeleteRepoV2(request, userID)
except KeyError:
return redirect(loadLoginPage)
def CreateV2BackupButton(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
Selectedrepo = data['Selectedrepo']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(Selectedwebsite, admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
extra_args = {}
extra_args['function'] = 'InitiateBackup'
extra_args['website'] = Selectedwebsite
extra_args['domain'] = Selectedwebsite
extra_args['BasePath'] = '/home/backup'
extra_args['BackendName'] = Selectedrepo
extra_args['BackupData'] = data['websiteData'] if 'websiteData' in data else False
extra_args['BackupEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False
extra_args['BackupDatabase'] = data['websiteDatabases'] if 'websiteDatabases' in data else False
background = CPBackupsV2(extra_args)
background.start()
# background = CPBackupsV2({'domain': Selectedwebsite, 'BasePath': '/home/backup', 'BackupDatabase': 1, 'BackupData': 1,
# 'BackupEmails': 1, 'BackendName': Selectedrepo, 'function': 'InitiateBackup', })
# background.start()
time.sleep(2)
data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None',}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except BaseException as msg:
data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def CreateV2BackupStatus(request):
try:
userID = request.session['userID']
bm = BackupManager()
return bm.CreateV2BackupStatus(userID, json.loads(request.body))
except KeyError:
return redirect(loadLoginPage)
def RestoreV2backupSite(request):
try:
userID = request.session['userID']
bm = BackupManager()
return bm.RestoreV2backupSite(request, userID)
except KeyError:
return redirect(loadLoginPage)
def RestorePathV2(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
SnapShotId = data['snapshotid']
Path = data['path']
Selectedwebsite = data['selwebsite']
Selectedrepo = data['selectedrepo']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
extra_args = {}
extra_args['function'] = 'InitiateRestore'
extra_args['website'] = Selectedwebsite
extra_args['domain'] = Selectedwebsite
extra_args['BasePath'] = '/home/backup'
extra_args['BackendName'] = Selectedrepo
extra_args['path'] = Path
extra_args['snapshotid'] = SnapShotId
# extra_args['BackupData'] = data['websiteData'] if 'websiteData' in data else False
# extra_args['BackupEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False
# extra_args['BackupDatabase'] = data['websiteDatabases'] if 'websiteDatabases' in data else False
background = CPBackupsV2(extra_args)
background.start()
# vm = CPBackupsV2({'domain': Selectedwebsite, 'BackendName': Selectedrepo, "function": "", 'BasePath': '/home/backup'})
# status = vm.InitiateRestore(SnapShotId, Path)
data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None',}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except BaseException as msg:
data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def DeleteSnapshotV2Final(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
SnapShotId = data['snapshotid']
Selectedwebsite = data['selwebsite']
Selectedrepo = data['selectedrepo']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
extra_args = {}
extra_args['function'] = 'InitiateRestore'
extra_args['website'] = Selectedwebsite
extra_args['domain'] = Selectedwebsite
extra_args['BasePath'] = '/home/backup'
extra_args['BackendName'] = Selectedrepo
extra_args['snapshotid'] = SnapShotId
# extra_args['BackupData'] = data['websiteData'] if 'websiteData' in data else False
# extra_args['BackupEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False
# extra_args['BackupDatabase'] = data['websiteDatabases'] if 'websiteDatabases' in data else False
background = CPBackupsV2(extra_args)
background.DeleteSnapshots(SnapShotId)
# vm = CPBackupsV2({'domain': Selectedwebsite, 'BackendName': Selectedrepo, "function": "", 'BasePath': '/home/backup'})
# status = vm.InitiateRestore(SnapShotId, Path)
data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None',}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except BaseException as msg:
data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def selectwebsiteRetorev2(request):
import re
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
obj = Websites.objects.get(domain = str(Selectedwebsite))
#/home/cyberpanel.net/.config/rclone/rclone.conf
path = '/home/%s/.config/rclone/rclone.conf' %(obj.domain)
command = 'cat %s'%(path)
result = pu.outputExecutioner(command)
if result.find('type') > -1:
pattern = r'\[(.*?)\]'
matches = re.findall(pattern, result)
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": matches})
return HttpResponse(final_json)
else:
final_json = json.dumps({'status': 0, 'fetchStatus': 0, 'error_message': 'Could not Find repo'})
return HttpResponse(final_json)
# final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": 1})
# 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 ConfigureSftpV2Backup(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
sfptpasswd = data['sfptpasswd']
hostName = data['hostName']
UserName = data['UserName']
Repo_Name = data['Repo_Name']
#sshPort = data['sshPort']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
req_data = {}
req_data['name'] = 'SFTP'
req_data['host'] = hostName
req_data['user'] = UserName
req_data['password'] = sfptpasswd
req_data['Repo_Name'] = Repo_Name
try:
req_data['sshPort'] = data['sshPort']
except:
req_data['sshPort'] = '22'
cpbuv2 = CPBackupsV2(
{'domain': Selectedwebsite, 'BasePath': '/home/backup', 'BackupDatabase': 1, 'BackupData': 1,
'BackupEmails': 1, 'BackendName': 'SFTP', 'function': None})
status, message = cpbuv2.SetupRcloneBackend(CPBackupsV2.SFTP, req_data)
from plogical.processUtilities import ProcessUtilities
if os.path.exists(ProcessUtilities.debugPath):
logging.writeToFile(f'Response from SetupRcloneBackend is {str(status)} and message {str(message)}')
if status == 0:
data_ret = {'status': 0, 'error_message': message}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
# return ConfigureV2Backup(request)
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": None})
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 selectwebsiteCreatev2(request):
import re
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
obj = Websites.objects.get(domain = str(Selectedwebsite))
#/home/cyberpanel.net/.config/rclone/rclone.conf
path = '/home/%s/.config/rclone/rclone.conf' %(obj.domain)
command = 'cat %s'%(path)
CurrentContent = pu.outputExecutioner(command)
status, currentSchedules = CPBackupsV2.FetchCurrentSchedules(str(Selectedwebsite))
if CurrentContent.find('No such file or directory') > -1:
LocalRclonePath = f'/home/{obj.domain}/.config/rclone'
command = f'mkdir -p {LocalRclonePath}'
pu.executioner(command, obj.externalApp)
# content = '''
# [local]
# type = local
# '''
# command = f"echo '{content}' > {path}"
# pu.executioner(command, obj.externalApp, True)
command = 'cat %s' % (path)
result = pu.outputExecutioner(command)
if result.find('type') > -1:
pattern = r'\[(.*?)\]'
matches = re.findall(pattern, result)
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": matches, 'currentSchedules': currentSchedules})
return HttpResponse(final_json)
else:
final_json = json.dumps({'status': 0, 'fetchStatus': 0, 'error_message': 'Could not Find repo'})
return HttpResponse(final_json)
else:
command = 'cat %s' % (path)
result = pu.outputExecutioner(command)
if result.find('type') > -1:
pattern = r'\[(.*?)\]'
matches = re.findall(pattern, result)
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": matches, 'currentSchedules': currentSchedules})
return HttpResponse(final_json)
else:
final_json = json.dumps({'status': 0, 'fetchStatus': 0, 'error_message': 'Could not Find repo', 'currentSchedules': currentSchedules})
return HttpResponse(final_json)
# logging.writeToFile(str(CurrentContent))
# final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": None})
# 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 selectreporestorev2(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedrepo = data['Selectedrepo']
Selectedwebsite= data['Selectedwebsite']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
# f'rustic -r testremote snapshots --password "" --json 2>/dev/null'
# final_json = json.dumps({'status': 0, 'fetchStatus': 1, 'error_message': Selectedrepo })
# return HttpResponse(final_json)
vm = CPBackupsV2({'domain': Selectedwebsite, 'BackendName': Selectedrepo, "function":""})
status, data = vm.FetchSnapShots()
if status == 1:
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": data})
return HttpResponse(final_json)
else:
# final_json = json.dumps({'status': 0, 'fetchStatus': 1, 'error_message': ac,})
final_json = json.dumps({'status': 0, 'fetchStatus': 1, 'error_message': 'Cannot Find!',})
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 schedulev2Backups(request):
try:
userID = request.session['userID']
bm = BackupManager()
return bm.schedulev2Backups(request, userID)
except KeyError:
return redirect(loadLoginPage)
def DeleteScheduleV2(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
repo = data['repo']
frequency = data['frequency']
websiteData = data['websiteData']
websiteDatabases = data['websiteDatabases']
websiteEmails = data['websiteEmails']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
status, message = CPBackupsV2.DeleteSchedule(Selectedwebsite, repo, frequency, websiteData, websiteDatabases, websiteEmails)
final_dic = {'status': 1, 'error_message': message}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
# final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": None})
# 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 CreateScheduleV2(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
repo = data['repo']
frequency = data['frequency']
retention = data['retention']
websiteData = data['websiteData'] if 'websiteData' in data else False
websiteDatabases = data['websiteDatabases'] if 'websiteDatabases' in data else False
websiteEmails = data['websiteEmails'] if 'websiteEmails' in data else False
#
# extra_args['BackupData'] = data['websiteData'] if 'websiteData' in data else False
# extra_args['BackupEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False
# extra_args['BackupDatabase'] = data['websiteDatabases'] if 'websiteDatabases' in data else False
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
status, message = CPBackupsV2.CreateScheduleV2(Selectedwebsite, repo, frequency, websiteData, websiteDatabases, websiteEmails, retention)
final_dic = {'status': 1, 'error_message': message}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
# final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": None})
# 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 DeleteV2BackupButton(request):
try:
userID = request.session['userID']
data = json.loads(request.body)
Selectedwebsite = data['Selectedwebsite']
repo = data['Selectedrepo']
currentACL = ACLManager.loadedACL(userID)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(str(Selectedwebsite), admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
obj = Websites.objects.get(domain=Selectedwebsite)
usr= obj.externalApp
status, message = CPBackupsV2.DeleteRepoScheduleV2(Selectedwebsite, repo, usr)
if status == 1:
final_dic = {'status': 1, 'error_message': message}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
else:
final_dic = {'status': 0, 'error_message': message}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
# final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": None})
# 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)