diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/favicon.png b/baseTemplate/static/baseTemplate/assets/finalBase/favicon.png index f72790ed5..8834c6716 100644 Binary files a/baseTemplate/static/baseTemplate/assets/finalBase/favicon.png and b/baseTemplate/static/baseTemplate/assets/finalBase/favicon.png differ diff --git a/managePHP/phpManager.py b/managePHP/phpManager.py index 222f5f96d..e54d345b8 100755 --- a/managePHP/phpManager.py +++ b/managePHP/phpManager.py @@ -5,36 +5,36 @@ from random import randint from .models import * from xml.etree import ElementTree -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging - class PHPManager: @staticmethod def findPHPVersions(): - import re - import os - php_versions = [] - lsws_directory = "/usr/local/lsws" - - if os.path.exists(lsws_directory): - for dir_name in os.listdir(lsws_directory): - full_path = os.path.join(lsws_directory, dir_name) - if os.path.isdir(full_path) and dir_name.startswith("lsphp"): - php_version = dir_name.replace("lsphp", "PHP ").replace("", ".") - php_versions.append(php_version) - - result_list = [] - for item in sorted(php_versions): - # Use regular expression to find numbers in the string - numbers = re.findall(r'\d+', item) - - # Join the numbers with dots and add 'PHP' back to the string - result = 'PHP ' + '.'.join(numbers) - - result_list.append(result) - - return sorted(result_list) + # distro = ProcessUtilities.decideDistro() + # if distro == ProcessUtilities.centos: + # return ['PHP 5.3', 'PHP 5.4', 'PHP 5.5', 'PHP 5.6', 'PHP 7.0', 'PHP 7.1', 'PHP 7.2', 'PHP 7.3', 'PHP 7.4', 'PHP 8.0', 'PHP 8.1'] + # elif distro == ProcessUtilities.cent8: + # return ['PHP 7.1','PHP 7.2', 'PHP 7.3', 'PHP 7.4', 'PHP 8.0', 'PHP 8.1'] + # elif distro == ProcessUtilities.ubuntu20: + # return ['PHP 7.2', 'PHP 7.3', 'PHP 7.4', 'PHP 8.0', 'PHP 8.1'] + # else: + # return ['PHP 7.0', 'PHP 7.1', 'PHP 7.2', 'PHP 7.3', 'PHP 7.4', 'PHP 8.0', 'PHP 8.1'] + + try: + + # Run the shell command and capture the output + result = ProcessUtilities.outputExecutioner('ls -la /usr/local/lsws') + + # Get the lines containing 'lsphp' in the output + lsphp_lines = [line for line in result.split('\n') if 'lsphp' in line] + + # Extract the version from the lines and format it as 'PHP x.y' + php_versions = ['PHP ' + line.split()[8][5] + '.' + line.split()[8][6:] for line in lsphp_lines] + + # Now php_versions contains the formatted PHP versions + return php_versions + except BaseException as msg: + return ['PHP 7.0', 'PHP 7.1', 'PHP 7.2', 'PHP 7.3', 'PHP 7.4', 'PHP 8.0', 'PHP 8.1'] @staticmethod def getPHPString(phpVersion): diff --git a/plogical/DockerSites.py b/plogical/DockerSites.py new file mode 100644 index 000000000..23fa97040 --- /dev/null +++ b/plogical/DockerSites.py @@ -0,0 +1,155 @@ +from plogical.processUtilities import ProcessUtilities +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging + + +class DockerSites: + + def __init__(self, data): + self.data = data + self.JobID = self.data['JobID'] ##JOBID will be file path where status is being written + pass + + def InstallDocker(self): + + command = 'apt install docker-compose -y' + ReturnCode = ProcessUtilities.executioner(command) + + if ReturnCode: + return 1, None + else: + return 0, ReturnCode + + # Takes + # ComposePath, MySQLPath, MySQLRootPass, MySQLDBName, MySQLDBNUser, MySQLPassword, CPUsMySQL, MemoryMySQL, + # port, SitePath, CPUsSite, MemorySite, ComposePath, SiteName + # finalURL, blogTitle, adminUser, adminPassword, adminEmail + + def DeployWPContainer(self): + try: + logging.statusWriter(self.JobID, 'Checking if Docker is installed..,0') + + + command = 'docker --help' + ReturnCode = ProcessUtilities.executioner(command) + if ReturnCode == 0: + status, message = self.InstallDocker() + if status == 0: + logging.statusWriter(self.JobID, 'Failed to installed docker. [404]') + return 0, message + + logging.statusWriter(self.JobID, 'Docker is ready to use..,10') + + WPSite = f""" +version: "3.8" + +services: + db: + image: mysql:5.7 + restart: always + volumes: + - "{self.data['MySQLPath']}:/var/lib/mysql" + environment: + MYSQL_ROOT_PASSWORD: {self.data['MySQLRootPass']} + MYSQL_DATABASE: {self.data['MySQLDBName']} + MYSQL_USER: {self.data['MySQLDBNUser']} + MYSQL_PASSWORD: {self.data['MySQLPassword']} + deploy: + resources: + limits: + cpus: '{self.data['CPUsMySQL']}' # Use 50% of one CPU core + memory: {self.data['MemoryMySQL']}M # Limit memory to 512 megabytes + wordpress: + depends_on: + - db + image: wordpress:latest + restart: always + ports: + - "{self.data['port']}:80" + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: {self.data['MySQLDBNUser']} + WORDPRESS_DB_PASSWORD: {self.data['MySQLPassword']} + WORDPRESS_DB_NAME: {self.data['MySQLDBName']} + volumes: + - "{self.data['SitePath']}:/var/www/html" + deploy: + resources: + limits: + cpus: '{self.data['CPUsSite']}' # Use 50% of one CPU core + memory: {self.data['MemorySite']}M # Limit memory to 512 megabytes + +volumes: + mysql: {{}} +""" + + ### WriteConfig to compose-file + + WriteToFile = open(self.data['ComposePath'], 'w') + WriteToFile.write(WPSite) + WriteToFile.close() + + #### + + command = f"docker-compose -f {self.data['ComposePath']} -p '{self.data['SiteName']}' up -d" + ReturnCode = ProcessUtilities.executioner(command) + + command = f"docker-compose -f {self.data['ComposePath']} ps -q wordpress" + stdout = ProcessUtilities.outputExecutioner(command) + + self.ContainerID = stdout.rstrip('\n') + + + + command = f'docker-compose -f {self.data["ComposePath"]} exec {self.ContainerID} curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar' + ReturnCode = ProcessUtilities.executioner(command) + + command = f"docker-compose -f {self.data['ComposePath']} exec {self.ContainerID} chmod + wp-cli.phar" + ReturnCode = ProcessUtilities.executioner(command) + + command = f"docker-compose -f {self.data['ComposePath']} exec {self.ContainerID} mv wp-cli.phar /bin/wp" + ReturnCode = ProcessUtilities.executioner(command) + + command = f'docker-compose -f {self.data["ComposePath"]} exec {self.ContainerID} wp core install --url="http://{self.data["finalURL"]}" --title="{self.data["blogTitle"]}" --admin_user="{self.data["adminUser"]}" --admin_password="{self.data["adminPassword"]}" --admin_email="{self.data["adminEmail"]}" --path=. --allow-root' + ReturnCode = ProcessUtilities.executioner(command) + + except BaseException as msg: + print(str(msg)) + pass + + +def Main(): + try: + # Takes + # ComposePath, MySQLPath, MySQLRootPass, MySQLDBName, MySQLDBNUser, MySQLPassword, CPUsMySQL, MemoryMySQL, + # port, SitePath, CPUsSite, MemorySite, SiteName + # finalURL, blogTitle, adminUser, adminPassword, adminEmail + data = { + "JobID": 1122344566667778888, + "ComposePath": "/home/dockercloudpagescloud/docker-compose.yml", + "MySQLPath": '/home/dockercloudpagescloud/public_html/sqldocker', + "MySQLRootPass": 'testdbwp12345', + "MySQLDBName": 'testdbwp', + "MySQLDBNUser": 'testdbwp', + "MySQLPassword": 'testdbwp12345', + "CPUsMySQL": '2', + "MemoryMySQL": '512', + "port": '8000', + "SitePath": '/home/dockercloudpagescloud/public_html/wpdocker', + "CPUsSite": '2', + "MemorySite": '512', + "SiteName": 'wp docker test', + "finalURL": '95.217.125.218:8001', + "blogTitle": 'testdbwp', + "adminUser": 'testdbwp', + "adminPassword": 'testdbwp', + "adminEmail": 'testdbwp', + } + ds = DockerSites(data) + + ds.DeployWPContainer() + except BaseException as msg: + print(str(msg)) + pass + +if __name__ == "__main__": + Main() \ No newline at end of file diff --git a/plogical/acl.py b/plogical/acl.py index 6571f2a97..9b1464974 100644 --- a/plogical/acl.py +++ b/plogical/acl.py @@ -1,6 +1,7 @@ #!/usr/local/CyberCP/bin/python import os,sys +from ApachController.ApacheVhosts import ApacheVhost from manageServices.models import PDNSStatus from .processUtilities import ProcessUtilities @@ -676,8 +677,6 @@ def findAllWebsites(currentACL, userID): @staticmethod def checkOwnership(domain, admin, currentACL): - - try: childDomain = ChildDomains.objects.get(domain=domain) @@ -997,3 +996,70 @@ def FetchCloudFlareAPIKeyFromAcme(): except BaseException as msg: return 0, str(msg), None + + @staticmethod + def FindDocRootOfSite(vhostConf,domainName): + try: + if vhostConf == None: + vhostConf = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf' + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + command = "awk '/docRoot/ {print $2}' " + vhostConf + docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n') + #docRoot = docRoot.replace('$VH_ROOT', f'/home/{domainName}') + return docRoot + else: + command = "awk '/DocumentRoot/ {print $2; exit}' " + vhostConf + docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n') + return docRoot + except: + pass + + @staticmethod + def ReplaceDocRoot(vhostConf, domainName, NewDocRoot): + try: + if vhostConf == None: + vhostConf = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf' + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + #command = f"sed -i 's/docRoot\s\s*.*/docRoot {NewDocRoot}/g " + vhostConf + command = f"sed -i 's#docRoot\s\s*.*#docRoot {NewDocRoot}#g' " + vhostConf + ProcessUtilities.executioner(command, 'root', True) + else: + command = f"sed -i 's#DocumentRoot\s\s*[^[:space:]]*#DocumentRoot {NewDocRoot}#g' " + vhostConf + ProcessUtilities.executioner(command, 'root', True) + + except: + pass + + @staticmethod + def FindDocRootOfSiteApache(vhostConf, domainName): + try: + finalConfPath = ApacheVhost.configBasePath + domainName + '.conf' + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + + if os.path.exists(finalConfPath): + command = "awk '/DocumentRoot/ {print $2; exit}' " + finalConfPath + docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n') + return docRoot + else: + return None + else: + return None + + except: + return None + + @staticmethod + def ReplaceDocRootApache(vhostConf, domainName, NewDocRoot): + try: + finalConfPath = ApacheVhost.configBasePath + domainName + '.conf' + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + command = f"sed -i 's#DocumentRoot\s\s*[^[:space:]]*#DocumentRoot {NewDocRoot}#g' " + finalConfPath + ProcessUtilities.executioner(command, 'root', True) + except: + pass + + diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 93793add5..7241f8749 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -4,6 +4,7 @@ import shutil import time +from ApachController.ApacheVhosts import ApacheVhost from loginSystem.models import Administrator from managePHP.phpManager import PHPManager from plogical.acl import ACLManager @@ -112,7 +113,7 @@ def installMautic(self): vhFile = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf' - phpPath = phpUtilities.GetPHPVersionFromFile(vhFile) + phpPath = phpUtilities.GetPHPVersionFromFile(vhFile, domainName) ### basically for now php 8.0 is being checked @@ -188,6 +189,13 @@ def installMautic(self): command = 'mkdir -p ' + finalPath ProcessUtilities.executioner(command, externalApp) + command = f'rm -rf {finalPath}*' + ProcessUtilities.executioner(command, externalApp) + + command = f'rm -rf {finalPath}.*' + ProcessUtilities.executioner(command, externalApp) + + ## checking for directories/files if self.dataLossCheck(finalPath, tempStatusPath, externalApp) == 0: @@ -199,16 +207,20 @@ def installMautic(self): statusFile.writelines('Downloading Mautic Core,30') statusFile.close() - command = "wget https://github.com/mautic/mautic/releases/download/%s/%s.zip" % ( - ApplicationInstaller.MauticVersion, ApplicationInstaller.MauticVersion) - ProcessUtilities.outputExecutioner(command, externalApp, None, finalPath) + #command = "wget https://github.com/mautic/mautic/releases/download/%s/%s.zip" % ( + #ApplicationInstaller.MauticVersion, ApplicationInstaller.MauticVersion) + + ### replace command with composer install + command = f'{phpPath} /usr/bin/composer create-project mautic/recommended-project:^4 {finalPath}' + ProcessUtilities.outputExecutioner(command, externalApp, None) statusFile = open(tempStatusPath, 'w') statusFile.writelines('Extracting Mautic Core,50') statusFile.close() - command = "unzip %s.zip" % (ApplicationInstaller.MauticVersion) - ProcessUtilities.outputExecutioner(command, externalApp, None, finalPath) + ### replace command with composer install + #command = "unzip %s.zip" % (ApplicationInstaller.MauticVersion) + #ProcessUtilities.outputExecutioner(command, externalApp, None, finalPath) ## @@ -222,53 +234,99 @@ def installMautic(self): else: finalURL = domainName - ACLManager.CreateSecureDir() - localDB = '%s/%s' % ('/usr/local/CyberCP/tmp', str(randint(1000, 9999))) - - localDBContent = """ 'localhost', - 'db_table_prefix' => null, - 'db_port' => 3306, - 'db_name' => '%s', - 'db_user' => '%s', - 'db_password' => '%s', - 'db_backup_tables' => true, - 'db_backup_prefix' => 'bak_', - 'admin_email' => '%s', - 'admin_password' => '%s', - 'mailer_transport' => null, - 'mailer_host' => null, - 'mailer_port' => null, - 'mailer_user' => null, - 'mailer_password' => null, - 'mailer_api_key' => null, - 'mailer_encryption' => null, - 'mailer_auth_mode' => null, -);""" % (dbName, dbUser, dbPassword, email, password) - - writeToFile = open(localDB, 'w') - writeToFile.write(localDBContent) - writeToFile.close() - - command = 'rm -rf %s/app/config/local.php' % (finalPath) - ProcessUtilities.executioner(command, externalApp) - command = 'chown %s:%s %s' % (externalApp, externalApp, localDB) - ProcessUtilities.executioner(command) +# ACLManager.CreateSecureDir() +# localDB = '%s/%s' % ('/usr/local/CyberCP/tmp', str(randint(1000, 9999))) +# +# localDBContent = """ 'localhost', +# 'db_table_prefix' => null, +# 'db_port' => 3306, +# 'db_name' => '%s', +# 'db_user' => '%s', +# 'db_password' => '%s', +# 'db_backup_tables' => true, +# 'db_backup_prefix' => 'bak_', +# 'admin_email' => '%s', +# 'admin_password' => '%s', +# 'mailer_transport' => null, +# 'mailer_host' => null, +# 'mailer_port' => null, +# 'mailer_user' => null, +# 'mailer_password' => null, +# 'mailer_api_key' => null, +# 'mailer_encryption' => null, +# 'mailer_auth_mode' => null, +# );""" % (dbName, dbUser, dbPassword, email, password) +# +# writeToFile = open(localDB, 'w') +# writeToFile.write(localDBContent) +# writeToFile.close() + + #command = 'rm -rf %s/app/config/local.php' % (finalPath) + #ProcessUtilities.executioner(command, externalApp) + + #command = 'chown %s:%s %s' % (externalApp, externalApp, localDB) + #ProcessUtilities.executioner(command) + + #command = 'cp %s %s/app/config/local.php' % (localDB, finalPath) + #ProcessUtilities.executioner(command, externalApp) + + ### replace install command with comspoer soo + #command = f"{phpPath} bin/console mautic:install http://%s -f" % (finalURL) + + command = f"{phpPath} bin/console mautic:install --db_host='localhost' --db_name='{dbName}' --db_user='{dbUser}' --db_password='{dbPassword}' --admin_username='{username}' --admin_email='{email}' --admin_password='{password}' --db_port='3306' http://{finalURL} -f" - command = 'cp %s %s/app/config/local.php' % (localDB, finalPath) - ProcessUtilities.executioner(command, externalApp) - - command = f"{phpPath} bin/console mautic:install http://%s -f" % (finalURL) result = ProcessUtilities.outputExecutioner(command, externalApp, None, finalPath) if result.find('Install complete') == -1: raise BaseException(result) - os.remove(localDB) + + ExistingDocRoot = ACLManager.FindDocRootOfSite(None, domainName) + + if ExistingDocRoot.find('docroot') > -1: + ExistingDocRoot = ExistingDocRoot.replace('docroot', '') + + + NewDocRoot = f'{ExistingDocRoot}/docroot' + ACLManager.ReplaceDocRoot(None, domainName, NewDocRoot) + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + + try: + + ExistingDocRootApache = ACLManager.FindDocRootOfSiteApache(None, domainName) + + if ExistingDocRootApache.find('docroot') == -1: + NewDocRootApache = f'{ExistingDocRootApache}docroot' + else: + NewDocRootApache = ExistingDocRootApache + + if ExistingDocRootApache != None: + ACLManager.ReplaceDocRootApache(None, domainName, NewDocRootApache) + except: + pass + + ### fix incorrect rules in .htaccess of mautic + + if ProcessUtilities.decideServer() == ProcessUtilities.ent: + htAccessPath = f'{finalPath}docroot/.htaccess' + + command = f"sed -i '/# Fallback for Apache < 2.4/,/<\/IfModule>/d' {htAccessPath}" + ProcessUtilities.executioner(command, externalApp, True) + + command = f"sed -i '/# Apache 2.4+/,/<\/IfModule>/d' {htAccessPath}" + ProcessUtilities.executioner(command, externalApp, True) + + + #os.remove(localDB) + command = f"systemctl restart {ApacheVhost.serviceName}" + ProcessUtilities.normalExecutioner(command) + installUtilities.reStartLiteSpeedSocket() statusFile = open(tempStatusPath, 'w') @@ -560,11 +618,17 @@ def installWordPress(self): ### lets first find php path + from plogical.phpUtilities import phpUtilities vhFile = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf' - phpPath = phpUtilities.GetPHPVersionFromFile(vhFile) + try: + + phpPath = phpUtilities.GetPHPVersionFromFile(vhFile) + except: + phpPath = '/usr/local/lsws/lsphp80/bin/php' + ### basically for now php 8.0 is being checked @@ -574,6 +638,7 @@ def installWordPress(self): statusFile.close() phpUtilities.InstallSaidPHP('80') + finalPath = '' self.permPath = '' diff --git a/plogical/phpUtilities.py b/plogical/phpUtilities.py index 801c461b9..0d2150c6c 100755 --- a/plogical/phpUtilities.py +++ b/plogical/phpUtilities.py @@ -9,6 +9,7 @@ import os from plogical.mailUtilities import mailUtilities from plogical.processUtilities import ProcessUtilities +from ApachController.ApacheVhosts import ApacheVhost import json from django.urls import reverse @@ -217,7 +218,18 @@ def GetStagingInJson(stagings): return msg @staticmethod - def GetPHPVersionFromFile(vhFile): + def GetPHPVersionFromFile(vhFile, domainName=None): + finalConfPath = ApacheVhost.configBasePath + domainName + '.conf' + if os.path.exists(finalConfPath): + command = f'grep -Eo -m 1 "php[0-9]+" {finalConfPath} | sed -n "1p"' + result = ProcessUtilities.outputExecutioner(command, None, True).rstrip('\n') + result = f'/usr/local/lsws/ls{result}/bin/lsphp' + result = result.rsplit("lsphp", 1)[0] + "php" + return result + + if os.path.exists('/usr/local/CyberCP/debug'): + logging.CyberCPLogFileWriter.writeToFile(f'VHFile in GetPHPVersion {vhFile}') + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: command = f'grep -Eo "/usr/local/lsws/lsphp[0-9]+/bin/lsphp" {vhFile}' result = ProcessUtilities.outputExecutioner(command, None, True).rstrip('\n') diff --git a/plogical/sslUtilities.py b/plogical/sslUtilities.py index 22c9880a5..d81d2ce1b 100755 --- a/plogical/sslUtilities.py +++ b/plogical/sslUtilities.py @@ -10,6 +10,7 @@ from websiteFunctions.models import ChildDomains, Websites except: pass +from plogical.acl import ACLManager class sslUtilities: @@ -320,7 +321,8 @@ def installSSLForDomain(virtualHostName, adminEmail='example@example.org'): except BaseException as msg: website = Websites.objects.get(domain=virtualHostName) externalApp = website.externalApp - DocumentRoot = ' DocumentRoot /home/' + virtualHostName + '/public_html\n' + docRoot = ACLManager.FindDocRootOfSite(None, virtualHostName) + DocumentRoot = f' DocumentRoot {docRoot}\n' data = open(completePathToConfigFile, 'r').readlines() phpHandler = '' diff --git a/plogical/sslv2.py b/plogical/sslv2.py index ee4a4f5e7..97967adb1 100755 --- a/plogical/sslv2.py +++ b/plogical/sslv2.py @@ -270,7 +270,8 @@ def installSSLForDomain(virtualHostName, adminEmail='example@example.org'): except BaseException as msg: website = Websites.objects.get(domain=virtualHostName) externalApp = website.externalApp - DocumentRoot = ' DocumentRoot /home/' + virtualHostName + '/public_html\n' + docRoot = ACLManager.FindDocRootOfSite(None, virtualHostName) + DocumentRoot = f' DocumentRoot {docRoot}\n' data = open(completePathToConfigFile, 'r').readlines() phpHandler = ''