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
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
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
import time
2018-07-05 15:22:48 +05:00
from plogical . mailUtilities import mailUtilities
2018-08-28 01:19:34 +05:00
from shutil import copy
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 "
2018-08-28 01:19:34 +05:00
licenseKey = ' /usr/local/lsws/conf/license.key '
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-10-24 19:16:36 +05:00
@staticmethod
2018-08-23 15:39:28 +05:00
def startBackup ( tempStoragePath , backupName , backupPath ) :
2017-10-24 19:16:36 +05:00
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
2018-08-23 15:39:28 +05:00
2018-02-16 00:57:46 +05:00
backupFileNamePath = os . path . join ( backupPath , " backupFileName " )
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( backupFileNamePath , backupName )
2017-12-09 22:30:10 +05:00
2018-05-11 00:03:26 +05:00
#####
2017-10-24 19:16:36 +05:00
2018-08-23 15:39:28 +05:00
status = os . path . join ( backupPath , ' status ' )
2018-02-16 00:57:46 +05:00
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Making archive of home directory. \n " )
2017-10-24 19:16:36 +05:00
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-08-28 01:19:34 +05:00
## Saving original vhost conf file
completPathToConf = virtualHostUtilities . Server_root + ' /conf/vhosts/ ' + domainName + ' /vhost.conf '
if os . path . exists ( backupUtilities . licenseKey ) :
copy ( completPathToConf , tempStoragePath + ' /vhost.conf ' )
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-08-23 15:39:28 +05:00
##### Saving SSL Certificates if any
sslStoragePath = ' /etc/letsencrypt/live/ ' + domainName
if os . path . exists ( sslStoragePath ) :
make_archive ( os . path . join ( tempStoragePath , " sslData- " + domainName ) , ' gztar ' , sslStoragePath )
2018-02-17 15:34:59 +05:00
## backup email accounts
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Backing up email accounts! \n " )
2018-02-17 15:34:59 +05:00
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
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Backing up database: " + dbName )
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
## Child Domains SSL.
childDomains = backupMetaData . findall ( ' ChildDomains/domain ' )
try :
for childDomain in childDomains :
actualChildDomain = childDomain . find ( ' domain ' ) . text
2018-08-28 01:19:34 +05:00
if os . path . exists ( backupUtilities . licenseKey ) :
completPathToConf = virtualHostUtilities . Server_root + ' /conf/vhosts/ ' + actualChildDomain + ' /vhost.conf '
copy ( completPathToConf , tempStoragePath + ' / ' + actualChildDomain + ' .vhost.conf ' )
2018-08-22 00:37:43 +05:00
sslStoragePath = ' /etc/letsencrypt/live/ ' + actualChildDomain
2018-05-11 00:03:26 +05:00
2018-08-22 00:37:43 +05:00
if os . path . exists ( sslStoragePath ) :
2018-08-23 15:39:28 +05:00
make_archive ( os . path . join ( tempStoragePath , " sslData- " + actualChildDomain ) , ' gztar ' , sslStoragePath )
2018-05-11 00:03:26 +05:00
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-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Completed \n " )
2017-10-24 19:16:36 +05:00
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 " )
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Aborted, please check CyberPanel main log file. [5009] " )
2017-10-24 19:16:36 +05:00
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
## Create Configurations
2018-08-22 00:37:43 +05:00
result = virtualHostUtilities . createVirtualHost ( domain , admin . email , phpSelection , externalApp , 0 , 1 , 0 ,
2018-06-05 00:53:45 +05:00
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 )
2018-08-23 15:39:28 +05:00
## Writing pid of restore process
2017-10-24 19:16:36 +05:00
2018-08-23 15:39:28 +05:00
pid = os . path . join ( completPath , ' pid ' )
2017-10-24 19:16:36 +05:00
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( pid , str ( os . getpid ( ) ) )
2018-02-16 21:05:15 +05:00
2018-08-23 15:39:28 +05:00
status = os . path . join ( completPath , ' status ' )
logging . CyberCPLogFileWriter . statusWriter ( status , " Extracting Main Archive! " )
2017-10-24 19:16:36 +05:00
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-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Creating Accounts,Databases and DNS records! " )
2017-10-24 19:16:36 +05:00
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-08-22 00:37:43 +05:00
sslStoragePath = completPath + " /sslData- " + masterDomain + ' .tar.gz '
2018-05-11 00:03:26 +05:00
2018-08-22 00:37:43 +05:00
if os . path . exists ( sslStoragePath ) :
sslHome = ' /etc/letsencrypt/live/ ' + masterDomain
tar = tarfile . open ( sslStoragePath )
tar . extractall ( sslHome )
tar . close ( )
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
else :
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Error Message: " + result [ 1 ] + " . Not able to create Account, Databases and DNS Records, aborting. [5009] " )
2017-10-24 19:16:36 +05:00
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-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Creating Child Domains! " )
2017-10-29 22:16:06 +05:00
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-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-08-22 00:37:43 +05:00
retValues = virtualHostUtilities . createDomain ( masterDomain , domain , phpSelection , path , 0 , 0 , 0 , ' admin ' )
2017-10-29 22:16:06 +05:00
2018-08-22 00:37:43 +05:00
if retValues [ 0 ] == 1 :
2018-08-23 15:39:28 +05:00
if os . path . exists ( websiteHome ) :
rmtree ( websiteHome )
2018-05-11 00:03:26 +05:00
## Let us try to restore SSL for Child Domains.
2018-08-22 00:37:43 +05:00
try :
2018-08-28 01:19:34 +05:00
if os . path . exists ( backupUtilities . licenseKey ) :
if os . path . exists ( completPath + ' / ' + domain + ' .vhost.conf ' ) :
completPathToConf = virtualHostUtilities . Server_root + ' /conf/vhosts/ ' + domain + ' /vhost.conf '
copy ( completPath + ' / ' + domain + ' .vhost.conf ' , completPathToConf )
2018-08-22 00:37:43 +05:00
sslStoragePath = completPath + " /sslData- " + domain + ' .tar.gz '
2018-05-11 00:03:26 +05:00
2018-08-22 00:37:43 +05:00
if os . path . exists ( sslStoragePath ) :
sslHome = ' /etc/letsencrypt/live/ ' + domain
tar = tarfile . open ( sslStoragePath )
tar . extractall ( sslHome )
tar . close ( )
sslUtilities . installSSLForDomain ( domain )
except :
logging . CyberCPLogFileWriter . writeToFile ( ' While restoring backup we had minor issues for rebuilding vhost conf for: ' + domain + ' . However this will be auto healed. ' )
2018-05-11 00:03:26 +05:00
2018-02-16 00:57:46 +05:00
continue
else :
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Error Message: " + retValues [ 1 ] + " . Not able to create child domains, aborting. [5009] " )
2018-02-16 00:57:46 +05:00
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
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Restoring Domain Aliases! " )
2018-02-17 15:34:59 +05:00
2018-05-09 23:10:57 +05:00
aliases = backupMetaData . findall ( ' Aliases/alias ' )
for items in aliases :
2018-08-23 15:39:28 +05:00
virtualHostUtilities . createAlias ( masterDomain , items . text , 0 , " " , " " , " admin " )
2018-05-09 23:10:57 +05:00
2018-05-11 00:03:26 +05:00
## Restoring email accounts
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Restoring email accounts! " )
2018-05-11 00:03:26 +05:00
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
2018-07-05 15:22:48 +05:00
result = mailUtilities . createEmailAccount ( masterDomain , username , password )
if result [ 0 ] == 0 :
raise BaseException ( result [ 1 ] )
2018-02-17 15:34:59 +05:00
except BaseException , msg :
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Error Message: " + str ( msg ) + " . Not able to create email accounts, aborting. [5009] " )
2018-02-17 15:34:59 +05:00
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-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Restoring Databases! " )
2017-10-24 19:16:36 +05:00
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
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Extracting web home data! " )
2017-10-24 19:16:36 +05:00
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
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Extracting email accounts! " )
2018-02-17 15:34:59 +05:00
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 ( )
2018-08-28 01:19:34 +05:00
## Change permissions
command = " chmod -r vmail:vmail " + emailHome
subprocess . call ( shlex . split ( command ) )
2018-02-21 20:10:39 +05:00
except :
pass
2018-02-17 15:34:59 +05:00
## emails extracted
2018-08-28 01:19:34 +05:00
if os . path . exists ( backupUtilities . licenseKey ) :
completPathToConf = virtualHostUtilities . Server_root + ' /conf/vhosts/ ' + masterDomain + ' /vhost.conf '
if os . path . exists ( completPath + ' /vhost.conf ' ) :
copy ( completPath + ' /vhost.conf ' , completPathToConf )
2018-02-19 23:42:57 +05:00
2018-08-23 15:39:28 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , " Done " )
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-08-28 01:19:34 +05:00
logging . CyberCPLogFileWriter . statusWriter ( status , str ( msg ) + " [5009] " )
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-08-23 15:39:28 +05:00
status = os . path . join ( backupPath , ' status ' )
result = backupUtilities . prepareBackupMeta ( backupDomain , backupName , tempStoragePath , backupPath )
if result [ 0 ] == 0 :
logging . CyberCPLogFileWriter . writeToFile ( result [ 1 ] + ' [5009] ' )
logging . CyberCPLogFileWriter . statusWriter ( status , result [ 1 ] + ' [5009] ' )
return
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 ( )
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] " )
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 ( )