From 59300fe3a5ec993193ed5d7d1b1c240afd96dc46 Mon Sep 17 00:00:00 2001 From: "usman@cyberpersons.com" Date: Sun, 12 Feb 2023 13:15:41 +0500 Subject: [PATCH] add loging and improve config, ref https://community.cyberpanel.net/t/cyberpanel-backups-v2-proposal/40370 --- plogical/Backupsv2.py | 123 +++++++++++++++++++++++++------------ websiteFunctions/models.py | 21 +++++-- 2 files changed, 100 insertions(+), 44 deletions(-) diff --git a/plogical/Backupsv2.py b/plogical/Backupsv2.py index f1b8a2869..54e3a2520 100644 --- a/plogical/Backupsv2.py +++ b/plogical/Backupsv2.py @@ -1,6 +1,7 @@ import json import os import sys +import time sys.path.append('/usr/local/CyberCP') import django @@ -13,75 +14,119 @@ except: class CPBackupsV2: + PENDING_START = 0 + RUNNING = 1 + COMPLETED = 2 + FAILED = 3 + def __init__(self, data): self.data = data pass + @staticmethod + def FetchCurrentTimeStamp(): + import time + return str(time.time()) + + def UpdateStatus(self, message, status): + from websiteFunctions.models import Backupsv2, BackupsLogsv2 + self.buv2 = Backupsv2.objects.get(fileName=self.buv2.fileName) + self.buv2.status = status + self.buv2.save() + + BackupsLogsv2(message=message).save() + + if status == CPBackupsV2.FAILED: + self.buv2.website.BackupLock = 0 + self.buv2.website.save() + elif status == CPBackupsV2.COMPLETED: + self.buv2.website.BackupLock = 0 + self.buv2.website.save() + + + + def InitiateBackup(self): - from websiteFunctions.models import Websites, ChildDomains, WPSites, WPStaging + from websiteFunctions.models import Websites, Backupsv2 from django.forms.models import model_to_dict from plogical.mysqlUtilities import mysqlUtilities website = Websites.objects.get(domain=self.data['domain']) + while(1): - Config = {'MainWebsite': model_to_dict(website, fields=['domain', 'adminEmail', 'phpSelection', 'state', 'config'])} - Config['admin'] = model_to_dict(website.admin, fields=['userName', 'password', 'firstName', 'lastName', - 'email', 'type', 'owner', 'token', 'api', 'securityLevel', - 'state', 'initWebsitesLimit', 'twoFA', 'secretKey', 'config']) - Config['acl'] = model_to_dict(website.admin.acl) + if website.BackupLock == 0: - ### Child domains to config + website.BackupLock = 1 + website.save() - ChildsList = [] + self.buv2 = Backupsv2(website=website, fileName='backup-' + self.data['domain'] + "-" + time.strftime("%m.%d.%Y_%H-%M-%S"), status=CPBackupsV2.RUNNING, BasePath=self.data['BasePath']) + self.buv2.save() - for childDomains in website.childdomains_set.all(): - print(childDomains.domain) - ChildsList.append(model_to_dict(childDomains)) + try: - Config['ChildDomains'] = ChildsList + Config = {'MainWebsite': model_to_dict(website, fields=['domain', 'adminEmail', 'phpSelection', 'state', 'config'])} + Config['admin'] = model_to_dict(website.admin, fields=['userName', 'password', 'firstName', 'lastName', + 'email', 'type', 'owner', 'token', 'api', 'securityLevel', + 'state', 'initWebsitesLimit', 'twoFA', 'secretKey', 'config']) + Config['acl'] = model_to_dict(website.admin.acl) - #print(str(Config)) + ### Child domains to config - ### Databases + ChildsList = [] - connection, cursor = mysqlUtilities.setupConnection() + for childDomains in website.childdomains_set.all(): + print(childDomains.domain) + ChildsList.append(model_to_dict(childDomains)) - if connection == 0: - return 0 + Config['ChildDomains'] = ChildsList - dataBases = website.databases_set.all() - DBSList = [] + #print(str(Config)) - for db in dataBases: + ### Databases - query = f"SELECT host,user FROM mysql.db WHERE db='{db.dbName}';" - cursor.execute(query) - DBUsers = cursor.fetchall() + connection, cursor = mysqlUtilities.setupConnection() - UserList = [] + if connection == 0: + return 0 - for databaseUser in DBUsers: - query = f"SELECT password FROM `mysql`.`user` WHERE `Host`='{databaseUser[0]}' AND `User`='{databaseUser[1]}';" - cursor.execute(query) - resp = cursor.fetchall() - print(resp) - UserList.append({'user': databaseUser[1], 'host': databaseUser[0], 'password': resp[0][0]}) + dataBases = website.databases_set.all() + DBSList = [] - DBSList.append({db.dbName: UserList}) + for db in dataBases: - Config['databases'] = DBSList + query = f"SELECT host,user FROM mysql.db WHERE db='{db.dbName}';" + cursor.execute(query) + DBUsers = cursor.fetchall() - WPSitesList = [] + UserList = [] - for wpsite in website.wpsites_set.all(): - WPSitesList.append(model_to_dict(wpsite,fields=['title', 'path', 'FinalURL', 'AutoUpdates', 'PluginUpdates', 'ThemeUpdates', 'WPLockState'])) + for databaseUser in DBUsers: + query = f"SELECT password FROM `mysql`.`user` WHERE `Host`='{databaseUser[0]}' AND `User`='{databaseUser[1]}';" + cursor.execute(query) + resp = cursor.fetchall() + print(resp) + UserList.append({'user': databaseUser[1], 'host': databaseUser[0], 'password': resp[0][0]}) - Config['WPSites'] = WPSitesList + DBSList.append({db.dbName: UserList}) - print(json.dumps(Config)) + Config['databases'] = DBSList - pass + WPSitesList = [] + + for wpsite in website.wpsites_set.all(): + WPSitesList.append(model_to_dict(wpsite,fields=['title', 'path', 'FinalURL', 'AutoUpdates', 'PluginUpdates', 'ThemeUpdates', 'WPLockState'])) + + Config['WPSites'] = WPSitesList + except BaseException as msg: + self.UpdateStatus(str(msg), CPBackupsV2.FAILED) + return 0 + + print(json.dumps(Config)) + + break + else: + time.sleep(5) def BackupDataBases(self): @@ -100,5 +145,5 @@ class CPBackupsV2: pass if __name__ == "__main__": - cpbuv2 = CPBackupsV2({'domain': 'cyberpanel.net'} ) + cpbuv2 = CPBackupsV2({'domain': 'cyberpanel.net', 'BasePath': '/home/backup', 'BackupDatabase': 1, 'BackupData': 1} ) cpbuv2.InitiateBackup() \ No newline at end of file diff --git a/websiteFunctions/models.py b/websiteFunctions/models.py index c9b1a8640..055be7696 100755 --- a/websiteFunctions/models.py +++ b/websiteFunctions/models.py @@ -18,6 +18,8 @@ class Websites(models.Model): state = models.IntegerField(default=1) externalApp = models.CharField(max_length=30, default=None) config = models.TextField(default='') + BackupLock = models.IntegerField(default=0) + class ChildDomains(models.Model): master = models.ForeignKey(Websites,on_delete=models.CASCADE) @@ -94,20 +96,16 @@ class NormalBackupSites(models.Model): owner = models.ForeignKey(NormalBackupJobs, on_delete=models.CASCADE) domain = models.ForeignKey(Websites, on_delete=models.CASCADE) - class NormalBackupJobLogs(models.Model): owner = models.ForeignKey(NormalBackupJobs, on_delete=models.CASCADE) status = models.IntegerField() message = models.TextField() - - class wpplugins(models.Model): owner = models.ForeignKey(Administrator, on_delete=models.CASCADE) Name = models.CharField(max_length=255, default='') config = models.TextField() - class WPSites(models.Model): owner = models.ForeignKey(Websites, on_delete=models.CASCADE) title = models.CharField(max_length=255, default='') @@ -129,7 +127,6 @@ class WPSitesBackup(models.Model): WebsiteID = models.IntegerField(default=-1) config = models.TextField() - class RemoteBackupConfig(models.Model): owner = models.ForeignKey(Administrator, on_delete=models.CASCADE) configtype = models.CharField(max_length=255, default='') @@ -147,3 +144,17 @@ class RemoteBackupsites(models.Model): owner = models.ForeignKey(RemoteBackupSchedule, on_delete=models.CASCADE) WPsites = models.IntegerField(null=True) database = models.IntegerField(null=True) + +import time + +class Backupsv2(models.Model): + website = models.ForeignKey(Websites, on_delete=models.CASCADE) + fileName = models.CharField(max_length=255) + status = models.IntegerField(default=0) + timeStamp = models.CharField(max_length=255, default=str(time.time())) + BasePath = models.TextField(default='') + +class BackupsLogsv2(models.Model): + owner = models.ForeignKey(Backupsv2, on_delete=models.CASCADE) + timeStamp = models.CharField(max_length=255, default=str(time.time())) + message = models.TextField(default='') \ No newline at end of file