File: //usr/local/CyberCP/plogical/restoreMeta.py
#!/usr/local/CyberCP/bin/python
import os.path
import sys
sys.path.append('/usr/local/CyberCP')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
import django
django.setup()
from websiteFunctions.models import Websites
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from xml.etree import ElementTree
import plogical.mysqlUtilities as mysqlUtilities
from databases.models import Databases
import argparse
try:
    from plogical.virtualHostUtilities import virtualHostUtilities
    from plogical.mailUtilities import mailUtilities
    from plogical.processUtilities import ProcessUtilities
except:
    pass
class restoreMeta():
    @staticmethod
    def startRestore(metaPath, statusPath):
        try:
            ## extracting master domain for later use
            backupMetaData = ElementTree.parse(metaPath)
            masterDomain = backupMetaData.find('masterDomain').text
            ########### Creating child/sub/addon/parked domains
            logging.statusWriter(statusPath, "Creating Child Domains!", 1)
            ### Restoring Child Domains if any.
            childDomains = backupMetaData.findall('ChildDomains/domain')
            try:
                for childDomain in childDomains:
                    domain = childDomain.find('domain').text
                    phpSelection = childDomain.find('phpSelection').text
                    path = childDomain.find('path').text
                    virtualHostUtilities.createDomain(masterDomain, domain, phpSelection, path, 0, 0, 0,
                                                                  'admin', 0)
            except BaseException as msg:
                logging.writeToFile(str(msg) + " [startRestore]")
                return 0
            ## Restore Aliases
            logging.statusWriter(statusPath, "Restoring Domain Aliases!", 1)
            aliases = backupMetaData.findall('Aliases/alias')
            for items in aliases:
                virtualHostUtilities.createAlias(masterDomain, items.text, 0, "", "", "admin")
            ## Restoring email accounts
            logging.statusWriter(statusPath, "Restoring email accounts!", 1)
            emailAccounts = backupMetaData.findall('emails/emailAccount')
            try:
                for emailAccount in emailAccounts:
                    email = emailAccount.find('email').text
                    username = email.split("@")[0]
                    password = emailAccount.find('password').text
                    result = mailUtilities.createEmailAccount(masterDomain, username, password)
                    if result[0] == 0:
                        logging.statusWriter(statusPath, 'Email existed, updating password according to last snapshot. %s' % (email))
                        if mailUtilities.changeEmailPassword(email, password, 1)[0] == 0:
                            logging.statusWriter(statusPath,
                                                 'Failed changing password for: %s' % (
                                                     email))
                        else:
                            logging.statusWriter(statusPath,
                                                 'Password changed for: %s' % (
                                                     email))
                    else:
                        logging.statusWriter(statusPath,
                                             'Email created: %s' % (
                                                 email))
            except BaseException as msg:
                logging.writeToFile(str(msg) + " [startRestore]")
                return 0
            ## Emails restored
            ## restoring databases
            logging.statusWriter(statusPath, "Restoring Databases!", 1)
            ## Create databases
            databases = backupMetaData.findall('Databases/database')
            website = Websites.objects.get(domain=masterDomain)
            for database in databases:
                dbName = database.find('dbName').text
                logging.writeToFile('Backup version 2.1.1 detected..')
                first = 1
                databaseUsers = database.findall('databaseUsers')
                for databaseUser in databaseUsers:
                    dbUser = databaseUser.find('dbUser').text
                    dbHost = databaseUser.find('dbHost').text
                    password = databaseUser.find('password').text
                    if os.path.exists(ProcessUtilities.debugPath):
                        logging.writeToFile('Database user: %s' % (dbUser))
                        logging.writeToFile('Database host: %s' % (dbHost))
                        logging.writeToFile('Database password: %s' % (password))
                    if first:
                        first = 0
                        try:
                            dbExist = Databases.objects.get(dbName=dbName)
                            logging.statusWriter(statusPath, 'Database exists, changing Database password.. %s' % (dbName))
                            if mysqlUtilities.mysqlUtilities.changePassword(dbUser, password, 1, dbHost) == 0:
                                logging.statusWriter(statusPath, 'Failed changing password for database: %s' % (dbName))
                            else:
                                logging.statusWriter(statusPath, 'Password successfully changed for database: %s.' % (dbName))
                        except:
                            logging.statusWriter(statusPath, 'Database did not exist, creating new.. %s' % (dbName))
                            if mysqlUtilities.mysqlUtilities.createDatabase(dbName, dbUser, "cyberpanel") == 0:
                                logging.statusWriter(statusPath, 'Failed the creation of database: %s' % (dbName))
                            else:
                                logging.statusWriter(statusPath, 'Database: %s successfully created.' % (dbName))
                            mysqlUtilities.mysqlUtilities.changePassword(dbUser, password, 1)
                            if mysqlUtilities.mysqlUtilities.changePassword(dbUser, password, 1) == 0:
                                logging.statusWriter(statusPath, 'Failed changing password for database: %s' % (dbName))
                            else:
                                logging.statusWriter(statusPath, 'Password successfully changed for database: %s.' % (dbName))
                            try:
                                newDB = Databases(website=website, dbName=dbName, dbUser=dbUser)
                                newDB.save()
                            except:
                                pass
                    ## This function will not create database, only database user is created as third value is 0 for createDB
                    mysqlUtilities.mysqlUtilities.createDatabase(dbName, dbUser, password, 0, dbHost)
                    mysqlUtilities.mysqlUtilities.changePassword(dbUser, password, 1, dbHost)
            ## Databases restored
            try:
                os.remove(metaPath)
            except:
                pass
        except BaseException as msg:
            logging.writeToFile(str(msg) + " [startRestore]")
def main():
    parser = argparse.ArgumentParser(description='CyberPanel Installer')
    parser.add_argument('function', help='Specific a function to call!')
    parser.add_argument('--metaPath', help='')
    parser.add_argument('--statusFile', help='!')
    ## backup restore arguments
    parser.add_argument('--backupFile', help='')
    parser.add_argument('--dir', help='')
    args = parser.parse_args()
    if args.function == "submitRestore":
        restoreMeta.startRestore(args.metaPath,args.statusFile)
if __name__ == "__main__":
    main()