Skip to content

Commit

Permalink
dynamically detect php version in ref to: https://community.cyberpane…
Browse files Browse the repository at this point in the history
  • Loading branch information
usmannasir committed Nov 26, 2023
1 parent f41f07d commit 6a4e63b
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 59 deletions.
32 changes: 24 additions & 8 deletions managePHP/phpManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,30 @@ class PHPManager:

@staticmethod
def findPHPVersions():
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:
# 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
Expand Down
70 changes: 68 additions & 2 deletions plogical/acl.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -674,8 +675,6 @@ def findAllWebsites(currentACL, userID):

@staticmethod
def checkOwnership(domain, admin, currentACL):


try:
childDomain = ChildDomains.objects.get(domain=domain)

Expand Down Expand Up @@ -995,3 +994,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


150 changes: 104 additions & 46 deletions plogical/applicationInstaller.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand All @@ -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)

##

Expand All @@ -222,53 +234,99 @@ def installMautic(self):
else:
finalURL = domainName

ACLManager.CreateSecureDir()
localDB = '%s/%s' % ('/usr/local/CyberCP/tmp', str(randint(1000, 9999)))

localDBContent = """<?php
// Example local.php to test install (to adapt of course)
$parameters = array(
// Do not set db_driver and mailer_from_name as they are used to assume Mautic is installed
'db_host' => '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)
# ACLManager.CreateSecureDir()
# localDB = '%s/%s' % ('/usr/local/CyberCP/tmp', str(randint(1000, 9999)))
#
# localDBContent = """<?php
# // Example local.php to test install (to adapt of course)
# $parameters = array(
# // Do not set db_driver and mailer_from_name as they are used to assume Mautic is installed
# 'db_host' => '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 = 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')
Expand Down
14 changes: 13 additions & 1 deletion plogical/phpUtilities.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import sys

from ApachController.ApacheVhosts import ApacheVhost

sys.path.append('/usr/local/CyberCP')
from plogical import CyberCPLogFileWriter as logging
import subprocess
Expand Down Expand Up @@ -217,7 +220,16 @@ 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 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')
Expand Down
4 changes: 3 additions & 1 deletion plogical/sslUtilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from websiteFunctions.models import ChildDomains, Websites
except:
pass
from plogical.acl import ACLManager


class sslUtilities:
Expand Down Expand Up @@ -320,7 +321,8 @@ def installSSLForDomain(virtualHostName, adminEmail='[email protected]'):
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 = ''
Expand Down
3 changes: 2 additions & 1 deletion plogical/sslv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ def installSSLForDomain(virtualHostName, adminEmail='[email protected]'):
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 = ''
Expand Down
13 changes: 13 additions & 0 deletions plogical/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import subprocess

# Run the shell command and capture the output
result = subprocess.run(['ls', '-la'], capture_output=True, text=True)

# Get the lines containing 'lsphp' in the output
lsphp_lines = [line for line in result.stdout.split('\n') if 'lsphp' in line]

# Extract the version from the lines
php_versions = [line.split()[8] for line in lsphp_lines]

print(php_versions)

0 comments on commit 6a4e63b

Please sign in to comment.