Files
CyberPanel/plogical/remoteBackup.py

364 lines
16 KiB
Python
Raw Normal View History

2017-10-24 19:16:36 +05:00
import CyberCPLogFileWriter as logging
import os
import requests
import json
import time
import backupUtilities as backupUtil
import subprocess
import shlex
2017-10-26 23:50:59 +05:00
from multiprocessing import Process
from shutil import move,rmtree
2017-10-24 19:16:36 +05:00
class remoteBackup:
@staticmethod
def getKey(ipAddress, password):
try:
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:
return [1, data["pubKey"]]
else:
return [0, data['error_message']]
except BaseException,msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [getKey]")
return [0,"Not able to fetch key from remote server, Error Message:" + str(msg)]
2017-10-24 19:16:36 +05:00
@staticmethod
2017-10-26 23:50:59 +05:00
def startRestore(backupDir,backupLogPath,dir):
2017-10-24 19:16:36 +05:00
try:
ext = ".tar.gz"
2017-10-26 23:50:59 +05:00
2017-10-24 19:16:36 +05:00
for backup in os.listdir(backupDir):
2017-10-26 23:50:59 +05:00
if backup.endswith(ext):
2017-12-09 22:30:10 +05:00
writeToFile = open(backupLogPath, "a")
2017-10-26 23:50:59 +05:00
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Starting restore for: "+backup+".\n")
writeToFile.close()
2017-10-26 23:50:59 +05:00
2017-12-09 22:30:10 +05:00
finalData = json.dumps({'backupFile': backup, "dir": dir})
r = requests.post("http://localhost:5003/backup/submitRestore", data=finalData, verify=False)
data = json.loads(r.text)
2017-10-26 23:50:59 +05:00
2017-12-09 22:30:10 +05:00
if data['restoreStatus'] == 1:
while (1):
time.sleep(1)
finalData = json.dumps({'backupFile': backup, "dir": dir})
r = requests.post("http://localhost:5003/backup/restoreStatus", data=finalData,
verify=False)
data = json.loads(r.text)
if data['abort'] == 1 and data['running'] == "Error":
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Restore aborted for: " + backup + ". Error message: "+data['status']+"\n")
2017-12-09 22:30:10 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " #########################################\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
break
elif data['abort'] == 1 and data['running'] == "Completed":
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Restore Completed for: " + backup + ".\n")
2017-12-09 22:30:10 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " #########################################\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
break
else:
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Waiting for restore to complete.\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
time.sleep(3)
pass
else:
logging.CyberCPLogFileWriter.writeToFile("Could not start restore process for: " + backup)
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + "Could not start restore process for: " + backup + "\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
2017-10-24 19:16:36 +05:00
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Backup Restore complete\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("completed[success]")
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [initiateRestore]")
@staticmethod
2017-10-26 23:50:59 +05:00
def remoteRestore(backupDir, dir):
2017-10-24 19:16:36 +05:00
try:
2017-10-26 23:50:59 +05:00
## dir is transfer-###
# backupDir is /home/backup/transfer-###
2017-10-24 19:16:36 +05:00
backupLogPath = backupDir + "/backup_log"
writeToFile = open(backupLogPath, "a+")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("############################\n")
writeToFile.writelines(" Starting Backup Restore\n")
writeToFile.writelines(" Start date: " + time.strftime("%m.%d.%Y_%H-%M-%S") + "\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("############################\n")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
2017-10-26 23:50:59 +05:00
writeToFile.close()
2017-10-24 19:16:36 +05:00
if os.path.exists(backupDir):
pass
else:
return [0, 'No such directory found']
2017-10-26 23:50:59 +05:00
p = Process(target=remoteBackup.startRestore, args=(backupDir, backupLogPath,dir,))
p.start()
2017-10-24 19:16:36 +05:00
return [1, 'Started']
2017-10-26 23:50:59 +05:00
pid = open(destination + '/pid', "w")
pid.write(str(p.pid))
pid.close()
2017-10-24 19:16:36 +05:00
except BaseException, msg:
2017-10-26 23:50:59 +05:00
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [remoteRestore]")
2017-10-24 19:16:36 +05:00
return [0, msg]
@staticmethod
def postRemoteTransfer(ipAddress, ownIP ,password, sshkey):
try:
finalData = json.dumps({'username': "admin", "ipAddress": ownIP, "password": password})
url = "https://" + ipAddress + ":8090/api/remoteTransfer"
r = requests.post(url, data=finalData, verify=False)
data = json.loads(r.text)
if data['transferStatus'] == 1:
path = "/home/backup/transfer-"+data['dir']
if not os.path.exists(path):
os.makedirs(path)
return [1, data['dir']]
else:
return [0, data['error_message']]
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [postRemoteTransfer]")
return [0, msg]
@staticmethod
def createBackup(virtualHost, ipAddress,writeToFile, dir):
try:
writeToFile.writelines("Location: "+dir + "\n")
writeToFile.writelines("["+time.strftime("%m.%d.%Y_%H-%M-%S")+"]"+" Preparing to create backup for: "+virtualHost+"\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Backup started for: " + virtualHost + "\n")
2017-10-24 19:16:36 +05:00
finalData = json.dumps({'websiteToBeBacked': virtualHost})
r = requests.post("http://localhost:5003/backup/submitBackupCreation", data=finalData,verify=False)
2017-10-24 19:16:36 +05:00
data = json.loads(r.text)
backupPath = data['tempStorage']
while (1):
r = requests.post("http://localhost:5003/backup/backupStatus", data= finalData,verify=False)
2017-10-24 19:16:36 +05:00
time.sleep(2)
data = json.loads(r.text)
if data['status'] == 0:
break
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Backup created for:" + virtualHost + "\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Preparing to send backup for: " + virtualHost +" to "+ipAddress+ "\n")
2017-10-24 19:16:36 +05:00
writeToFile.flush()
remoteBackup.sendBackup(backupPath+".tar.gz", ipAddress,writeToFile, dir)
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Backup for: " + virtualHost + " is sent to " + ipAddress + "\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("\n")
writeToFile.writelines("\n")
writeToFile.writelines("#####################################")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
except BaseException,msg:
2019-07-18 14:08:00 +05:00
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [214:startBackup]")
2017-10-24 19:16:36 +05:00
@staticmethod
2017-10-26 23:50:59 +05:00
def sendBackup(completedPathToSend, IPAddress, folderNumber,writeToFile):
2017-10-24 19:16:36 +05:00
try:
2017-10-26 23:50:59 +05:00
## complete path is a path to the file need to send
2017-12-09 22:30:10 +05:00
command = 'sudo rsync -avz -e "ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no" ' + completedPathToSend + ' root@' + IPAddress + ':/home/backup/transfer-'+folderNumber
2019-03-26 16:19:03 +05:00
subprocess.call(shlex.split(command), stdout=writeToFile)
2018-07-23 02:09:33 +05:00
os.remove(completedPathToSend)
2017-10-24 19:16:36 +05:00
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
@staticmethod
2017-10-27 00:09:34 +05:00
def backupProcess(ipAddress, dir, backupLogPath,folderNumber,accountsToTransfer):
2017-10-24 19:16:36 +05:00
try:
2017-10-26 23:50:59 +05:00
## dir is without forward slash
2017-10-24 19:16:36 +05:00
2017-10-27 00:09:34 +05:00
for virtualHost in accountsToTransfer:
2017-10-24 19:16:36 +05:00
2017-10-26 23:50:59 +05:00
try:
2017-10-24 19:16:36 +05:00
2017-10-26 23:50:59 +05:00
if virtualHost == "vmail" or virtualHost == "backup":
continue
2017-10-26 23:50:59 +05:00
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Currently generating local backups for: " + virtualHost + "\n")
2017-10-26 23:50:59 +05:00
writeToFile.close()
finalData = json.dumps({'websiteToBeBacked': virtualHost})
r = requests.post("http://localhost:5003/backup/submitBackupCreation", data=finalData,verify=False)
2017-10-26 23:50:59 +05:00
data = json.loads(r.text)
fileName = data['tempStorage']+".tar.gz"
completePathToBackupFile = fileName
while (1):
time.sleep(2)
2017-12-09 22:30:10 +05:00
r = requests.post("http://localhost:5003/backup/backupStatus", data= finalData,verify=False)
2017-10-26 23:50:59 +05:00
data = json.loads(r.text)
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Waiting for backup to complete.. " + "\n")
2017-10-26 23:50:59 +05:00
writeToFile.close()
2017-12-09 22:30:10 +05:00
if data['abort'] == 1:
2017-10-26 23:50:59 +05:00
writeToFile = open(backupLogPath, "a")
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Local Backup Completed for: " +virtualHost + " with status: "+ data['status'] +"\n")
2017-10-26 23:50:59 +05:00
## move the generated backup file to specified destination
if os.path.exists(completePathToBackupFile):
move(completePathToBackupFile,dir)
completedPathToSend = dir +"/" + completePathToBackupFile.split("/")[-1]
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Sending " + completedPathToSend +" to "+ipAddress +".\n")
2017-10-26 23:50:59 +05:00
remoteBackup.sendBackup(completedPathToSend,ipAddress,str(folderNumber),writeToFile)
2017-11-05 03:02:51 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Sent " + completedPathToSend + " to " + ipAddress + ".\n")
2017-11-05 03:02:51 +05:00
2017-10-26 23:50:59 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " #############################################" + "\n")
2017-10-26 23:50:59 +05:00
writeToFile.close()
break
except:
pass
writeToFile = open(backupLogPath, "a")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Backups are successfully generated and received on: " + ipAddress + "\n")
2017-10-26 23:50:59 +05:00
writeToFile.close()
## removing local directory where backups were generated
time.sleep(5)
2017-12-09 22:30:10 +05:00
#rmtree(dir)
2017-10-24 19:16:36 +05:00
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupProcess]")
@staticmethod
2017-10-27 00:09:34 +05:00
def remoteTransfer(ipAddress, dir,accountsToTransfer):
2017-10-24 19:16:36 +05:00
try:
2017-10-24 19:16:36 +05:00
destination = "/home/backup/transfer-" + dir
backupLogPath = destination + "/backup_log"
if not os.path.exists(destination):
os.makedirs(destination)
writeToFile = open(backupLogPath, "w+")
writeToFile.writelines("############################\n")
writeToFile.writelines(" Starting remote Backup\n")
writeToFile.writelines(" Start date: " + time.strftime("%m.%d.%Y_%H-%M-%S") + "\n")
2017-10-24 19:16:36 +05:00
writeToFile.writelines("############################\n")
writeToFile.writelines("\n")
writeToFile.writelines("\n")
2017-10-26 23:50:59 +05:00
2017-10-24 19:16:36 +05:00
if backupUtil.backupUtilities.checkIfHostIsUp(ipAddress) == 1:
checkConn = backupUtil.backupUtilities.checkConnection(ipAddress)
if checkConn[0] == 0:
2017-10-24 19:16:36 +05:00
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Connection to:" + ipAddress + " Failed, please resetup this destination from CyberPanel, aborting." + "\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
return [0, checkConn[1]]
2017-10-24 19:16:36 +05:00
else:
pass
else:
writeToFile.writelines("[" + time.strftime(
"%m.%d.%Y_%H-%M-%S") + "]" + " Host:" + ipAddress + " is down, aborting." + "\n")
2017-12-09 22:30:10 +05:00
writeToFile.close()
return [0, "Remote server is not able to communicate with this server."]
2017-10-24 19:16:36 +05:00
writeToFile.close()
2017-10-24 19:16:36 +05:00
2017-10-27 00:09:34 +05:00
p = Process(target=remoteBackup.backupProcess, args=(ipAddress, destination, backupLogPath,dir,accountsToTransfer))
2017-10-26 23:50:59 +05:00
p.start()
pid = open(destination + '/pid', "w")
pid.write(str(p.pid))
pid.close()
2017-10-24 19:16:36 +05:00
return [1, None]
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [remoteTransfer]")
2017-10-24 19:16:36 +05:00
return [0, msg]