2018-06-05 00:53:45 +05:00
|
|
|
import os,sys
|
|
|
|
|
sys.path.append('/usr/local/CyberCP')
|
|
|
|
|
import django
|
|
|
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
|
|
|
|
|
django.setup()
|
2017-10-24 19:16:36 +05:00
|
|
|
import pexpect
|
|
|
|
|
import CyberCPLogFileWriter as logging
|
|
|
|
|
import subprocess
|
|
|
|
|
import shlex
|
|
|
|
|
from shutil import make_archive,rmtree
|
|
|
|
|
import mysqlUtilities
|
|
|
|
|
import tarfile
|
|
|
|
|
from multiprocessing import Process
|
|
|
|
|
import json
|
|
|
|
|
import requests
|
2017-10-29 22:16:06 +05:00
|
|
|
import signal
|
2017-11-05 03:02:51 +05:00
|
|
|
from installUtilities import installUtilities
|
2017-12-09 22:30:10 +05:00
|
|
|
import argparse
|
|
|
|
|
from shutil import move,copy
|
2018-02-16 00:57:46 +05:00
|
|
|
from xml.etree import ElementTree
|
2018-06-05 00:53:45 +05:00
|
|
|
from virtualHostUtilities import virtualHostUtilities
|
2018-05-09 23:10:57 +05:00
|
|
|
from sslUtilities import sslUtilities
|
2018-06-05 00:53:45 +05:00
|
|
|
from websiteFunctions.models import Websites, ChildDomains, Backups
|
|
|
|
|
from databases.models import Databases
|
|
|
|
|
from loginSystem.models import Administrator
|
|
|
|
|
from dnsUtilities import DNS
|
|
|
|
|
from xml.etree.ElementTree import Element, SubElement
|
|
|
|
|
from xml.etree import ElementTree
|
|
|
|
|
from xml.dom import minidom
|
|
|
|
|
from backup.models import DBUsers
|
|
|
|
|
from mailServer.models import Domains as eDomains
|
|
|
|
|
from random import randint
|
|
|
|
|
import time
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-02-16 21:05:15 +05:00
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
## I am not the monster that you think I am..
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
class backupUtilities:
|
|
|
|
|
|
2017-11-05 03:02:51 +05:00
|
|
|
completeKeyPath = "/home/cyberpanel/.ssh"
|
2017-12-09 22:30:10 +05:00
|
|
|
destinationsPath = "/home/cyberpanel/destinations"
|
2017-11-05 03:02:51 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
@staticmethod
|
|
|
|
|
def prepareBackupMeta(backupDomain, backupName, tempStoragePath, backupPath):
|
|
|
|
|
try:
|
|
|
|
|
## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 -- tempStoragePath
|
|
|
|
|
## /home/example.com/backup - backupPath
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(backupPath):
|
|
|
|
|
os.mkdir(backupPath)
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(tempStoragePath):
|
|
|
|
|
os.mkdir(tempStoragePath)
|
|
|
|
|
|
|
|
|
|
website = Websites.objects.get(domain=backupDomain)
|
|
|
|
|
|
|
|
|
|
######### Generating meta
|
|
|
|
|
|
|
|
|
|
## XML Generation
|
|
|
|
|
|
|
|
|
|
metaFileXML = Element('metaFile')
|
|
|
|
|
|
|
|
|
|
child = SubElement(metaFileXML, 'masterDomain')
|
|
|
|
|
child.text = backupDomain
|
|
|
|
|
|
|
|
|
|
child = SubElement(metaFileXML, 'phpSelection')
|
|
|
|
|
child.text = website.phpSelection
|
|
|
|
|
|
|
|
|
|
child = SubElement(metaFileXML, 'externalApp')
|
|
|
|
|
child.text = website.externalApp
|
|
|
|
|
|
|
|
|
|
childDomains = website.childdomains_set.all()
|
|
|
|
|
|
|
|
|
|
databases = website.databases_set.all()
|
|
|
|
|
|
|
|
|
|
## Child domains XML
|
|
|
|
|
|
|
|
|
|
childDomainsXML = Element('ChildDomains')
|
|
|
|
|
|
|
|
|
|
for items in childDomains:
|
|
|
|
|
childDomainXML = Element('domain')
|
|
|
|
|
|
|
|
|
|
child = SubElement(childDomainXML, 'domain')
|
|
|
|
|
child.text = items.domain
|
|
|
|
|
child = SubElement(childDomainXML, 'phpSelection')
|
|
|
|
|
child.text = items.phpSelection
|
|
|
|
|
child = SubElement(childDomainXML, 'path')
|
|
|
|
|
child.text = items.path
|
|
|
|
|
|
|
|
|
|
childDomainsXML.append(childDomainXML)
|
|
|
|
|
|
|
|
|
|
metaFileXML.append(childDomainsXML)
|
|
|
|
|
|
|
|
|
|
## Databases XML
|
|
|
|
|
|
|
|
|
|
databasesXML = Element('Databases')
|
|
|
|
|
|
|
|
|
|
for items in databases:
|
|
|
|
|
dbuser = DBUsers.objects.get(user=items.dbUser)
|
|
|
|
|
|
|
|
|
|
databaseXML = Element('database')
|
|
|
|
|
|
|
|
|
|
child = SubElement(databaseXML, 'dbName')
|
|
|
|
|
child.text = items.dbName
|
|
|
|
|
child = SubElement(databaseXML, 'dbUser')
|
|
|
|
|
child.text = items.dbUser
|
|
|
|
|
child = SubElement(databaseXML, 'password')
|
|
|
|
|
child.text = dbuser.password
|
|
|
|
|
|
|
|
|
|
databasesXML.append(databaseXML)
|
|
|
|
|
|
|
|
|
|
metaFileXML.append(databasesXML)
|
|
|
|
|
|
|
|
|
|
## Get Aliases
|
|
|
|
|
|
|
|
|
|
aliasesXML = Element('Aliases')
|
|
|
|
|
|
|
|
|
|
aliases = backupUtilities.getAliases(backupDomain)
|
|
|
|
|
|
|
|
|
|
for items in aliases:
|
|
|
|
|
child = SubElement(aliasesXML, 'alias')
|
|
|
|
|
child.text = items
|
|
|
|
|
|
|
|
|
|
metaFileXML.append(aliasesXML)
|
|
|
|
|
|
|
|
|
|
## Finish Alias
|
|
|
|
|
|
|
|
|
|
## DNS Records XML
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
dnsRecordsXML = Element("dnsrecords")
|
|
|
|
|
dnsRecords = DNS.getDNSRecords(backupDomain)
|
|
|
|
|
|
|
|
|
|
for items in dnsRecords:
|
|
|
|
|
dnsRecordXML = Element('dnsrecord')
|
|
|
|
|
|
|
|
|
|
child = SubElement(dnsRecordXML, 'type')
|
|
|
|
|
child.text = items.type
|
|
|
|
|
child = SubElement(dnsRecordXML, 'name')
|
|
|
|
|
child.text = items.name
|
|
|
|
|
child = SubElement(dnsRecordXML, 'content')
|
|
|
|
|
child.text = items.content
|
|
|
|
|
child = SubElement(dnsRecordXML, 'priority')
|
|
|
|
|
child.text = str(items.prio)
|
|
|
|
|
|
|
|
|
|
dnsRecordsXML.append(dnsRecordXML)
|
|
|
|
|
|
|
|
|
|
metaFileXML.append(dnsRecordsXML)
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg))
|
|
|
|
|
|
|
|
|
|
## Email accounts XML
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
emailRecordsXML = Element('emails')
|
|
|
|
|
eDomain = eDomains.objects.get(domain=backupDomain)
|
|
|
|
|
emailAccounts = eDomain.eusers_set.all()
|
|
|
|
|
|
|
|
|
|
for items in emailAccounts:
|
|
|
|
|
emailRecordXML = Element('emailAccount')
|
|
|
|
|
|
|
|
|
|
child = SubElement(emailRecordXML, 'email')
|
|
|
|
|
child.text = items.email
|
|
|
|
|
child = SubElement(emailRecordXML, 'password')
|
|
|
|
|
child.text = items.password
|
|
|
|
|
|
|
|
|
|
emailRecordsXML.append(emailRecordXML)
|
|
|
|
|
|
|
|
|
|
metaFileXML.append(emailRecordsXML)
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg))
|
|
|
|
|
|
|
|
|
|
## Email meta generated!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def prettify(elem):
|
|
|
|
|
"""Return a pretty-printed XML string for the Element.
|
|
|
|
|
"""
|
|
|
|
|
rough_string = ElementTree.tostring(elem, 'utf-8')
|
|
|
|
|
reparsed = minidom.parseString(rough_string)
|
|
|
|
|
return reparsed.toprettyxml(indent=" ")
|
|
|
|
|
|
|
|
|
|
## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018/meta.xml -- metaPath
|
|
|
|
|
metaPath = os.path.join(tempStoragePath, "meta.xml")
|
|
|
|
|
|
|
|
|
|
xmlpretty = prettify(metaFileXML).encode('ascii', 'ignore')
|
|
|
|
|
metaFile = open(metaPath, 'w')
|
|
|
|
|
metaFile.write(xmlpretty)
|
|
|
|
|
metaFile.close()
|
|
|
|
|
|
|
|
|
|
## meta generated
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
newBackup = Backups(website=website, fileName=backupName, date=time.strftime("%I-%M-%S-%a-%b-%Y"),
|
|
|
|
|
size=0, status=0)
|
|
|
|
|
newBackup.save()
|
|
|
|
|
|
|
|
|
|
return 1,'None'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
return 0,str(msg)
|
|
|
|
|
|
2017-11-05 03:02:51 +05:00
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
@staticmethod
|
|
|
|
|
def startBackup(tempStoragePath,backupName,backupPath):
|
|
|
|
|
try:
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
##### Writing the name of backup file.
|
2017-12-09 22:30:10 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
## /home/example.com/backup/backupFileName
|
|
|
|
|
backupFileNamePath = os.path.join(backupPath,"backupFileName")
|
2017-12-09 22:30:10 +05:00
|
|
|
status = open(backupFileNamePath, "w")
|
|
|
|
|
status.write(backupName)
|
|
|
|
|
status.close()
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
#####
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
|
|
|
|
|
status = open(os.path.join(backupPath,'status'),"w")
|
2018-05-11 00:03:26 +05:00
|
|
|
status.write("Making archive of home directory.\n")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
##### Parsing XML Meta file!
|
2017-12-09 22:30:10 +05:00
|
|
|
|
2018-02-16 21:05:15 +05:00
|
|
|
## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 -- tempStoragePath
|
2018-02-16 00:57:46 +05:00
|
|
|
backupMetaData = ElementTree.parse(os.path.join(tempStoragePath,'meta.xml'))
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
##### Making archive of home directory
|
2018-02-16 00:57:46 +05:00
|
|
|
|
|
|
|
|
domainName = backupMetaData.find('masterDomain').text
|
2018-02-17 15:34:59 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 -- tempStoragePath
|
2018-02-16 21:05:15 +05:00
|
|
|
## shutil.make_archive
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
make_archive(os.path.join(tempStoragePath,"public_html"), 'gztar', os.path.join("/home",domainName,"public_html"))
|
|
|
|
|
|
2018-02-17 15:34:59 +05:00
|
|
|
## backup email accounts
|
|
|
|
|
|
|
|
|
|
status = open(os.path.join(backupPath, 'status'), "w")
|
|
|
|
|
status.write("Backing up email accounts!\n")
|
|
|
|
|
status.close()
|
|
|
|
|
|
2018-02-21 20:10:39 +05:00
|
|
|
try:
|
|
|
|
|
make_archive(os.path.join(tempStoragePath,domainName),'gztar',os.path.join("/home","vmail",domainName))
|
|
|
|
|
except:
|
|
|
|
|
pass
|
2018-02-17 15:34:59 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
## Backing up databases
|
|
|
|
|
databases = backupMetaData.findall('Databases/database')
|
|
|
|
|
|
|
|
|
|
for database in databases:
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
dbName = database.find('dbName').text
|
|
|
|
|
|
|
|
|
|
status = open(os.path.join(backupPath,'status'), "w")
|
|
|
|
|
status.write("Backing up database: " + dbName)
|
|
|
|
|
status.close()
|
2018-02-16 21:05:15 +05:00
|
|
|
if mysqlUtilities.mysqlUtilities.createDatabaseBackup(dbName, tempStoragePath) == 0:
|
|
|
|
|
raise BaseException
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
##### Saving SSL Certificates if any
|
|
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
try:
|
|
|
|
|
pathToStoreSSL = sslUtilities.Server_root + "/conf/vhosts/" + "SSL-" + domainName
|
|
|
|
|
if os.path.exists(pathToStoreSSL):
|
|
|
|
|
pathToStoreSSLPrivKey = pathToStoreSSL + "/privkey.pem"
|
|
|
|
|
pathToStoreSSLFullChain = pathToStoreSSL + "/fullchain.pem"
|
|
|
|
|
|
|
|
|
|
copy(pathToStoreSSLPrivKey, tempStoragePath + "/privkey.pem")
|
|
|
|
|
copy(pathToStoreSSLFullChain, tempStoragePath + "/fullchain.pem")
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
## Child Domains SSL.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
childDomains = backupMetaData.findall('ChildDomains/domain')
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
for childDomain in childDomains:
|
|
|
|
|
|
|
|
|
|
actualChildDomain = childDomain.find('domain').text
|
|
|
|
|
|
|
|
|
|
pathToStoreSSL = sslUtilities.Server_root + "/conf/vhosts/" + "SSL-" + actualChildDomain
|
2018-05-09 23:10:57 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
if os.path.exists(pathToStoreSSL):
|
|
|
|
|
pathToStoreSSLPrivKey = pathToStoreSSL + "/privkey.pem"
|
|
|
|
|
pathToStoreSSLFullChain = pathToStoreSSL + "/fullchain.pem"
|
|
|
|
|
|
|
|
|
|
tempKeyPath = os.path.join(tempStoragePath, actualChildDomain)
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(tempKeyPath):
|
|
|
|
|
os.mkdir(tempKeyPath)
|
|
|
|
|
|
|
|
|
|
copy(pathToStoreSSLPrivKey, tempKeyPath + "/privkey.pem")
|
|
|
|
|
copy(pathToStoreSSLFullChain, tempKeyPath + "/fullchain.pem")
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
|
|
|
|
|
|
|
|
|
|
##### Saving SSL Certificates if any
|
|
|
|
|
|
|
|
|
|
## shutil.make_archive. Creating final package.
|
|
|
|
|
|
|
|
|
|
make_archive(os.path.join(backupPath,backupName), 'gztar', tempStoragePath)
|
|
|
|
|
rmtree(tempStoragePath)
|
2018-05-09 23:10:57 +05:00
|
|
|
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(backupPath,'status'), "w")
|
2018-02-19 23:42:57 +05:00
|
|
|
status.write("Completed\n")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
except BaseException,msg:
|
|
|
|
|
try:
|
2018-02-16 00:57:46 +05:00
|
|
|
os.remove(os.path.join(backupPath,backupName+".tar.gz"))
|
2017-10-24 19:16:36 +05:00
|
|
|
except:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
rmtree(tempStoragePath)
|
|
|
|
|
except:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(backupPath,'status'), "w")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.write(backupName + "\n")
|
2017-12-09 22:30:10 +05:00
|
|
|
status.write("Aborted, please check CyberPanel main log file. [5009]")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startBackup]")
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def initiateBackup(tempStoragePath,backupName,backupPath):
|
|
|
|
|
try:
|
|
|
|
|
p = Process(target=backupUtilities.startBackup, args=(tempStoragePath,backupName,backupPath,))
|
|
|
|
|
p.start()
|
|
|
|
|
pid = open(backupPath + 'pid', "w")
|
|
|
|
|
pid.write(str(p.pid))
|
|
|
|
|
pid.close()
|
|
|
|
|
except BaseException,msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [initiateBackup]")
|
|
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
@staticmethod
|
|
|
|
|
def createWebsiteFromBackup(backupFileOrig, dir):
|
|
|
|
|
try:
|
|
|
|
|
backupFile = backupFileOrig.strip(".tar.gz")
|
|
|
|
|
originalFile = "/home/backup/" + backupFileOrig
|
|
|
|
|
|
|
|
|
|
if os.path.exists(backupFileOrig):
|
|
|
|
|
path = backupFile
|
|
|
|
|
elif not os.path.exists(originalFile):
|
|
|
|
|
dir = dir
|
|
|
|
|
path = "/home/backup/transfer-" + str(dir) + "/" + backupFile
|
|
|
|
|
else:
|
|
|
|
|
path = "/home/backup/" + backupFile
|
|
|
|
|
|
|
|
|
|
admin = Administrator.objects.get(pk=1)
|
|
|
|
|
|
|
|
|
|
## open meta file to read data
|
|
|
|
|
|
|
|
|
|
## Parsing XML Meta file!
|
|
|
|
|
|
|
|
|
|
backupMetaData = ElementTree.parse(os.path.join(path, 'meta.xml'))
|
|
|
|
|
|
|
|
|
|
domain = backupMetaData.find('masterDomain').text
|
|
|
|
|
phpSelection = backupMetaData.find('phpSelection').text
|
|
|
|
|
externalApp = backupMetaData.find('externalApp').text
|
|
|
|
|
|
|
|
|
|
## Pre-creation checks
|
|
|
|
|
|
|
|
|
|
if Websites.objects.filter(domain=domain).count() > 0:
|
|
|
|
|
raise BaseException('This website already exists.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ChildDomains.objects.filter(domain=domain).count() > 0:
|
|
|
|
|
raise BaseException("This website already exists as child domain.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
####### Pre-creation checks ends
|
|
|
|
|
|
|
|
|
|
numberOfWebsites = Websites.objects.count() + ChildDomains.objects.count()
|
|
|
|
|
|
|
|
|
|
## Create Configurations
|
|
|
|
|
|
|
|
|
|
result = virtualHostUtilities.createVirtualHost(domain, admin.email, phpSelection, externalApp,
|
|
|
|
|
numberOfWebsites, 0, 'CyberPanel', 1, 0,
|
|
|
|
|
admin.userName, 'Default')
|
|
|
|
|
|
|
|
|
|
if result[0] == 0:
|
|
|
|
|
raise BaseException(result[1])
|
|
|
|
|
|
|
|
|
|
## Create Configurations ends here
|
|
|
|
|
|
|
|
|
|
## Create databases
|
|
|
|
|
|
|
|
|
|
databases = backupMetaData.findall('Databases/database')
|
|
|
|
|
website = Websites.objects.get(domain=domain)
|
|
|
|
|
|
|
|
|
|
for database in databases:
|
|
|
|
|
dbName = database.find('dbName').text
|
|
|
|
|
dbUser = database.find('dbUser').text
|
|
|
|
|
|
|
|
|
|
if mysqlUtilities.mysqlUtilities.createDatabase(dbName, dbUser, "cyberpanel") == 0:
|
|
|
|
|
raise BaseException("Failed to create Databases!")
|
|
|
|
|
|
|
|
|
|
newDB = Databases(website=website, dbName=dbName, dbUser=dbUser)
|
|
|
|
|
newDB.save()
|
|
|
|
|
|
|
|
|
|
## Create dns zone
|
|
|
|
|
|
|
|
|
|
dnsrecords = backupMetaData.findall('dnsrecords/dnsrecord')
|
|
|
|
|
|
|
|
|
|
DNS.createDNSZone(domain, admin)
|
|
|
|
|
|
|
|
|
|
zone = DNS.getZoneObject(domain)
|
|
|
|
|
|
|
|
|
|
for dnsrecord in dnsrecords:
|
|
|
|
|
|
|
|
|
|
recordType = dnsrecord.find('type').text
|
|
|
|
|
value = dnsrecord.find('name').text
|
|
|
|
|
content = dnsrecord.find('content').text
|
|
|
|
|
prio = int(dnsrecord.find('priority').text)
|
|
|
|
|
|
|
|
|
|
DNS.createDNSRecord(zone, value, recordType, content, prio, 3600)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 1,'None'
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
return 0, str(msg)
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
@staticmethod
|
2017-10-26 23:50:59 +05:00
|
|
|
def startRestore(backupName, dir):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
|
|
|
|
|
2017-12-09 22:30:10 +05:00
|
|
|
if dir == "CyberPanelRestore":
|
2017-10-26 23:50:59 +05:00
|
|
|
backupFileName = backupName.strip(".tar.gz")
|
2018-02-16 00:57:46 +05:00
|
|
|
completPath = os.path.join("/home","backup",backupFileName) ## without extension
|
|
|
|
|
originalFile = os.path.join("/home","backup",backupName) ## with extension
|
2018-06-05 00:53:45 +05:00
|
|
|
elif dir == 'CLI':
|
|
|
|
|
completPath = backupName.strip(".tar.gz") ## without extension
|
|
|
|
|
originalFile = backupName ## with extension
|
2017-10-26 23:50:59 +05:00
|
|
|
else:
|
|
|
|
|
backupFileName = backupName.strip(".tar.gz")
|
|
|
|
|
completPath = "/home/backup/transfer-"+str(dir)+"/"+backupFileName ## without extension
|
|
|
|
|
originalFile = "/home/backup/transfer-"+str(dir)+"/"+backupName ## with extension
|
|
|
|
|
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
pathToCompressedHome = os.path.join(completPath,"public_html.tar.gz")
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
if not os.path.exists(completPath):
|
|
|
|
|
os.mkdir(completPath)
|
|
|
|
|
|
|
|
|
|
## writing pid of restore process
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
pid = open(os.path.join(completPath,'pid'), "w")
|
2017-10-24 19:16:36 +05:00
|
|
|
pid.write(str(os.getpid()))
|
|
|
|
|
pid.close()
|
|
|
|
|
|
2018-02-16 21:05:15 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2018-02-19 23:42:57 +05:00
|
|
|
status.write("Extracting Main Archive!")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-02-16 21:05:15 +05:00
|
|
|
## Converting /home/backup/backup-example-06-50-03-Thu-Feb-2018.tar.gz -> /home/backup/backup-example-06-50-03-Thu-Feb-2018
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
tar = tarfile.open(originalFile)
|
|
|
|
|
tar.extractall(completPath)
|
|
|
|
|
tar.close()
|
|
|
|
|
|
2018-02-16 21:05:15 +05:00
|
|
|
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2018-02-19 23:42:57 +05:00
|
|
|
status.write("Creating Accounts,Databases and DNS records!")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
########### Creating website and its dabases
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
## extracting master domain for later use
|
|
|
|
|
backupMetaData = ElementTree.parse(os.path.join(completPath, "meta.xml"))
|
|
|
|
|
masterDomain = backupMetaData.find('masterDomain').text
|
|
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
result = backupUtilities.createWebsiteFromBackup(backupName, dir)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
if result[0] == 1:
|
|
|
|
|
## Let us try to restore SSL.
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
if os.path.exists(completPath + "/privkey.pem"):
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
pathToStoreSSL = sslUtilities.Server_root + "/conf/vhosts/" + "SSL-" + masterDomain
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
if not os.path.exists(pathToStoreSSL):
|
|
|
|
|
os.mkdir(pathToStoreSSL)
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
sslUtilities.installSSLForDomain(masterDomain)
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
pathToStoreSSLPrivKey = pathToStoreSSL + "/privkey.pem"
|
|
|
|
|
pathToStoreSSLFullChain = pathToStoreSSL + "/fullchain.pem"
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
copy(completPath + "/privkey.pem", pathToStoreSSLPrivKey)
|
|
|
|
|
copy(completPath + "/fullchain.pem", pathToStoreSSLFullChain)
|
2018-05-11 00:03:26 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
command = "chown -R " + "lsadm" + ":" + "lsadm" + " " + pathToStoreSSL
|
|
|
|
|
cmd = shlex.split(command)
|
|
|
|
|
subprocess.call(cmd)
|
|
|
|
|
else:
|
|
|
|
|
status = open(os.path.join(completPath, 'status'), "w")
|
|
|
|
|
status.write("Error Message: " + result[1] +
|
|
|
|
|
". Not able to create Account, Databases and DNS Records, aborting. [5009]")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
return 0
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
########### Creating child/sub/addon/parked domains
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2018-02-16 21:05:15 +05:00
|
|
|
status.write("Creating Child Domains!")
|
2017-10-29 22:16:06 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
## Reading meta file to create subdomains
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
externalApp = backupMetaData.find('externalApp').text
|
|
|
|
|
websiteHome = os.path.join("/home",masterDomain,"public_html")
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
### Restoring Child Domains if any.
|
2018-05-09 23:10:57 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
childDomains = backupMetaData.findall('ChildDomains/domain')
|
2018-05-09 23:10:57 +05:00
|
|
|
|
2017-10-29 22:16:06 +05:00
|
|
|
try:
|
2018-02-16 00:57:46 +05:00
|
|
|
for childDomain in childDomains:
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
domain = childDomain.find('domain').text
|
|
|
|
|
phpSelection = childDomain.find('phpSelection').text
|
|
|
|
|
path = childDomain.find('path').text
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
finalData = json.dumps(
|
|
|
|
|
{'masterDomain': masterDomain, 'domainName': domain, 'phpSelection': phpSelection,
|
|
|
|
|
'path': path,
|
2018-05-09 23:10:57 +05:00
|
|
|
'ssl': 0, 'restore': 1,
|
2018-05-24 18:01:06 +05:00
|
|
|
'dkimCheck': 0,
|
|
|
|
|
'openBasedir':0})
|
2018-02-16 00:57:46 +05:00
|
|
|
r = requests.post("http://localhost:5003/websites/submitDomainCreation", data=finalData,
|
|
|
|
|
verify=False)
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
data = json.loads(r.text)
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
if data['createWebSiteStatus'] == 1:
|
|
|
|
|
rmtree(websiteHome)
|
2018-05-11 00:03:26 +05:00
|
|
|
|
|
|
|
|
## Let us try to restore SSL for Child Domains.
|
|
|
|
|
|
|
|
|
|
tempPath = os.path.join(completPath, domain)
|
|
|
|
|
|
|
|
|
|
if os.path.exists(tempPath + "/privkey.pem"):
|
|
|
|
|
|
|
|
|
|
pathToStoreSSL = sslUtilities.Server_root + "/conf/vhosts/" + "SSL-" + domain
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(pathToStoreSSL):
|
|
|
|
|
os.mkdir(pathToStoreSSL)
|
|
|
|
|
|
|
|
|
|
sslUtilities.installSSLForDomain(domain)
|
|
|
|
|
|
|
|
|
|
pathToStoreSSLPrivKey = pathToStoreSSL + "/privkey.pem"
|
|
|
|
|
pathToStoreSSLFullChain = pathToStoreSSL + "/fullchain.pem"
|
|
|
|
|
|
|
|
|
|
copy(tempPath + "/privkey.pem", pathToStoreSSLPrivKey)
|
|
|
|
|
copy(tempPath + "/fullchain.pem", pathToStoreSSLFullChain)
|
|
|
|
|
|
|
|
|
|
command = "chown -R " + "lsadm" + ":" + "lsadm" + " " + pathToStoreSSL
|
|
|
|
|
cmd = shlex.split(command)
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
continue
|
|
|
|
|
else:
|
|
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
|
|
|
|
status.write("Error Message: " + data[
|
|
|
|
|
'error_message'] + ". Not able to create child domains, aborting. [5009]")
|
|
|
|
|
status.close()
|
|
|
|
|
return 0
|
2017-10-29 22:16:06 +05:00
|
|
|
|
|
|
|
|
except BaseException, msg:
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2017-12-09 22:30:10 +05:00
|
|
|
status.write("Error Message: " + str(msg) +". Not able to create child domains, aborting. [5009]")
|
2017-10-29 22:16:06 +05:00
|
|
|
status.close()
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]")
|
|
|
|
|
return 0
|
|
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
## Restore Aliases
|
2018-02-17 15:34:59 +05:00
|
|
|
|
|
|
|
|
status = open(os.path.join(completPath, 'status'), "w")
|
2018-05-11 00:03:26 +05:00
|
|
|
status.write("Restoring Domain Aliases!")
|
2018-02-17 15:34:59 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
aliases = backupMetaData.findall('Aliases/alias')
|
|
|
|
|
|
|
|
|
|
for items in aliases:
|
2018-06-05 00:53:45 +05:00
|
|
|
virtualHostUtilities.createAlias(masterDomain, items.text, 0, "", "")
|
2018-05-09 23:10:57 +05:00
|
|
|
|
2018-05-11 00:03:26 +05:00
|
|
|
## Restoring email accounts
|
|
|
|
|
|
|
|
|
|
status = open(os.path.join(completPath, 'status'), "w")
|
|
|
|
|
status.write("Restoring email accounts!")
|
|
|
|
|
status.close()
|
|
|
|
|
|
2018-02-17 15:34:59 +05:00
|
|
|
emailAccounts = backupMetaData.findall('emails/emailAccount')
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
for emailAccount in emailAccounts:
|
|
|
|
|
|
|
|
|
|
email = emailAccount.find('email').text
|
|
|
|
|
username = email.split("@")[0]
|
|
|
|
|
password = emailAccount.find('password').text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
finalData = json.dumps({'domain': masterDomain, 'username': username, 'password': password})
|
|
|
|
|
|
|
|
|
|
r = requests.post("http://localhost:5003/email/submitEmailCreation", data=finalData,verify=False)
|
|
|
|
|
|
|
|
|
|
data = json.loads(r.text)
|
|
|
|
|
|
|
|
|
|
if data['createEmailStatus'] == 1:
|
|
|
|
|
continue
|
|
|
|
|
else:
|
|
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
|
|
|
|
status.write("Error Message: " + data[
|
|
|
|
|
'error_message'] + ". Not able to create email accounts, aborting. [5009]")
|
|
|
|
|
status.close()
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
|
|
|
|
status.write("Error Message: " + str(msg) +". Not able to create email accounts, aborting. [5009]")
|
|
|
|
|
status.close()
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]")
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
## Emails restored
|
|
|
|
|
|
2017-10-29 22:16:06 +05:00
|
|
|
## restoring databases
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.write("Restoring Databases")
|
|
|
|
|
status.close()
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
databases = backupMetaData.findall('Databases/database')
|
|
|
|
|
|
|
|
|
|
for database in databases:
|
|
|
|
|
dbName = database.find('dbName').text
|
|
|
|
|
password = database.find('password').text
|
2018-02-16 21:05:15 +05:00
|
|
|
if mysqlUtilities.mysqlUtilities.restoreDatabaseBackup(dbName, completPath, password) == 0:
|
|
|
|
|
raise BaseException
|
2017-10-29 22:16:06 +05:00
|
|
|
|
2018-02-17 15:34:59 +05:00
|
|
|
## Databases restored
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath, 'status'), "w")
|
2018-02-17 15:34:59 +05:00
|
|
|
status.write("Extracting web home data!")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.close()
|
|
|
|
|
|
2018-04-04 02:17:12 +05:00
|
|
|
# /home/backup/backup-example-06-50-03-Thu-Feb-2018/public_html.tar.gz
|
2018-02-17 15:34:59 +05:00
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
tar = tarfile.open(pathToCompressedHome)
|
|
|
|
|
tar.extractall(websiteHome)
|
|
|
|
|
tar.close()
|
|
|
|
|
|
2018-02-17 15:34:59 +05:00
|
|
|
## extracting email accounts
|
|
|
|
|
|
|
|
|
|
status = open(os.path.join(completPath, 'status'), "w")
|
|
|
|
|
status.write("Extracting email accounts!")
|
|
|
|
|
status.close()
|
|
|
|
|
|
2018-02-21 20:10:39 +05:00
|
|
|
try:
|
|
|
|
|
pathToCompressedEmails = os.path.join(completPath, masterDomain + ".tar.gz")
|
|
|
|
|
emailHome = os.path.join("/home","vmail",masterDomain)
|
2018-02-17 15:34:59 +05:00
|
|
|
|
2018-02-21 20:10:39 +05:00
|
|
|
tar = tarfile.open(pathToCompressedEmails)
|
|
|
|
|
tar.extractall(emailHome)
|
|
|
|
|
tar.close()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
2018-02-17 15:34:59 +05:00
|
|
|
|
|
|
|
|
## emails extracted
|
|
|
|
|
|
2018-02-19 23:42:57 +05:00
|
|
|
## Change permissions
|
2018-02-17 15:34:59 +05:00
|
|
|
|
|
|
|
|
command = "chmod -r vmail:vmail " + emailHome
|
|
|
|
|
subprocess.call(shlex.split(command))
|
|
|
|
|
|
2018-02-19 23:42:57 +05:00
|
|
|
##
|
|
|
|
|
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2017-10-24 19:16:36 +05:00
|
|
|
status.write("Done")
|
|
|
|
|
status.close()
|
2018-02-19 23:42:57 +05:00
|
|
|
|
2017-11-05 03:02:51 +05:00
|
|
|
installUtilities.reStartLiteSpeed()
|
|
|
|
|
|
2017-12-09 22:30:10 +05:00
|
|
|
command = "chown -R " + externalApp + ":" + externalApp + " " + websiteHome
|
2017-11-05 03:02:51 +05:00
|
|
|
cmd = shlex.split(command)
|
|
|
|
|
subprocess.call(cmd)
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
2018-02-16 00:57:46 +05:00
|
|
|
status = open(os.path.join(completPath,'status'), "w")
|
2017-12-09 22:30:10 +05:00
|
|
|
status.write(str(msg) + " [5009]")
|
|
|
|
|
status.close()
|
2017-10-24 19:16:36 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [startRestore]")
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
2017-10-26 23:50:59 +05:00
|
|
|
def initiateRestore(backupName,dir):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
2017-10-26 23:50:59 +05:00
|
|
|
p = Process(target=backupUtilities.startRestore, args=(backupName, dir,))
|
2017-10-24 19:16:36 +05:00
|
|
|
p.start()
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [initiateRestore]")
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
2017-11-05 21:07:12 +05:00
|
|
|
def sendKey(IPAddress, password,port):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
|
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
command = "sudo scp -o StrictHostKeyChecking=no -P "+ port +" /root/.ssh/cyberpanel.pub root@" + IPAddress + ":/root/.ssh/authorized_keys"
|
|
|
|
|
|
|
|
|
|
sendKeyProc = pexpect.spawn(command,timeout=3)
|
2017-10-24 19:16:36 +05:00
|
|
|
sendKeyProc.expect("password:")
|
|
|
|
|
|
|
|
|
|
sendKeyProc.sendline(password)
|
|
|
|
|
sendKeyProc.expect("100%")
|
|
|
|
|
|
|
|
|
|
sendKeyProc.wait()
|
|
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
return [1, "None"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
except pexpect.TIMEOUT, msg:
|
2017-10-24 19:16:36 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [sendKey]")
|
2017-11-05 21:07:12 +05:00
|
|
|
return [0, "TIMEOUT [sendKey]"]
|
|
|
|
|
except pexpect.EOF, msg:
|
2017-10-24 19:16:36 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [sendKey]")
|
2017-11-05 21:07:12 +05:00
|
|
|
return [0, "EOF [sendKey]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [sendKey]")
|
2017-11-05 21:07:12 +05:00
|
|
|
return [0, str(msg) + " [sendKey]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
2017-11-05 21:07:12 +05:00
|
|
|
def setupSSHKeys(IPAddress, password,port):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
|
|
|
|
## Checking for host verification
|
|
|
|
|
|
|
|
|
|
backupUtilities.host_key_verification(IPAddress)
|
|
|
|
|
|
|
|
|
|
if backupUtilities.checkIfHostIsUp(IPAddress) == 1:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
2017-11-05 21:07:12 +05:00
|
|
|
return [0,"Host is Down."]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-21 16:51:28 +05:00
|
|
|
expectation = []
|
|
|
|
|
expectation.append("password:")
|
|
|
|
|
expectation.append("Permission denied")
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-21 16:51:28 +05:00
|
|
|
command = "sudo ssh -o StrictHostKeyChecking=no -p "+ port +" root@"+IPAddress+" mkdir /root/.ssh"
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
setupKeys = pexpect.spawn(command,timeout=3)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-21 16:51:28 +05:00
|
|
|
index = setupKeys.expect(expectation)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
## on first login attempt send password
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-05-21 16:51:28 +05:00
|
|
|
if index == 0:
|
|
|
|
|
setupKeys.sendline(password)
|
|
|
|
|
elif index == 1:
|
|
|
|
|
return [0, 'Please enable password authentication on your remote server.']
|
|
|
|
|
else:
|
|
|
|
|
raise BaseException
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
## if it again give you password, than provided password is wrong
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
expectation = []
|
|
|
|
|
expectation.append("please try again.")
|
|
|
|
|
expectation.append(pexpect.EOF)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
index = setupKeys.expect(expectation)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
if index == 0:
|
2018-02-19 23:42:57 +05:00
|
|
|
return [0,"Wrong Password!"]
|
2017-10-24 19:16:36 +05:00
|
|
|
elif index == 1:
|
2017-11-05 21:07:12 +05:00
|
|
|
setupKeys.wait()
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
sendKey = backupUtilities.sendKey(IPAddress,password,port)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
if sendKey[0] == 1:
|
|
|
|
|
return [1, "None"]
|
|
|
|
|
else:
|
|
|
|
|
return [0,sendKey[1]]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
except pexpect.TIMEOUT, msg:
|
2017-11-05 21:07:12 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(setupKeys.before + " " + str(msg) + " [setupSSHKeys]")
|
|
|
|
|
return [0, str(msg) + " [TIMEOUT setupSSHKeys]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
2018-05-21 16:51:28 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(setupKeys.before + " " + str(msg) + " [setupSSHKeys]")
|
2017-11-05 21:07:12 +05:00
|
|
|
return [0, str(msg) + " [setupSSHKeys]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def checkIfHostIsUp(IPAddress):
|
|
|
|
|
try:
|
|
|
|
|
if subprocess.check_output(['ping', IPAddress, '-c 1']).find("0% packet loss") > -1:
|
|
|
|
|
return 1
|
|
|
|
|
else:
|
|
|
|
|
return 0
|
|
|
|
|
except BaseException, msg:
|
2017-10-29 22:16:06 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[checkIfHostIsUp]")
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def checkConnection(IPAddress):
|
|
|
|
|
try:
|
2017-11-05 21:07:12 +05:00
|
|
|
|
2017-12-09 22:30:10 +05:00
|
|
|
try:
|
|
|
|
|
destinations = backupUtilities.destinationsPath
|
|
|
|
|
data = open(destinations, 'r').readlines()
|
|
|
|
|
port = data[1].strip("\n")
|
|
|
|
|
except:
|
|
|
|
|
port = "22"
|
2017-11-05 21:07:12 +05:00
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
expectation = []
|
|
|
|
|
expectation.append("password:")
|
|
|
|
|
expectation.append("Last login")
|
|
|
|
|
expectation.append(pexpect.EOF)
|
2018-05-29 20:20:05 +05:00
|
|
|
expectation.append(pexpect.TIMEOUT)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-11-05 21:07:12 +05:00
|
|
|
checkConn = pexpect.spawn("sudo ssh -i /root/.ssh/cyberpanel -o StrictHostKeyChecking=no -p "+ port+" root@"+IPAddress, timeout=3)
|
2017-10-24 19:16:36 +05:00
|
|
|
index = checkConn.expect(expectation)
|
|
|
|
|
|
|
|
|
|
if index == 0:
|
|
|
|
|
subprocess.call(['kill', str(checkConn.pid)])
|
2017-11-02 02:09:47 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile("Remote Server is not able to authenticate for transfer to initiate, IP Address:" + IPAddress)
|
2017-10-29 22:16:06 +05:00
|
|
|
return [0,"Remote Server is not able to authenticate for transfer to initiate."]
|
2017-10-24 19:16:36 +05:00
|
|
|
elif index == 1:
|
|
|
|
|
subprocess.call(['kill', str(checkConn.pid)])
|
2017-10-29 22:16:06 +05:00
|
|
|
return [1, "None"]
|
2018-05-29 20:20:05 +05:00
|
|
|
elif index == 3:
|
|
|
|
|
subprocess.call(['kill', str(checkConn.pid)])
|
|
|
|
|
return [1, "None"]
|
2017-10-24 19:16:36 +05:00
|
|
|
else:
|
|
|
|
|
subprocess.call(['kill', str(checkConn.pid)])
|
2018-05-29 20:20:05 +05:00
|
|
|
return [1, "None"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
except pexpect.TIMEOUT, msg:
|
2017-10-29 22:16:06 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile("Timeout "+IPAddress+ " [checkConnection]")
|
|
|
|
|
return [0, "371 Timeout while making connection to this server [checkConnection]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except pexpect.EOF, msg:
|
2017-10-29 22:16:06 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile("EOF "+IPAddress+ "[checkConnection]")
|
|
|
|
|
return [0, "374 Remote Server is not able to authenticate for transfer to initiate. [checkConnection]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
2017-10-29 22:16:06 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg)+" " +IPAddress+ " [checkConnection]")
|
|
|
|
|
return [0, "377 Remote Server is not able to authenticate for transfer to initiate. [checkConnection]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def verifyHostKey(IPAddress):
|
|
|
|
|
try:
|
2017-10-29 22:16:06 +05:00
|
|
|
backupUtilities.host_key_verification(IPAddress)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2017-10-29 22:16:06 +05:00
|
|
|
password = "hello" ## dumb password, not used anywhere.
|
|
|
|
|
|
|
|
|
|
expectation = []
|
|
|
|
|
|
|
|
|
|
expectation.append("continue connecting (yes/no)?")
|
|
|
|
|
expectation.append("password:")
|
|
|
|
|
|
2017-11-05 03:02:51 +05:00
|
|
|
setupSSHKeys = pexpect.spawn("ssh cyberpanel@" + IPAddress, timeout=3)
|
2017-10-29 22:16:06 +05:00
|
|
|
|
|
|
|
|
index = setupSSHKeys.expect(expectation)
|
|
|
|
|
|
|
|
|
|
if index == 0:
|
|
|
|
|
setupSSHKeys.sendline("yes")
|
|
|
|
|
|
|
|
|
|
setupSSHKeys.expect("password:")
|
|
|
|
|
setupSSHKeys.sendline(password)
|
|
|
|
|
|
|
|
|
|
expectation = []
|
|
|
|
|
|
|
|
|
|
expectation.append("password:")
|
|
|
|
|
expectation.append(pexpect.EOF)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
innerIndex = setupSSHKeys.expect(expectation)
|
|
|
|
|
|
|
|
|
|
if innerIndex == 0:
|
|
|
|
|
setupSSHKeys.kill(signal.SIGTERM)
|
|
|
|
|
return [1, "None"]
|
|
|
|
|
elif innerIndex == 1:
|
|
|
|
|
setupSSHKeys.kill(signal.SIGTERM)
|
|
|
|
|
return [1, "None"]
|
|
|
|
|
|
|
|
|
|
elif index == 1:
|
|
|
|
|
|
|
|
|
|
setupSSHKeys.expect("password:")
|
|
|
|
|
setupSSHKeys.sendline(password)
|
|
|
|
|
|
|
|
|
|
expectation = []
|
|
|
|
|
|
|
|
|
|
expectation.append("password:")
|
|
|
|
|
expectation.append(pexpect.EOF)
|
|
|
|
|
|
|
|
|
|
innerIndex = setupSSHKeys.expect(expectation)
|
|
|
|
|
|
|
|
|
|
if innerIndex == 0:
|
|
|
|
|
setupSSHKeys.kill(signal.SIGTERM)
|
|
|
|
|
return [1, "None"]
|
|
|
|
|
elif innerIndex == 1:
|
|
|
|
|
setupSSHKeys.kill(signal.SIGTERM)
|
|
|
|
|
return [1, "None"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
except pexpect.TIMEOUT, msg:
|
2017-10-26 23:50:59 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile("Timeout [verifyHostKey]")
|
2017-10-29 22:16:06 +05:00
|
|
|
return [0,"Timeout [verifyHostKey]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except pexpect.EOF, msg:
|
2017-10-26 23:50:59 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile("EOF [verifyHostKey]")
|
2017-10-29 22:16:06 +05:00
|
|
|
return [0,"EOF [verifyHostKey]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [verifyHostKey]")
|
2017-10-29 22:16:06 +05:00
|
|
|
return [0,str(msg)+" [verifyHostKey]"]
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
2017-11-05 21:07:12 +05:00
|
|
|
def createBackupDir(IPAddress,port):
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
try:
|
2018-02-19 23:42:57 +05:00
|
|
|
command = "sudo ssh -o StrictHostKeyChecking=no -p "+ port +" -i /root/.ssh/cyberpanel root@"+IPAddress+" mkdir /home/backup"
|
2017-10-24 19:16:36 +05:00
|
|
|
subprocess.call(shlex.split(command))
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [createBackupDir]")
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def host_key_verification(IPAddress):
|
|
|
|
|
try:
|
2018-05-21 16:51:28 +05:00
|
|
|
command = 'sudo ssh-keygen -R ' + IPAddress
|
2017-10-24 19:16:36 +05:00
|
|
|
subprocess.call(shlex.split(command))
|
2018-05-21 16:51:28 +05:00
|
|
|
return 1
|
2017-10-24 19:16:36 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [host_key_verification]")
|
|
|
|
|
return 0
|
|
|
|
|
|
2018-05-09 23:10:57 +05:00
|
|
|
@staticmethod
|
|
|
|
|
def getAliases(masterDomain):
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
|
|
confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf")
|
|
|
|
|
command = "sudo cat " + confPath
|
|
|
|
|
data = subprocess.check_output(shlex.split(command)).splitlines()
|
|
|
|
|
aliases = []
|
|
|
|
|
|
|
|
|
|
for items in data:
|
|
|
|
|
if items.find(masterDomain) > -1 and items.find('map') > -1:
|
|
|
|
|
data = filter(None, items.split(" "))
|
|
|
|
|
if data[1] == masterDomain:
|
|
|
|
|
length = len(data)
|
|
|
|
|
for i in range(3, length):
|
|
|
|
|
currentAlias = data[i].rstrip(',').strip('\n')
|
|
|
|
|
aliases.append(currentAlias)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return aliases
|
|
|
|
|
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [getAliases]")
|
|
|
|
|
print 0
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
def submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain):
|
2017-12-09 22:30:10 +05:00
|
|
|
try:
|
2018-02-16 21:05:15 +05:00
|
|
|
## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 -- tempStoragePath
|
|
|
|
|
## backup-example-06-50-03-Thu-Feb-2018 -- backup name
|
|
|
|
|
## /home/example.com/backup - backupPath
|
|
|
|
|
## /home/cyberpanel/1047.xml - metaPath
|
2017-12-09 22:30:10 +05:00
|
|
|
|
|
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
backupUtilities.prepareBackupMeta(backupDomain, backupName, tempStoragePath, backupPath)
|
2017-12-09 22:30:10 +05:00
|
|
|
|
|
|
|
|
p = Process(target=backupUtilities.startBackup, args=(tempStoragePath, backupName, backupPath,))
|
|
|
|
|
p.start()
|
2018-06-05 00:53:45 +05:00
|
|
|
pid = open(os.path.join(backupPath, 'pid'), "w")
|
2017-12-09 22:30:10 +05:00
|
|
|
pid.write(str(p.pid))
|
|
|
|
|
pid.close()
|
|
|
|
|
|
|
|
|
|
print "1,None"
|
|
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
except BaseException, msg:
|
2017-12-09 22:30:10 +05:00
|
|
|
logging.CyberCPLogFileWriter.writeToFile(
|
|
|
|
|
str(msg) + " [submitBackupCreation]")
|
2018-06-05 00:53:45 +05:00
|
|
|
print "0," + str(msg)
|
2017-12-09 22:30:10 +05:00
|
|
|
|
|
|
|
|
def cancelBackupCreation(backupCancellationDomain,fileName):
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
|
|
path = "/home/" + backupCancellationDomain + "/backup/pid"
|
|
|
|
|
|
|
|
|
|
pid = open(path, "r").readlines()[0]
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
os.kill(int(pid), signal.SIGKILL)
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]")
|
|
|
|
|
|
|
|
|
|
backupPath = "/home/" + backupCancellationDomain + "/backup/"
|
|
|
|
|
|
|
|
|
|
tempStoragePath = backupPath + fileName
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
os.remove(tempStoragePath + ".tar.gz")
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
rmtree(tempStoragePath)
|
|
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]")
|
|
|
|
|
|
|
|
|
|
status = open(backupPath + 'status', "w")
|
|
|
|
|
status.write("Aborted manually. [5009]")
|
|
|
|
|
status.close()
|
|
|
|
|
except BaseException,msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(
|
|
|
|
|
str(msg) + " [cancelBackupCreation]")
|
|
|
|
|
print "0,"+str(msg)
|
|
|
|
|
|
|
|
|
|
def submitRestore(backupFile,dir):
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
|
|
p = Process(target=backupUtilities.startRestore, args=(backupFile, dir,))
|
|
|
|
|
p.start()
|
|
|
|
|
|
|
|
|
|
print "1,None"
|
|
|
|
|
|
|
|
|
|
except BaseException,msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(
|
|
|
|
|
str(msg) + " [cancelBackupCreation]")
|
|
|
|
|
print "0,"+str(msg)
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(description='CyberPanel Installer')
|
|
|
|
|
parser.add_argument('function', help='Specific a function to call!')
|
|
|
|
|
parser.add_argument('--tempStoragePath', help='')
|
|
|
|
|
parser.add_argument('--backupName', help='!')
|
|
|
|
|
parser.add_argument('--backupPath', help='')
|
2018-06-05 00:53:45 +05:00
|
|
|
parser.add_argument('--backupDomain', help='')
|
2017-12-09 22:30:10 +05:00
|
|
|
parser.add_argument('--metaPath', help='')
|
|
|
|
|
|
|
|
|
|
## backup cancellation arguments
|
|
|
|
|
|
|
|
|
|
parser.add_argument('--backupCancellationDomain', help='')
|
|
|
|
|
parser.add_argument('--fileName', help='')
|
|
|
|
|
|
|
|
|
|
## backup restore arguments
|
|
|
|
|
|
|
|
|
|
parser.add_argument('--backupFile', help='')
|
|
|
|
|
parser.add_argument('--dir', help='')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
if args.function == "submitBackupCreation":
|
2018-06-05 00:53:45 +05:00
|
|
|
submitBackupCreation(args.tempStoragePath,args.backupName,args.backupPath, args.backupDomain)
|
2017-12-09 22:30:10 +05:00
|
|
|
elif args.function == "cancelBackupCreation":
|
|
|
|
|
cancelBackupCreation(args.backupCancellationDomain,args.fileName)
|
|
|
|
|
elif args.function == "submitRestore":
|
|
|
|
|
submitRestore(args.backupFile,args.dir)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2018-02-19 23:42:57 +05:00
|
|
|
main()
|