Files
CyberPanel/plogical/backupSchedule.py

253 lines
9.7 KiB
Python
Raw Normal View History

2019-03-31 02:47:35 +05:00
#!/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()
2017-10-24 19:16:36 +05:00
import CyberCPLogFileWriter as logging
import subprocess
import shlex
import os
import time
from backupUtilities import backupUtilities
from re import match,I,M
2019-03-31 02:47:35 +05:00
from websiteFunctions.models import Websites, Backups
from plogical.processUtilities import ProcessUtilities
from multiprocessing import Process
import plogical.backupUtilities as backupUtil
2019-07-18 14:08:00 +05:00
from random import randint
import json, requests
2017-10-24 19:16:36 +05:00
class backupSchedule:
2018-04-23 19:23:03 +05:00
@staticmethod
def remoteBackupLogging(fileName, message):
try:
file = open(fileName,'a')
file.writelines("[" + time.strftime("%I-%M-%S-%a-%b-%Y") + "] "+ message + "\n")
2019-07-18 14:08:00 +05:00
print ("[" + time.strftime("%I-%M-%S-%a-%b-%Y") + "] "+ message + "\n")
2018-04-23 19:23:03 +05:00
file.close()
except IOError,msg:
return "Can not write to error file."
2017-10-24 19:16:36 +05:00
@staticmethod
2018-08-18 03:56:25 +05:00
def createLocalBackup(virtualHost, backupLogPath):
2017-10-24 19:16:36 +05:00
try:
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Starting local backup for: " + virtualHost)
2017-10-24 19:16:36 +05:00
2019-07-18 14:08:00 +05:00
###
2018-08-18 03:56:25 +05:00
2019-07-18 14:08:00 +05:00
pathToFile = "/home/cyberpanel/" + str(randint(1000, 9999))
file = open(pathToFile, "w+")
file.close()
2019-03-31 02:47:35 +05:00
2019-07-18 14:08:00 +05:00
finalData = json.dumps({'randomFile': pathToFile, 'websiteToBeBacked': virtualHost})
r = requests.post("https://localhost:8090/backup/localInitiate", data=finalData, verify=False)
2019-03-31 02:47:35 +05:00
2019-07-18 14:08:00 +05:00
data = json.loads(r.text)
tempStoragePath = data['tempStorage']
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Waiting for backup to complete.. ")
2017-10-24 19:16:36 +05:00
while (1):
2019-03-31 02:47:35 +05:00
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()
2019-07-18 14:08:00 +05:00
print status
time.sleep(2)
2019-03-31 02:47:35 +05:00
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)
2019-07-18 14:08:00 +05:00
try:
os.remove(pathToFile)
except:
pass
2019-03-31 02:47:35 +05:00
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)
2019-07-18 14:08:00 +05:00
try:
os.remove(pathToFile)
except:
pass
2019-03-31 02:47:35 +05:00
return 0, tempStoragePath
2018-08-18 03:56:25 +05:00
except BaseException, msg:
2019-07-18 14:08:00 +05:00
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [119:startBackup]")
2019-03-13 23:20:15 +05:00
return 0, "None"
2018-04-23 19:23:03 +05:00
2018-08-18 03:56:25 +05:00
@staticmethod
def createBackup(virtualHost, ipAddress, backupLogPath , port):
try:
2018-04-23 19:23:03 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to create backup for: " + virtualHost)
backupSchedule.remoteBackupLogging(backupLogPath, "Backup started for: " + virtualHost)
2018-04-23 19:23:03 +05:00
2018-08-18 03:56:25 +05:00
retValues = backupSchedule.createLocalBackup(virtualHost, backupLogPath)
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
if retValues[0] == 1:
backupPath = retValues[1]
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Backup created for: " + virtualHost)
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
## Prepping to send backup.
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Preparing to send backup for: " + virtualHost +" to " + ipAddress)
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.sendBackup(backupPath+".tar.gz", ipAddress, backupLogPath, port)
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
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, "")
2017-10-24 19:16:36 +05:00
except BaseException,msg:
2019-03-13 18:22:12 +05:00
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupSchedule.createBackup]")
2017-10-24 19:16:36 +05:00
@staticmethod
2018-04-23 19:23:03 +05:00
def sendBackup(backupPath, IPAddress, backupLogPath , port):
2017-10-24 19:16:36 +05:00
try:
2018-04-23 19:23:03 +05:00
## 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") + "/"
2019-03-26 16:19:03 +05:00
subprocess.call(shlex.split(command), stdout=writeToFile)
2018-07-29 01:20:46 +05:00
## Remove backups already sent to remote destinations
os.remove(backupPath)
except BaseException, msg:
2019-07-18 14:08:00 +05:00
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [189:startBackup]")
2017-10-24 19:16:36 +05:00
@staticmethod
def prepare():
try:
2017-12-09 22:30:10 +05:00
destinations = backupUtilities.destinationsPath
2017-10-24 19:16:36 +05:00
backupLogPath = "/usr/local/lscp/logs/backup_log."+time.strftime("%I-%M-%S-%a-%b-%Y")
2018-04-23 19:23:03 +05:00
backupSchedule.remoteBackupLogging(backupLogPath,"#################################################")
backupSchedule.remoteBackupLogging(backupLogPath," Backup log for: " +time.strftime("%I-%M-%S-%a-%b-%Y"))
backupSchedule.remoteBackupLogging(backupLogPath,"#################################################\n")
2017-10-24 19:16:36 +05:00
2018-04-23 19:23:03 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "")
backupSchedule.remoteBackupLogging(backupLogPath, "")
2017-10-24 19:16:36 +05:00
2018-04-23 19:23:03 +05:00
## IP of Remote server.
2017-10-24 19:16:36 +05:00
data = open(destinations,'r').readlines()
ipAddress = data[0].strip("\n")
port = data[1].strip("\n")
2017-10-24 19:16:36 +05:00
2018-04-23 19:23:03 +05:00
## IPAddress of local server
ipFile = "/etc/cyberpanel/machineIP"
f = open(ipFile)
ipData = f.read()
ipAddressLocal = ipData.split('\n', 1)[0]
2017-10-24 19:16:36 +05:00
2019-03-13 23:20:15 +05:00
if backupUtilities.checkIfHostIsUp(ipAddress) != 1:
backupSchedule.remoteBackupLogging(backupLogPath, "Ping for : " + ipAddress + " does not seems to work, however we will continue.")
2018-02-19 23:42:57 +05:00
2019-03-13 23:20:15 +05:00
checkConn = backupUtilities.checkConnection(ipAddress)
if checkConn[0] == 0:
backupSchedule.remoteBackupLogging(backupLogPath,
"Connection to: " + ipAddress + " Failed, please resetup this destination from CyberPanel, aborting.")
2017-10-24 19:16:36 +05:00
return 0
2019-03-13 23:20:15 +05:00
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")
2019-03-26 16:19:03 +05:00
subprocess.call(shlex.split(command))
2019-03-13 23:20:15 +05:00
pass
2017-10-24 19:16:36 +05:00
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)
2017-10-24 19:16:36 +05:00
2018-08-18 03:56:25 +05:00
backupSchedule.remoteBackupLogging(backupLogPath, "Remote backup job completed.\n")
2017-10-24 19:16:36 +05:00
except BaseException,msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [prepare]")
2017-10-24 19:16:36 +05:00
2018-08-18 15:16:15 +05:00
def main():
backupSchedule.prepare()
2017-10-24 19:16:36 +05:00
2018-08-18 15:16:15 +05:00
if __name__ == "__main__":
main()