#!/usr/local/CyberCP/bin/python2 import os.path import sys import django sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() import CyberCPLogFileWriter as logging import subprocess import shlex import os import time from backupUtilities import backupUtilities from re import match,I,M from websiteFunctions.models import Websites, Backups from plogical.virtualHostUtilities import virtualHostUtilities from plogical.processUtilities import ProcessUtilities from multiprocessing import Process import plogical.backupUtilities as backupUtil class backupSchedule: @staticmethod def remoteBackupLogging(fileName, message): try: file = open(fileName,'a') file.writelines("[" + time.strftime("%I-%M-%S-%a-%b-%Y") + "] "+ message + "\n") file.close() except IOError,msg: return "Can not write to error file." @staticmethod def createLocalBackup(virtualHost, backupLogPath): try: backupSchedule.remoteBackupLogging(backupLogPath, "Starting local backup for: " + virtualHost) website = Websites.objects.get(domain=virtualHost) # defining paths ## /home/example.com/backup backupPath = os.path.join("/home", virtualHost, "backup/") domainUser = website.externalApp backupName = 'backup-' + domainUser + "-" + time.strftime("%I-%M-%S-%a-%b-%Y") ## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 tempStoragePath = os.path.join(backupPath, backupName) p = Process(target=backupUtil.submitBackupCreation, args=(tempStoragePath, backupName, backupPath, virtualHost)) p.start() time.sleep(2) backupSchedule.remoteBackupLogging(backupLogPath, "Waiting for backup to complete.. ") while (1): backupDomain = virtualHost status = os.path.join("/home", backupDomain, "backup/status") backupFileNamePath = os.path.join("/home", backupDomain, "backup/backupFileName") pid = os.path.join("/home", backupDomain, "backup/pid") ## read file name try: fileName = open(backupFileNamePath, 'r').read() except: fileName = "Fetching.." ## file name read ends if os.path.exists(status): status = open(status, 'r').read() if status.find("Completed") > -1: ### Removing Files command = 'sudo rm -f ' + status ProcessUtilities.normalExecutioner(command) command = 'sudo rm -f ' + backupFileNamePath ProcessUtilities.normalExecutioner(command) command = 'sudo rm -f ' + pid ProcessUtilities.normalExecutioner(command) backupSchedule.remoteBackupLogging(backupLogPath, "Backup Completed for: " + virtualHost) return 1, tempStoragePath elif status.find("[5009]") > -1: ## removing status file, so that backup can re-run try: command = 'sudo rm -f ' + status ProcessUtilities.normalExecutioner(command) command = 'sudo rm -f ' + backupFileNamePath ProcessUtilities.normalExecutioner(command) command = 'sudo rm -f ' + pid ProcessUtilities.normalExecutioner(command) backupObs = Backups.objects.filter(fileName=fileName) for items in backupObs: items.delete() except: pass backupSchedule.remoteBackupLogging(backupLogPath, "An error occurred, Error message: " + status) return 0, tempStoragePath except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]") return 0, "None" @staticmethod def createBackup(virtualHost, ipAddress, backupLogPath , port): try: backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to create backup for: " + virtualHost) backupSchedule.remoteBackupLogging(backupLogPath, "Backup started for: " + virtualHost) retValues = backupSchedule.createLocalBackup(virtualHost, backupLogPath) if retValues[0] == 1: backupPath = retValues[1] backupSchedule.remoteBackupLogging(backupLogPath, "Backup created for: " + virtualHost) ## Prepping to send backup. backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to send backup for: " + virtualHost +" to " + ipAddress) backupSchedule.sendBackup(backupPath+".tar.gz", ipAddress, backupLogPath, port) backupSchedule.remoteBackupLogging(backupLogPath, "Backup for: " + virtualHost + " is sent to " + ipAddress) ## Backup sent. backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "#################################################") backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "") else: backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "#################################################") backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "") except BaseException,msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupSchedule.createBackup]") @staticmethod def sendBackup(backupPath, IPAddress, backupLogPath , port): try: ## IPAddress of local server ipFile = "/etc/cyberpanel/machineIP" f = open(ipFile) ipData = f.read() ipAddressLocal = ipData.split('\n', 1)[0] ## writeToFile = open(backupLogPath, "a") command = "sudo scp -o StrictHostKeyChecking=no -P "+port+" -i /root/.ssh/cyberpanel " + backupPath + " root@"+IPAddress+":/home/backup/" + ipAddressLocal + "/" + time.strftime("%a-%b") + "/" subprocess.call(shlex.split(command), stdout=writeToFile) ## Remove backups already sent to remote destinations os.remove(backupPath) except BaseException, msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]") @staticmethod def prepare(): try: destinations = backupUtilities.destinationsPath backupLogPath = "/usr/local/lscp/logs/backup_log."+time.strftime("%I-%M-%S-%a-%b-%Y") backupSchedule.remoteBackupLogging(backupLogPath,"#################################################") backupSchedule.remoteBackupLogging(backupLogPath," Backup log for: " +time.strftime("%I-%M-%S-%a-%b-%Y")) backupSchedule.remoteBackupLogging(backupLogPath,"#################################################\n") backupSchedule.remoteBackupLogging(backupLogPath, "") backupSchedule.remoteBackupLogging(backupLogPath, "") ## IP of Remote server. data = open(destinations,'r').readlines() ipAddress = data[0].strip("\n") port = data[1].strip("\n") ## IPAddress of local server ipFile = "/etc/cyberpanel/machineIP" f = open(ipFile) ipData = f.read() ipAddressLocal = ipData.split('\n', 1)[0] if backupUtilities.checkIfHostIsUp(ipAddress) != 1: backupSchedule.remoteBackupLogging(backupLogPath, "Ping for : " + ipAddress + " does not seems to work, however we will continue.") checkConn = backupUtilities.checkConnection(ipAddress) if checkConn[0] == 0: backupSchedule.remoteBackupLogging(backupLogPath, "Connection to: " + ipAddress + " Failed, please resetup this destination from CyberPanel, aborting.") return 0 else: ## Create backup dir on remote server command = "sudo ssh -o StrictHostKeyChecking=no -p " + port + " -i /root/.ssh/cyberpanel root@" + ipAddress + " mkdir -p /home/backup/" + ipAddressLocal + "/" + time.strftime( "%a-%b") subprocess.call(shlex.split(command)) pass for virtualHost in os.listdir("/home"): if match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', virtualHost, M | I): backupSchedule.createBackup(virtualHost, ipAddress, backupLogPath, port) backupSchedule.remoteBackupLogging(backupLogPath, "Remote backup job completed.\n") except BaseException,msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [prepare]") def main(): backupSchedule.prepare() if __name__ == "__main__": main()