mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-03-03 19:00:45 +01:00
add support for ubuntu 24
This commit is contained in:
@@ -14,6 +14,10 @@ from os.path import *
|
||||
from stat import *
|
||||
import stat
|
||||
import secrets
|
||||
from installHelpers import (PackageManager, ServiceManager, ConfigFileHandler,
|
||||
CommandExecutor, PHPInstaller, FileSystemHelper,
|
||||
DistroHandler, PermissionManager, DownloadHelper,
|
||||
SSLCertificateHelper)
|
||||
|
||||
VERSION = '2.4'
|
||||
BUILD = 2
|
||||
@@ -251,8 +255,10 @@ class preFlightsChecks:
|
||||
|
||||
ffResult = ffResult.stdout.rstrip('\n')
|
||||
|
||||
command = f"DEBIAN_FRONTEND=noninteractive apt-get install linux-modules-extra-{ffResult}"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR, True)
|
||||
# Install kernel modules extra package for quota support
|
||||
# This is needed for Ubuntu 20.04+ including 24.04
|
||||
command = f"DEBIAN_FRONTEND=noninteractive apt-get install -y linux-modules-extra-{ffResult}"
|
||||
CommandExecutor.execute(command, self.distro, exit_on_error=False)
|
||||
|
||||
###
|
||||
|
||||
@@ -497,7 +503,12 @@ class preFlightsChecks:
|
||||
|
||||
def checkPythonVersion(self):
|
||||
if sys.version_info[0] == 3:
|
||||
return 1
|
||||
# Ubuntu 24.04 uses Python 3.12, ensure we support it
|
||||
if sys.version_info[0] == 3 and sys.version_info[1] >= 6:
|
||||
return 1
|
||||
else:
|
||||
preFlightsChecks.stdOut("Python 3.6 or higher is required")
|
||||
os._exit(0)
|
||||
else:
|
||||
preFlightsChecks.stdOut("You are running Unsupported python version, please install python 3.x")
|
||||
os._exit(0)
|
||||
@@ -555,6 +566,7 @@ class preFlightsChecks:
|
||||
|
||||
if self.distro == ubuntu:
|
||||
try:
|
||||
# This script automatically detects Ubuntu version including 24.04
|
||||
filename = "enable_lst_debain_repo.sh"
|
||||
command = "wget http://rpms.litespeedtech.com/debian/" + filename
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
@@ -595,13 +607,7 @@ class preFlightsChecks:
|
||||
|
||||
def install_psmisc(self):
|
||||
self.stdOut("Install psmisc")
|
||||
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = "yum -y install psmisc"
|
||||
else:
|
||||
command = "DEBIAN_FRONTEND=noninteractive apt-get -y install psmisc"
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR, True)
|
||||
PackageManager.install_packages('psmisc', self.distro, ubuntu, centos, cent8, openeuler, use_shell=True)
|
||||
|
||||
def download_install_CyberPanel(self, mysqlPassword, mysql):
|
||||
##
|
||||
@@ -751,59 +757,41 @@ password="%s"
|
||||
command = "usermod -G lscpd,lsadm,nogroup lscpd"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "find /usr/local/CyberCP -type d -exec chmod 0755 {} \;"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "find /usr/local/CyberCP -type f -exec chmod 0644 {} \;"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod -R 755 /usr/local/CyberCP/bin"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
# Set permissions for CyberCP directories and files
|
||||
CommandExecutor.execute("find /usr/local/CyberCP -type d -exec chmod 0755 {} \;", self.distro)
|
||||
CommandExecutor.execute("find /usr/local/CyberCP -type f -exec chmod 0644 {} \;", self.distro)
|
||||
PermissionManager.set_permissions('/usr/local/CyberCP/bin', '755', self.distro, owner='root', group='root')
|
||||
|
||||
## change owner
|
||||
|
||||
command = "chown -R root:root /usr/local/CyberCP"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute("chown -R root:root /usr/local/CyberCP", self.distro)
|
||||
|
||||
########### Fix LSCPD
|
||||
# Set permissions for LSCP directories and files
|
||||
CommandExecutor.execute("find /usr/local/lscp -type d -exec chmod 0755 {} \;", self.distro)
|
||||
CommandExecutor.execute("find /usr/local/lscp -type f -exec chmod 0644 {} \;", self.distro)
|
||||
|
||||
# Set specific directory permissions
|
||||
permission_list = [
|
||||
{'path': '/usr/local/lscp/bin', 'mode': '755'},
|
||||
{'path': '/usr/local/lscp/fcgi-bin', 'mode': '755'}
|
||||
]
|
||||
PermissionManager.batch_set_permissions(permission_list, self.distro)
|
||||
|
||||
# Set ownership
|
||||
PermissionManager.set_permissions('/usr/local/CyberCP/public/phpmyadmin/tmp', '755', self.distro,
|
||||
owner='lscpd', group='lscpd')
|
||||
CommandExecutor.execute("chown -R root:root /usr/local/lscp", self.distro)
|
||||
PermissionManager.set_permissions('/usr/local/lscp/cyberpanel/rainloop', '755', self.distro,
|
||||
owner='lscpd', group='lscpd')
|
||||
|
||||
command = "find /usr/local/lscp -type d -exec chmod 0755 {} \;"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "find /usr/local/lscp -type f -exec chmod 0644 {} \;"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod -R 755 /usr/local/lscp/bin"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod -R 755 /usr/local/lscp/fcgi-bin"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chown -R lscpd:lscpd /usr/local/CyberCP/public/phpmyadmin/tmp"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
## change owner
|
||||
|
||||
command = "chown -R root:root /usr/local/lscp"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chown -R lscpd:lscpd /usr/local/lscp/cyberpanel/rainloop"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod 700 /usr/local/CyberCP/cli/cyberPanel.py"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod 700 /usr/local/CyberCP/plogical/upgradeCritical.py"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod 755 /usr/local/CyberCP/postfixSenderPolicy/client.py"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chmod 640 /usr/local/CyberCP/CyberCP/settings.py"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "chown root:cyberpanel /usr/local/CyberCP/CyberCP/settings.py"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
# Set specific file permissions
|
||||
specific_permissions = [
|
||||
{'path': '/usr/local/CyberCP/cli/cyberPanel.py', 'mode': '700'},
|
||||
{'path': '/usr/local/CyberCP/plogical/upgradeCritical.py', 'mode': '700'},
|
||||
{'path': '/usr/local/CyberCP/postfixSenderPolicy/client.py', 'mode': '755'},
|
||||
{'path': '/usr/local/CyberCP/CyberCP/settings.py', 'mode': '640', 'owner': 'root', 'group': 'cyberpanel'}
|
||||
]
|
||||
PermissionManager.batch_set_permissions(specific_permissions, self.distro)
|
||||
|
||||
files = ['/etc/yum.repos.d/MariaDB.repo', '/etc/pdns/pdns.conf', '/etc/systemd/system/lscpd.service',
|
||||
'/etc/pure-ftpd/pure-ftpd.conf', '/etc/pure-ftpd/pureftpd-pgsql.conf',
|
||||
@@ -1428,45 +1416,30 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
|
||||
##
|
||||
|
||||
command = 'chmod o= /etc/dovecot/dovecot-sql.conf.ext'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
PermissionManager.set_permissions('/etc/dovecot/dovecot-sql.conf.ext', 'o=', self.distro)
|
||||
|
||||
################################### Restart dovecot
|
||||
|
||||
command = 'systemctl enable dovecot.service'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
##
|
||||
|
||||
command = 'systemctl start dovecot.service'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
##
|
||||
|
||||
command = 'systemctl restart postfix.service'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.enable_service('dovecot.service', self.distro)
|
||||
ServiceManager.start_service('dovecot.service', self.distro)
|
||||
ServiceManager.restart_service('postfix.service', self.distro)
|
||||
|
||||
## chaging permissions for main.cf
|
||||
|
||||
command = "chmod 755 " + main
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
PermissionManager.set_permissions(main, '755', self.distro)
|
||||
|
||||
if self.distro == ubuntu:
|
||||
command = "mkdir -p /etc/pki/dovecot/private/"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
# Create required directories
|
||||
for directory in ['/etc/pki/dovecot/private/', '/etc/pki/dovecot/certs/', '/etc/opendkim/keys/']:
|
||||
CommandExecutor.execute(f"mkdir -p {directory}", self.distro)
|
||||
|
||||
command = "mkdir -p /etc/pki/dovecot/certs/"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ConfigFileHandler.sed_replace('/etc/dovecot/conf.d/10-auth.conf',
|
||||
'auth_mechanisms = plain',
|
||||
'#auth_mechanisms = plain',
|
||||
self.distro)
|
||||
|
||||
command = "mkdir -p /etc/opendkim/keys/"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "sed -i 's/auth_mechanisms = plain/#auth_mechanisms = plain/g' /etc/dovecot/conf.d/10-auth.conf"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
## Ubuntu 18.10 ssl_dh for dovecot 2.3.2.1
|
||||
|
||||
if get_Ubuntu_release() == 18.10:
|
||||
## Ubuntu version-specific ssl_dh for dovecot
|
||||
ubuntu_version = get_Ubuntu_release()
|
||||
|
||||
if ubuntu_version == 18.10:
|
||||
dovecotConf = '/etc/dovecot/dovecot.conf'
|
||||
|
||||
data = open(dovecotConf, 'r').readlines()
|
||||
@@ -1705,19 +1678,11 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
######
|
||||
if self.distro == centos:
|
||||
# Not available in ubuntu
|
||||
command = 'systemctl restart dbus'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.restart_service('dbus', self.distro)
|
||||
|
||||
command = 'systemctl restart systemd-logind'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = 'systemctl start firewalld'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
##########
|
||||
|
||||
command = 'systemctl enable firewalld'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.restart_service('systemd-logind', self.distro)
|
||||
ServiceManager.start_service('firewalld', self.distro)
|
||||
ServiceManager.enable_service('firewalld', self.distro)
|
||||
|
||||
FirewallUtilities.addRule("tcp", "8090")
|
||||
FirewallUtilities.addRule("tcp", "7080")
|
||||
@@ -2074,27 +2039,20 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
|
||||
try:
|
||||
## first install crontab
|
||||
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'yum install cronie -y'
|
||||
# Determine package and service names based on distribution
|
||||
if DistroHandler.is_rhel_based(self.distro):
|
||||
cron_package = 'cronie'
|
||||
cron_service = 'crond'
|
||||
else:
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install cron'
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR, True)
|
||||
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'systemctl enable crond'
|
||||
else:
|
||||
command = 'systemctl enable cron'
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'systemctl start crond'
|
||||
else:
|
||||
command = 'systemctl start cron'
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
cron_package = 'cron'
|
||||
cron_service = 'cron'
|
||||
|
||||
# Install cron package
|
||||
PackageManager.install_packages(cron_package, self.distro, ubuntu, centos, cent8, openeuler, use_shell=True)
|
||||
|
||||
# Enable and start cron service
|
||||
ServiceManager.enable_service(cron_service, self.distro)
|
||||
ServiceManager.start_service(cron_service, self.distro)
|
||||
|
||||
##
|
||||
|
||||
@@ -2149,15 +2107,11 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
writeToFile.close()
|
||||
|
||||
if not os.path.exists(CentOSPath) or not os.path.exists(openEulerPath):
|
||||
command = 'chmod 600 %s' % (cronPath)
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
PermissionManager.set_permissions(cronPath, '600', self.distro)
|
||||
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'systemctl restart crond.service'
|
||||
else:
|
||||
command = 'systemctl restart cron.service'
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
# Restart cron service
|
||||
cron_service = 'crond.service' if DistroHandler.is_rhel_based(self.distro) else 'cron.service'
|
||||
ServiceManager.restart_service(cron_service, self.distro)
|
||||
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [setup_cron]")
|
||||
@@ -2166,12 +2120,9 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
def install_default_keys(self):
|
||||
try:
|
||||
path = "/root/.ssh"
|
||||
FileSystemHelper.create_directory(path)
|
||||
|
||||
if not os.path.exists(path):
|
||||
os.mkdir(path)
|
||||
|
||||
command = "ssh-keygen -f /root/.ssh/cyberpanel -t rsa -N ''"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute("ssh-keygen -f /root/.ssh/cyberpanel -t rsa -N ''", self.distro)
|
||||
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [install_default_keys]")
|
||||
@@ -2179,13 +2130,7 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout';
|
||||
|
||||
def install_rsync(self):
|
||||
try:
|
||||
if self.distro == centos or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'yum -y install rsync'
|
||||
else:
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install rsync'
|
||||
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR, True)
|
||||
|
||||
PackageManager.install_packages('rsync', self.distro, ubuntu, centos, cent8, openeuler, use_shell=True)
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [install_rsync]")
|
||||
return 0
|
||||
@@ -2306,17 +2251,9 @@ milter_default_action = accept
|
||||
writeToFile.close()
|
||||
|
||||
#### Restarting Postfix and OpenDKIM
|
||||
|
||||
command = "systemctl start opendkim"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = "systemctl enable opendkim"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
##
|
||||
|
||||
command = "systemctl start postfix"
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.start_service('opendkim', self.distro)
|
||||
ServiceManager.enable_service('opendkim', self.distro)
|
||||
ServiceManager.start_service('postfix', self.distro)
|
||||
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [configureOpenDKIM]")
|
||||
@@ -2380,12 +2317,12 @@ milter_default_action = accept
|
||||
|
||||
@staticmethod
|
||||
def installOne(package):
|
||||
res = subprocess.call(shlex.split('DEBIAN_FRONTEND=noninteractive apt-get -y install ' + package))
|
||||
# This method is only used for Ubuntu/Debian systems
|
||||
command = f'DEBIAN_FRONTEND=noninteractive apt-get -y install {package}'
|
||||
res = subprocess.call(shlex.split(command))
|
||||
if res != 0:
|
||||
preFlightsChecks.stdOut("Error #" + str(res) + ' installing:' + package + '. This may not be an issue ' \
|
||||
'but may affect installation of something later',
|
||||
1)
|
||||
|
||||
preFlightsChecks.stdOut(f"Error #{res} installing: {package}. This may not be an issue "
|
||||
"but may affect installation of something later", 1)
|
||||
return res # Though probably not used
|
||||
|
||||
@staticmethod
|
||||
@@ -2583,40 +2520,27 @@ vmail
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
def installRedis(self):
|
||||
if self.distro == ubuntu:
|
||||
command = 'apt install redis-server -y'
|
||||
elif self.distro == centos:
|
||||
command = 'yum install redis -y'
|
||||
else:
|
||||
command = 'dnf install redis -y'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
# Install Redis package (different name on Ubuntu)
|
||||
redis_package = 'redis-server' if self.distro == ubuntu else 'redis'
|
||||
PackageManager.install_packages(redis_package, self.distro, ubuntu, centos, cent8, openeuler)
|
||||
|
||||
## install redis conf
|
||||
|
||||
redisConf = '/usr/local/lsws/conf/dvhost_redis.conf'
|
||||
with open(redisConf, 'w') as writeToFile:
|
||||
writeToFile.write('127.0.0.1,6379,<auth_password>\n')
|
||||
|
||||
writeToFile = open(redisConf, 'w')
|
||||
writeToFile.write('127.0.0.1,6379,<auth_password>\n')
|
||||
writeToFile.close()
|
||||
|
||||
##
|
||||
|
||||
## Copy configuration
|
||||
os.chdir(self.cwd)
|
||||
|
||||
confPath = '/usr/local/lsws/conf/'
|
||||
|
||||
if os.path.exists('%shttpd.conf' % (confPath)):
|
||||
os.remove('%shttpd.conf' % (confPath))
|
||||
|
||||
shutil.copy('litespeed/httpd-redis.conf', '%shttpd.conf' % (confPath))
|
||||
httpd_conf = f'{confPath}httpd.conf'
|
||||
|
||||
if os.path.exists(httpd_conf):
|
||||
os.remove(httpd_conf)
|
||||
shutil.copy('litespeed/httpd-redis.conf', httpd_conf)
|
||||
|
||||
## start and enable
|
||||
|
||||
command = 'systemctl start redis'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = 'systemctl enable redis'
|
||||
preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.start_service('redis', self.distro)
|
||||
ServiceManager.enable_service('redis', self.distro)
|
||||
|
||||
def disablePackegeUpdates(self):
|
||||
if self.distro == centos:
|
||||
|
||||
@@ -9,6 +9,7 @@ import MySQLdb as mariadb
|
||||
import install
|
||||
from os.path import exists
|
||||
import time
|
||||
from installHelpers import PackageManager, ServiceManager, ConfigFileHandler, CommandExecutor, PHPInstaller, FileSystemHelper
|
||||
|
||||
# distros
|
||||
centos = 0
|
||||
@@ -113,27 +114,18 @@ class InstallCyberPanel:
|
||||
|
||||
def installLiteSpeed(self):
|
||||
if self.ent == 0:
|
||||
if self.distro == ubuntu:
|
||||
command = "DEBIAN_FRONTEND=noninteractive apt-get -y install openlitespeed"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
elif self.distro == centos:
|
||||
command = 'yum install -y openlitespeed'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
else:
|
||||
command = 'dnf install -y openlitespeed'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
PackageManager.install_packages('openlitespeed', self.distro, ubuntu, centos, cent8, openeuler,
|
||||
use_shell=(self.distro == ubuntu))
|
||||
|
||||
else:
|
||||
try:
|
||||
try:
|
||||
command = 'groupadd nobody'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute('groupadd nobody', self.distro, exit_on_error=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
command = 'usermod -a -G nobody nobody'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute('usermod -a -G nobody nobody', self.distro, exit_on_error=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -142,20 +134,20 @@ class InstallCyberPanel:
|
||||
else:
|
||||
command = 'wget https://www.litespeedtech.com/packages/6.0/lsws-6.2-ent-x86_64-linux.tar.gz'
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
CommandExecutor.execute(command, self.distro)
|
||||
|
||||
if InstallCyberPanel.ISARM():
|
||||
command = 'tar zxf lsws-6.2-ent-aarch64-linux.tar.gz'
|
||||
else:
|
||||
command = 'tar zxf lsws-6.2-ent-x86_64-linux.tar.gz'
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
CommandExecutor.execute(command, self.distro)
|
||||
|
||||
if str.lower(self.serial) == 'trial':
|
||||
command = 'wget -q --output-document=lsws-6.2/trial.key http://license.litespeedtech.com/reseller/trial.key'
|
||||
if self.serial == '1111-2222-3333-4444':
|
||||
command = 'wget -q --output-document=/root/cyberpanel/install/lsws-6.2/trial.key http://license.litespeedtech.com/reseller/trial.key'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
CommandExecutor.execute(command, self.distro)
|
||||
else:
|
||||
writeSerial = open('lsws-6.2/serial.no', 'w')
|
||||
writeSerial.writelines(self.serial)
|
||||
@@ -166,14 +158,9 @@ class InstallCyberPanel:
|
||||
|
||||
os.chdir('lsws-6.2')
|
||||
|
||||
command = 'chmod +x install.sh'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'chmod +x functions.sh'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = './install.sh'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
CommandExecutor.execute('chmod +x install.sh', self.distro)
|
||||
CommandExecutor.execute('chmod +x functions.sh', self.distro)
|
||||
CommandExecutor.execute('./install.sh', self.distro)
|
||||
|
||||
os.chdir(self.cwd)
|
||||
confPath = '/usr/local/lsws/conf/'
|
||||
@@ -181,8 +168,7 @@ class InstallCyberPanel:
|
||||
shutil.copy('litespeed/modsec.conf', confPath)
|
||||
shutil.copy('litespeed/httpd.conf', confPath)
|
||||
|
||||
command = 'chown -R lsadm:lsadm ' + confPath
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute('chown -R lsadm:lsadm ' + confPath, self.distro, exit_on_error=False)
|
||||
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [installLiteSpeed]")
|
||||
@@ -192,26 +178,20 @@ class InstallCyberPanel:
|
||||
|
||||
def reStartLiteSpeed(self):
|
||||
command = self.server_root_path + "bin/lswsctrl restart"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute(command, self.distro, exit_on_error=False)
|
||||
|
||||
def fix_ols_configs(self):
|
||||
try:
|
||||
|
||||
InstallCyberPanel.stdOut("Fixing OpenLiteSpeed configurations!", 1)
|
||||
|
||||
## remove example virtual host
|
||||
config_path = self.server_root_path + "conf/httpd_config.conf"
|
||||
data = open(config_path, 'r').readlines()
|
||||
|
||||
data = open(self.server_root_path + "conf/httpd_config.conf", 'r').readlines()
|
||||
|
||||
writeDataToFile = open(self.server_root_path + "conf/httpd_config.conf", 'w')
|
||||
|
||||
for items in data:
|
||||
if items.find("map") > -1 and items.find("Example") > -1:
|
||||
continue
|
||||
else:
|
||||
writeDataToFile.writelines(items)
|
||||
|
||||
writeDataToFile.close()
|
||||
with open(config_path, 'w') as writeDataToFile:
|
||||
for items in data:
|
||||
if not (items.find("map") > -1 and items.find("Example") > -1):
|
||||
writeDataToFile.writelines(items)
|
||||
|
||||
InstallCyberPanel.stdOut("OpenLiteSpeed Configurations fixed!", 1)
|
||||
except IOError as msg:
|
||||
@@ -224,17 +204,11 @@ class InstallCyberPanel:
|
||||
try:
|
||||
InstallCyberPanel.stdOut("Changing default port to 80..", 1)
|
||||
|
||||
data = open(self.server_root_path + "conf/httpd_config.conf").readlines()
|
||||
|
||||
writeDataToFile = open(self.server_root_path + "conf/httpd_config.conf", 'w')
|
||||
|
||||
for items in data:
|
||||
if (items.find("*:8088") > -1):
|
||||
writeDataToFile.writelines(items.replace("*:8088", "*:80"))
|
||||
else:
|
||||
writeDataToFile.writelines(items)
|
||||
|
||||
writeDataToFile.close()
|
||||
config_path = self.server_root_path + "conf/httpd_config.conf"
|
||||
replacements = [("*:8088", "*:80")]
|
||||
|
||||
# Use sed for simple replacement
|
||||
ConfigFileHandler.sed_replace(config_path, "*:8088", "*:80", self.distro)
|
||||
|
||||
InstallCyberPanel.stdOut("Default port is now 80 for OpenLiteSpeed!", 1)
|
||||
|
||||
@@ -245,95 +219,33 @@ class InstallCyberPanel:
|
||||
return self.reStartLiteSpeed()
|
||||
|
||||
def installAllPHPVersions(self):
|
||||
|
||||
if self.distro == ubuntu:
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install ' \
|
||||
'lsphp7? lsphp7?-common lsphp7?-curl lsphp7?-dev lsphp7?-imap lsphp7?-intl lsphp7?-json ' \
|
||||
'lsphp7?-ldap lsphp7?-mysql lsphp7?-opcache lsphp7?-pspell lsphp7?-recode ' \
|
||||
'lsphp7?-sqlite3 lsphp7?-tidy'
|
||||
|
||||
os.system(command)
|
||||
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install lsphp80*'
|
||||
os.system(command)
|
||||
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install lsphp81*'
|
||||
os.system(command)
|
||||
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install lsphp82*'
|
||||
os.system(command)
|
||||
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install lsphp83*'
|
||||
os.system(command)
|
||||
|
||||
elif self.distro == centos:
|
||||
command = 'yum -y groupinstall lsphp-all'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
InstallCyberPanel.stdOut("LiteSpeed PHPs successfully installed!", 1)
|
||||
|
||||
## only php 71
|
||||
if self.distro == centos:
|
||||
command = 'yum install -y lsphp71* --skip-broken'
|
||||
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
## only php 72
|
||||
command = 'yum install -y lsphp72* --skip-broken'
|
||||
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
## only php 73
|
||||
command = 'yum install -y lsphp73* --skip-broken'
|
||||
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
## only php 74
|
||||
command = 'yum install -y lsphp74* --skip-broken'
|
||||
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'yum install lsphp80* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'yum install lsphp81* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'yum install lsphp82* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'yum install lsphp83* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
if self.distro == cent8:
|
||||
command = 'dnf install lsphp71* lsphp72* lsphp73* lsphp74* lsphp80* --exclude lsphp73-pecl-zip --exclude *imagick* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'dnf install lsphp81* lsphp82* lsphp83* --exclude *imagick* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
PHPInstaller.install_php_ubuntu()
|
||||
else:
|
||||
PHPInstaller.install_php_centos(self.distro, centos, cent8, openeuler)
|
||||
|
||||
if self.distro == openeuler:
|
||||
command = 'dnf install lsphp71* lsphp72* lsphp73* lsphp74* lsphp80* lsphp81* lsphp82* lsphp83* -y'
|
||||
subprocess.call(command, shell=True)
|
||||
InstallCyberPanel.stdOut("LiteSpeed PHPs successfully installed!", 1)
|
||||
|
||||
def installMySQL(self, mysql):
|
||||
|
||||
############## Install mariadb ######################
|
||||
|
||||
if self.distro == ubuntu:
|
||||
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get install software-properties-common -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = "DEBIAN_FRONTEND=noninteractive apt-get install apt-transport-https curl -y"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = "mkdir -p /etc/apt/keyrings"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = "curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
PackageManager.install_packages('software-properties-common', self.distro, ubuntu, centos, cent8, openeuler, use_shell=True)
|
||||
PackageManager.install_packages('apt-transport-https curl', self.distro, ubuntu, centos, cent8, openeuler, use_shell=True)
|
||||
|
||||
FileSystemHelper.create_directory('/etc/apt/keyrings')
|
||||
CommandExecutor.execute("curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'", self.distro)
|
||||
RepoPath = '/etc/apt/sources.list.d/mariadb.sources'
|
||||
# Determine the Ubuntu codename for MariaDB repo
|
||||
ubuntu_version = get_Ubuntu_release()
|
||||
if ubuntu_version >= 24.04:
|
||||
suite = 'noble' # Ubuntu 24.04 LTS
|
||||
elif ubuntu_version >= 22.04:
|
||||
suite = 'jammy' # Ubuntu 22.04 LTS
|
||||
else:
|
||||
suite = 'focal' # Ubuntu 20.04 LTS and earlier
|
||||
|
||||
RepoContent = f"""
|
||||
# MariaDB 10.11 repository list - created 2023-12-11 07:53 UTC
|
||||
# https://mariadb.org/download/
|
||||
@@ -342,14 +254,15 @@ Types: deb
|
||||
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
|
||||
# URIs: https://deb.mariadb.org/10.11/ubuntu
|
||||
URIs: https://mirrors.gigenet.com/mariadb/repo/10.11/ubuntu
|
||||
Suites: jammy
|
||||
Suites: {suite}
|
||||
Components: main main/debug
|
||||
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp
|
||||
"""
|
||||
|
||||
if get_Ubuntu_release() > 21.00:
|
||||
# Use the MariaDB repository setup script which automatically handles different Ubuntu versions
|
||||
command = 'curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=10.11'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
CommandExecutor.execute(command, self.distro, exit_code=os.EX_OSERR)
|
||||
# WriteToFile = open(RepoPath, 'w')
|
||||
# WriteToFile.write(RepoContent)
|
||||
# WriteToFile.close()
|
||||
@@ -385,31 +298,16 @@ gpgcheck=1
|
||||
|
||||
|
||||
if type == 'cl' and version >= 88:
|
||||
|
||||
command = 'yum remove db-governor db-governor-mysql -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = 'yum install governor-mysql -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = '/usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mariadb106'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
CommandExecutor.execute('yum remove db-governor db-governor-mysql -y', self.distro)
|
||||
PackageManager.install_packages('governor-mysql', self.distro, ubuntu, centos, cent8, openeuler)
|
||||
CommandExecutor.execute('/usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mariadb106', self.distro)
|
||||
command = '/usr/share/lve/dbgovernor/mysqlgovernor.py --install --yes'
|
||||
|
||||
else:
|
||||
|
||||
command = 'curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=10.11'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = 'yum remove mariadb* -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = 'sudo dnf -qy module disable mariadb'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
|
||||
command = 'sudo dnf module reset mariadb -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
CommandExecutor.execute('curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=10.11', self.distro)
|
||||
CommandExecutor.execute('yum remove mariadb* -y', self.distro)
|
||||
CommandExecutor.execute('sudo dnf -qy module disable mariadb', self.distro)
|
||||
CommandExecutor.execute('sudo dnf module reset mariadb -y', self.distro)
|
||||
|
||||
|
||||
command = 'dnf install MariaDB-server MariaDB-client MariaDB-backup -y'
|
||||
@@ -434,29 +332,17 @@ gpgcheck=1
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 0, 0, os.EX_OSERR)
|
||||
|
||||
def startMariaDB(self):
|
||||
|
||||
if self.remotemysql == 'OFF':
|
||||
############## Start mariadb ######################
|
||||
if self.distro == cent8 or self.distro == ubuntu:
|
||||
command = 'systemctl start mariadb'
|
||||
else:
|
||||
command = "systemctl start mariadb"
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ServiceManager.start_service('mariadb', self.distro)
|
||||
|
||||
############## Enable mariadb at system startup ######################
|
||||
|
||||
if os.path.exists('/etc/systemd/system/mysqld.service'):
|
||||
os.remove('/etc/systemd/system/mysqld.service')
|
||||
if os.path.exists('/etc/systemd/system/mariadb.service'):
|
||||
os.remove('/etc/systemd/system/mariadb.service')
|
||||
|
||||
if self.distro == ubuntu:
|
||||
command = "systemctl enable mariadb"
|
||||
else:
|
||||
command = "systemctl enable mariadb"
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ServiceManager.enable_service('mariadb', self.distro)
|
||||
|
||||
def fixMariaDB(self):
|
||||
self.stdOut("Setup MariaDB so it can support Cyberpanel's needs")
|
||||
@@ -474,16 +360,11 @@ gpgcheck=1
|
||||
|
||||
try:
|
||||
fileName = '/etc/mysql/mariadb.conf.d/50-server.cnf'
|
||||
data = open(fileName, 'r').readlines()
|
||||
|
||||
writeDataToFile = open(fileName, 'w')
|
||||
for line in data:
|
||||
writeDataToFile.write(line.replace('utf8mb4', 'utf8'))
|
||||
writeDataToFile.close()
|
||||
ConfigFileHandler.sed_replace(fileName, 'utf8mb4', 'utf8', self.distro)
|
||||
except IOError as err:
|
||||
self.stdOut("[ERROR] Error in setting: " + fileName + ": " + str(err), 1, 1, os.EX_OSERR)
|
||||
|
||||
os.system('systemctl restart mariadb')
|
||||
ServiceManager.restart_service('mariadb', self.distro)
|
||||
|
||||
self.stdOut("MariaDB is now setup so it can support Cyberpanel's needs")
|
||||
|
||||
@@ -493,45 +374,35 @@ gpgcheck=1
|
||||
os.system(command)
|
||||
|
||||
if get_Ubuntu_release() == 18.10:
|
||||
command = 'wget https://rep.cyberpanel.net/pure-ftpd-common_1.0.47-3_all.deb'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
elif self.distro == centos:
|
||||
command = "yum install -y pure-ftpd"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
elif self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'dnf install pure-ftpd -y'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
urls = [
|
||||
'https://rep.cyberpanel.net/pure-ftpd-common_1.0.47-3_all.deb',
|
||||
'https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb'
|
||||
]
|
||||
packages = [
|
||||
'pure-ftpd-common_1.0.47-3_all.deb',
|
||||
'pure-ftpd-mysql_1.0.47-3_amd64.deb'
|
||||
]
|
||||
|
||||
for url in urls:
|
||||
CommandExecutor.execute(f'wget {url}', self.distro)
|
||||
|
||||
for package in packages:
|
||||
CommandExecutor.execute(f'dpkg --install --force-confold {package}', self.distro)
|
||||
else:
|
||||
PackageManager.install_packages('pure-ftpd', self.distro, ubuntu, centos, cent8, openeuler)
|
||||
|
||||
####### Install pureftpd to system startup
|
||||
|
||||
command = "systemctl enable " + install.preFlightsChecks.pureFTPDServiceName(self.distro)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
service_name = install.preFlightsChecks.pureFTPDServiceName(self.distro)
|
||||
ServiceManager.enable_service(service_name, self.distro)
|
||||
|
||||
###### FTP Groups and user settings settings
|
||||
|
||||
command = 'groupadd -g 2001 ftpgroup'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
FileSystemHelper.create_user_and_group('ftpuser', 'ftpgroup', 2001, 2001,
|
||||
shell='/bin/false', home='/bin/null', distro=self.distro)
|
||||
|
||||
def startPureFTPD(self):
|
||||
############## Start pureftpd ######################
|
||||
if self.distro == ubuntu:
|
||||
command = 'systemctl start pure-ftpd-mysql'
|
||||
else:
|
||||
command = 'systemctl start pure-ftpd'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
service_name = 'pure-ftpd-mysql' if self.distro == ubuntu else 'pure-ftpd'
|
||||
ServiceManager.start_service(service_name, self.distro)
|
||||
|
||||
def installPureFTPDConfigurations(self, mysql):
|
||||
try:
|
||||
@@ -539,10 +410,7 @@ gpgcheck=1
|
||||
|
||||
InstallCyberPanel.stdOut("Configuring PureFTPD..", 1)
|
||||
|
||||
try:
|
||||
os.mkdir("/etc/ssl/private")
|
||||
except:
|
||||
logging.InstallLog.writeToFile("[ERROR] Could not create directory for FTP SSL")
|
||||
FileSystemHelper.create_directory("/etc/ssl/private")
|
||||
|
||||
if (self.distro == centos or self.distro == cent8 or self.distro == openeuler) or (
|
||||
self.distro == ubuntu and get_Ubuntu_release() == 18.14):
|
||||
@@ -550,7 +418,7 @@ gpgcheck=1
|
||||
else:
|
||||
command = 'openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -subj "/C=US/ST=Denial/L=Sprinal-ield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute(command, self.distro, exit_on_error=False)
|
||||
|
||||
os.chdir(self.cwd)
|
||||
ftpdPath = "/etc/pure-ftpd"
|
||||
@@ -568,37 +436,20 @@ gpgcheck=1
|
||||
shutil.copytree("pure-ftpd-one", ftpdPath)
|
||||
|
||||
if self.distro == ubuntu:
|
||||
try:
|
||||
os.mkdir('/etc/pure-ftpd/conf')
|
||||
os.mkdir('/etc/pure-ftpd/auth')
|
||||
os.mkdir('/etc/pure-ftpd/db')
|
||||
except OSError as err:
|
||||
self.stdOut("[ERROR] Error creating extra pure-ftpd directories: " + str(err), ". Should be ok", 1)
|
||||
for dir_path in ['/etc/pure-ftpd/conf', '/etc/pure-ftpd/auth', '/etc/pure-ftpd/db']:
|
||||
FileSystemHelper.create_directory(dir_path)
|
||||
|
||||
data = open(ftpdPath + "/pureftpd-mysql.conf", "r").readlines()
|
||||
|
||||
writeDataToFile = open(ftpdPath + "/pureftpd-mysql.conf", "w")
|
||||
|
||||
dataWritten = "MYSQLPassword " + InstallCyberPanel.mysqlPassword + '\n'
|
||||
for items in data:
|
||||
if items.find("MYSQLPassword") > -1:
|
||||
writeDataToFile.writelines(dataWritten)
|
||||
else:
|
||||
writeDataToFile.writelines(items)
|
||||
|
||||
writeDataToFile.close()
|
||||
# Update MySQL password in pureftpd config
|
||||
pureftpd_config = ftpdPath + "/pureftpd-mysql.conf"
|
||||
replacements = [("MYSQLPassword", "MYSQLPassword " + InstallCyberPanel.mysqlPassword)]
|
||||
ConfigFileHandler.replace_in_file(pureftpd_config, replacements)
|
||||
|
||||
ftpConfPath = '/etc/pure-ftpd/pureftpd-mysql.conf'
|
||||
|
||||
if self.remotemysql == 'ON':
|
||||
command = "sed -i 's|localhost|%s|g' %s" % (self.mysqlhost, ftpConfPath)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = "sed -i 's|3306|%s|g' %s" % (self.mysqlport, ftpConfPath)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = "sed -i 's|MYSQLSocket /var/lib/mysql/mysql.sock||g' %s" % (ftpConfPath)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ConfigFileHandler.sed_replace(ftpConfPath, 'localhost', self.mysqlhost, self.distro)
|
||||
ConfigFileHandler.sed_replace(ftpConfPath, '3306', self.mysqlport, self.distro)
|
||||
ConfigFileHandler.sed_replace(ftpConfPath, 'MYSQLSocket /var/lib/mysql/mysql.sock', '', self.distro)
|
||||
|
||||
if self.distro == ubuntu:
|
||||
|
||||
@@ -608,41 +459,31 @@ gpgcheck=1
|
||||
else:
|
||||
shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf')
|
||||
|
||||
command = 'echo 1 > /etc/pure-ftpd/conf/TLS'
|
||||
subprocess.call(command, shell=True)
|
||||
# Write configuration values to files
|
||||
config_values = [
|
||||
('1', '/etc/pure-ftpd/conf/TLS'),
|
||||
(str(self.publicip), '/etc/pure-ftpd/conf/ForcePassiveIP'),
|
||||
('40110 40210', '/etc/pure-ftpd/conf/PassivePortRange'),
|
||||
('no', '/etc/pure-ftpd/conf/UnixAuthentication'),
|
||||
('/etc/pure-ftpd/db/mysql.conf', '/etc/pure-ftpd/conf/MySQLConfigFile')
|
||||
]
|
||||
|
||||
for value, filepath in config_values:
|
||||
with open(filepath, 'w') as f:
|
||||
f.write(value)
|
||||
|
||||
command = 'echo %s > /etc/pure-ftpd/conf/ForcePassiveIP' % (self.publicip)
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'echo "40110 40210" > /etc/pure-ftpd/conf/PassivePortRange'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'echo "no" > /etc/pure-ftpd/conf/UnixAuthentication'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'echo "/etc/pure-ftpd/db/mysql.conf" > /etc/pure-ftpd/conf/MySQLConfigFile'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'ln -s /etc/pure-ftpd/conf/MySQLConfigFile /etc/pure-ftpd/auth/30mysql'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = 'systemctl restart pure-ftpd-mysql.service'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
CommandExecutor.execute('ln -s /etc/pure-ftpd/conf/MySQLConfigFile /etc/pure-ftpd/auth/30mysql', self.distro)
|
||||
CommandExecutor.execute('ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix', self.distro)
|
||||
ServiceManager.restart_service('pure-ftpd-mysql.service', self.distro)
|
||||
|
||||
|
||||
|
||||
|
||||
if get_Ubuntu_release() > 21.00:
|
||||
### change mysql md5 to crypt
|
||||
|
||||
command = "sed -i 's/MYSQLCrypt md5/MYSQLCrypt crypt/g' /etc/pure-ftpd/db/mysql.conf"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = "systemctl restart pure-ftpd-mysql.service"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ubuntu_version = get_Ubuntu_release()
|
||||
if ubuntu_version > 21.00:
|
||||
### change mysql md5 to crypt for Ubuntu 22.04+ including 24.04
|
||||
ConfigFileHandler.sed_replace('/etc/pure-ftpd/db/mysql.conf', 'MYSQLCrypt md5', 'MYSQLCrypt crypt', self.distro)
|
||||
ServiceManager.restart_service('pure-ftpd-mysql.service', self.distro)
|
||||
else:
|
||||
|
||||
try:
|
||||
@@ -651,8 +492,7 @@ gpgcheck=1
|
||||
version = int(clAPVersion.split('-')[1])
|
||||
|
||||
if type == 'al' and version >= 90:
|
||||
command = "sed -i 's/MYSQLCrypt md5/MYSQLCrypt crypt/g' /etc/pure-ftpd/pureftpd-mysql.conf"
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ConfigFileHandler.sed_replace('/etc/pure-ftpd/pureftpd-mysql.conf', 'MYSQLCrypt md5', 'MYSQLCrypt crypt', self.distro)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -666,12 +506,9 @@ gpgcheck=1
|
||||
|
||||
def installPowerDNS(self):
|
||||
try:
|
||||
|
||||
if self.distro == ubuntu or self.distro == cent8 or self.distro == openeuler:
|
||||
command = 'systemctl stop systemd-resolved'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
command = 'systemctl disable systemd-resolved.service'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.stop_service('systemd-resolved', self.distro, exit_on_error=False)
|
||||
ServiceManager.disable_service('systemd-resolved.service', self.distro, exit_on_error=False)
|
||||
|
||||
try:
|
||||
os.rename('/etc/resolv.conf', 'etc/resolved.conf')
|
||||
@@ -700,9 +537,7 @@ gpgcheck=1
|
||||
os.system(command)
|
||||
return 1
|
||||
else:
|
||||
command = 'yum -y install pdns pdns-backend-mysql'
|
||||
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
PackageManager.install_packages('pdns pdns-backend-mysql', self.distro, ubuntu, centos, cent8, openeuler)
|
||||
|
||||
except BaseException as msg:
|
||||
logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [powerDNS]")
|
||||
@@ -730,29 +565,13 @@ gpgcheck=1
|
||||
else:
|
||||
shutil.copy("dns-one/pdns.conf", dnsPath)
|
||||
|
||||
data = open(dnsPath, "r").readlines()
|
||||
|
||||
writeDataToFile = open(dnsPath, "w")
|
||||
|
||||
dataWritten = "gmysql-password=" + mysqlPassword + "\n"
|
||||
|
||||
for items in data:
|
||||
if items.find("gmysql-password") > -1:
|
||||
writeDataToFile.writelines(dataWritten)
|
||||
else:
|
||||
writeDataToFile.writelines(items)
|
||||
|
||||
# if self.distro == ubuntu:
|
||||
# os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR)
|
||||
|
||||
writeDataToFile.close()
|
||||
# Update MySQL password in PowerDNS config
|
||||
replacements = [("gmysql-password", "gmysql-password=" + mysqlPassword)]
|
||||
ConfigFileHandler.replace_in_file(dnsPath, replacements)
|
||||
|
||||
if self.remotemysql == 'ON':
|
||||
command = "sed -i 's|gmysql-host=localhost|gmysql-host=%s|g' %s" % (self.mysqlhost, dnsPath)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
command = "sed -i 's|gmysql-port=3306|gmysql-port=%s|g' %s" % (self.mysqlport, dnsPath)
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR)
|
||||
ConfigFileHandler.sed_replace(dnsPath, 'gmysql-host=localhost', f'gmysql-host={self.mysqlhost}', self.distro)
|
||||
ConfigFileHandler.sed_replace(dnsPath, 'gmysql-port=3306', f'gmysql-port={self.mysqlport}', self.distro)
|
||||
|
||||
InstallCyberPanel.stdOut("PowerDNS configured!", 1)
|
||||
|
||||
@@ -762,14 +581,9 @@ gpgcheck=1
|
||||
return 1
|
||||
|
||||
def startPowerDNS(self):
|
||||
|
||||
############## Start PowerDNS ######################
|
||||
|
||||
command = 'systemctl enable pdns'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
|
||||
command = 'systemctl start pdns'
|
||||
install.preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR)
|
||||
ServiceManager.enable_service('pdns', self.distro)
|
||||
ServiceManager.start_service('pdns', self.distro)
|
||||
|
||||
|
||||
def Main(cwd, mysql, distro, ent, serial=None, port="8090", ftp=None, dns=None, publicip=None, remotemysql=None,
|
||||
@@ -801,14 +615,8 @@ def Main(cwd, mysql, distro, ent, serial=None, port="8090", ftp=None, dns=None,
|
||||
time.sleep(10)
|
||||
|
||||
try:
|
||||
command = 'chmod 640 %s' % (file_name)
|
||||
install.preFlightsChecks.call(command, distro, '[chmod]',
|
||||
'',
|
||||
1, 0, os.EX_OSERR)
|
||||
command = 'chown root:cyberpanel %s' % (file_name)
|
||||
install.preFlightsChecks.call(command, distro, '[chmod]',
|
||||
'',
|
||||
1, 0, os.EX_OSERR)
|
||||
CommandExecutor.execute(f'chmod 640 {file_name}', distro, '[chmod]', exit_on_error=False)
|
||||
CommandExecutor.execute(f'chown root:cyberpanel {file_name}', distro, '[chmod]', exit_on_error=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
338
install/installHelpers.py
Normal file
338
install/installHelpers.py
Normal file
@@ -0,0 +1,338 @@
|
||||
import os
|
||||
import subprocess
|
||||
import shutil
|
||||
import install
|
||||
import logging
|
||||
|
||||
|
||||
class PackageManager:
|
||||
"""Handles package installation across different distributions"""
|
||||
|
||||
@staticmethod
|
||||
def get_install_command(packages, distro, ubuntu=1, centos=0, cent8=2, openeuler=3):
|
||||
"""Returns the appropriate install command for the distribution"""
|
||||
if distro == ubuntu:
|
||||
return f"DEBIAN_FRONTEND=noninteractive apt-get -y install {packages}"
|
||||
elif distro == centos:
|
||||
return f"yum install -y {packages}"
|
||||
else: # cent8 or openeuler
|
||||
return f"dnf install -y {packages}"
|
||||
|
||||
@staticmethod
|
||||
def install_packages(packages, distro, ubuntu=1, centos=0, cent8=2, openeuler=3, use_shell=False):
|
||||
"""Install packages with proper error handling"""
|
||||
command = PackageManager.get_install_command(packages, distro, ubuntu, centos, cent8, openeuler)
|
||||
if use_shell:
|
||||
install.preFlightsChecks.call(command, distro, command, command, 1, 1, os.EX_OSERR, True)
|
||||
else:
|
||||
install.preFlightsChecks.call(command, distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
|
||||
class ServiceManager:
|
||||
"""Handles service operations across different distributions"""
|
||||
|
||||
@staticmethod
|
||||
def manage_service(service_name, action, distro, exit_on_error=True):
|
||||
"""Manage systemd services (start, stop, enable, disable, restart)"""
|
||||
command = f"systemctl {action} {service_name}"
|
||||
error_code = 1 if exit_on_error else 0
|
||||
install.preFlightsChecks.call(command, distro, command, command, 1, error_code, os.EX_OSERR)
|
||||
|
||||
@staticmethod
|
||||
def start_service(service_name, distro):
|
||||
"""Start a service"""
|
||||
ServiceManager.manage_service(service_name, "start", distro)
|
||||
|
||||
@staticmethod
|
||||
def stop_service(service_name, distro, exit_on_error=False):
|
||||
"""Stop a service"""
|
||||
ServiceManager.manage_service(service_name, "stop", distro, exit_on_error)
|
||||
|
||||
@staticmethod
|
||||
def enable_service(service_name, distro):
|
||||
"""Enable a service at startup"""
|
||||
ServiceManager.manage_service(service_name, "enable", distro)
|
||||
|
||||
@staticmethod
|
||||
def disable_service(service_name, distro, exit_on_error=False):
|
||||
"""Disable a service at startup"""
|
||||
ServiceManager.manage_service(service_name, "disable", distro, exit_on_error)
|
||||
|
||||
@staticmethod
|
||||
def restart_service(service_name, distro):
|
||||
"""Restart a service"""
|
||||
ServiceManager.manage_service(service_name, "restart", distro)
|
||||
|
||||
|
||||
class ConfigFileHandler:
|
||||
"""Handles configuration file operations"""
|
||||
|
||||
@staticmethod
|
||||
def replace_in_file(file_path, replacements):
|
||||
"""
|
||||
Replace multiple patterns in a file
|
||||
replacements: list of tuples (search_pattern, replacement)
|
||||
"""
|
||||
try:
|
||||
with open(file_path, 'r') as f:
|
||||
data = f.readlines()
|
||||
|
||||
with open(file_path, 'w') as f:
|
||||
for line in data:
|
||||
modified_line = line
|
||||
for search_pattern, replacement in replacements:
|
||||
if search_pattern in line:
|
||||
modified_line = replacement + '\n' if not replacement.endswith('\n') else replacement
|
||||
break
|
||||
f.write(modified_line)
|
||||
return True
|
||||
except IOError as e:
|
||||
logging.InstallLog.writeToFile(f'[ERROR] {str(e)} [ConfigFileHandler.replace_in_file]')
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def sed_replace(file_path, search, replace, distro):
|
||||
"""Use sed command for replacements"""
|
||||
command = f"sed -i 's|{search}|{replace}|g' {file_path}"
|
||||
install.preFlightsChecks.call(command, distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
@staticmethod
|
||||
def copy_config_file(source, destination, remove_existing=True):
|
||||
"""Copy configuration file with optional removal of existing file"""
|
||||
try:
|
||||
if remove_existing and os.path.exists(destination):
|
||||
os.remove(destination)
|
||||
shutil.copy(source, destination)
|
||||
return True
|
||||
except Exception as e:
|
||||
logging.InstallLog.writeToFile(f'[ERROR] {str(e)} [ConfigFileHandler.copy_config_file]')
|
||||
return False
|
||||
|
||||
|
||||
class CommandExecutor:
|
||||
"""Centralized command execution with consistent error handling"""
|
||||
|
||||
@staticmethod
|
||||
def execute(command, distro, description=None, exit_on_error=True, exit_code=os.EX_OSERR):
|
||||
"""Execute a command with standard error handling"""
|
||||
if description is None:
|
||||
description = command
|
||||
error_flag = 1 if exit_on_error else 0
|
||||
install.preFlightsChecks.call(command, distro, description, command, 1, error_flag, exit_code)
|
||||
|
||||
@staticmethod
|
||||
def execute_with_output(command, shell=True):
|
||||
"""Execute command and return output"""
|
||||
try:
|
||||
result = subprocess.run(command, capture_output=True, universal_newlines=True, shell=shell)
|
||||
except:
|
||||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||
universal_newlines=True, shell=shell)
|
||||
return result
|
||||
|
||||
|
||||
class PHPInstaller:
|
||||
"""Handles PHP installation for different versions and distributions"""
|
||||
|
||||
@staticmethod
|
||||
def install_php_ubuntu(versions=None):
|
||||
"""Install PHP versions on Ubuntu"""
|
||||
if versions is None:
|
||||
# Include PHP 8.4 for Ubuntu 24.04
|
||||
versions = ['7?', '80', '81', '82', '83', '84']
|
||||
|
||||
for version in versions:
|
||||
if version == '7?':
|
||||
command = 'DEBIAN_FRONTEND=noninteractive apt-get -y install ' \
|
||||
'lsphp7? lsphp7?-common lsphp7?-curl lsphp7?-dev lsphp7?-imap lsphp7?-intl lsphp7?-json ' \
|
||||
'lsphp7?-ldap lsphp7?-mysql lsphp7?-opcache lsphp7?-pspell lsphp7?-recode ' \
|
||||
'lsphp7?-sqlite3 lsphp7?-tidy'
|
||||
else:
|
||||
command = f'DEBIAN_FRONTEND=noninteractive apt-get -y install lsphp{version}*'
|
||||
os.system(command)
|
||||
|
||||
@staticmethod
|
||||
def install_php_centos(distro, centos=0, cent8=2, openeuler=3):
|
||||
"""Install PHP versions on CentOS/RHEL based systems"""
|
||||
if distro == centos:
|
||||
# First install the group
|
||||
command = 'yum -y groupinstall lsphp-all'
|
||||
install.preFlightsChecks.call(command, distro, command, command, 1, 1, os.EX_OSERR)
|
||||
|
||||
# Then install individual versions
|
||||
versions = ['71', '72', '73', '74', '80', '81', '82', '83']
|
||||
for version in versions:
|
||||
command = f'yum install -y lsphp{version}* --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
elif distro == cent8:
|
||||
command = 'dnf install lsphp71* lsphp72* lsphp73* lsphp74* lsphp80* --exclude lsphp73-pecl-zip --exclude *imagick* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
command = 'dnf install lsphp81* lsphp82* lsphp83* --exclude *imagick* -y --skip-broken'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
elif distro == openeuler:
|
||||
command = 'dnf install lsphp71* lsphp72* lsphp73* lsphp74* lsphp80* lsphp81* lsphp82* lsphp83* -y'
|
||||
subprocess.call(command, shell=True)
|
||||
|
||||
|
||||
class FileSystemHelper:
|
||||
"""Helper for file system operations"""
|
||||
|
||||
@staticmethod
|
||||
def create_directory(path, exit_on_error=False):
|
||||
"""Create directory with error handling"""
|
||||
try:
|
||||
os.mkdir(path)
|
||||
return True
|
||||
except OSError as e:
|
||||
if exit_on_error:
|
||||
raise
|
||||
logging.InstallLog.writeToFile(f"[ERROR] Could not create directory {path}: {str(e)}")
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def create_user_and_group(user, group, uid, gid, shell="/bin/false", home="/bin/null", distro=None):
|
||||
"""Create system user and group"""
|
||||
# Create group
|
||||
command = f'groupadd -g {gid} {group}'
|
||||
CommandExecutor.execute(command, distro, exit_on_error=True)
|
||||
|
||||
# Create user
|
||||
command = f'useradd -u {uid} -s {shell} -d {home} -c "{user} user" -g {group} {user}'
|
||||
CommandExecutor.execute(command, distro, exit_on_error=True)
|
||||
|
||||
|
||||
class DistroHandler:
|
||||
"""Handles distribution-specific operations"""
|
||||
|
||||
# Distribution constants
|
||||
CENTOS = 0
|
||||
UBUNTU = 1
|
||||
CENT8 = 2
|
||||
OPENEULER = 3
|
||||
|
||||
@staticmethod
|
||||
def is_rhel_based(distro):
|
||||
"""Check if distribution is RHEL-based"""
|
||||
return distro in [DistroHandler.CENTOS, DistroHandler.CENT8, DistroHandler.OPENEULER]
|
||||
|
||||
@staticmethod
|
||||
def is_debian_based(distro):
|
||||
"""Check if distribution is Debian-based"""
|
||||
return distro == DistroHandler.UBUNTU
|
||||
|
||||
@staticmethod
|
||||
def get_package_manager(distro):
|
||||
"""Get the package manager for the distribution"""
|
||||
if distro == DistroHandler.UBUNTU:
|
||||
return "apt-get"
|
||||
elif distro == DistroHandler.CENTOS:
|
||||
return "yum"
|
||||
else: # CENT8, OPENEULER
|
||||
return "dnf"
|
||||
|
||||
@staticmethod
|
||||
def get_service_name(base_service, distro):
|
||||
"""Get distribution-specific service name"""
|
||||
# Add logic for service name mapping if needed
|
||||
service_map = {
|
||||
'mysql': {
|
||||
DistroHandler.UBUNTU: 'mysql',
|
||||
DistroHandler.CENTOS: 'mariadb',
|
||||
DistroHandler.CENT8: 'mariadb',
|
||||
DistroHandler.OPENEULER: 'mariadb'
|
||||
}
|
||||
}
|
||||
|
||||
if base_service in service_map and distro in service_map[base_service]:
|
||||
return service_map[base_service][distro]
|
||||
return base_service
|
||||
|
||||
|
||||
class PermissionManager:
|
||||
"""Handles file permissions and ownership"""
|
||||
|
||||
@staticmethod
|
||||
def set_permissions(path, mode, distro, owner=None, group=None):
|
||||
"""Set file permissions and optionally ownership"""
|
||||
# Set permissions
|
||||
CommandExecutor.execute(f'chmod {mode} {path}', distro)
|
||||
|
||||
# Set ownership if specified
|
||||
if owner or group:
|
||||
owner_str = owner if owner else ""
|
||||
group_str = group if group else ""
|
||||
if owner and group:
|
||||
ownership = f"{owner}:{group}"
|
||||
elif owner:
|
||||
ownership = owner
|
||||
else:
|
||||
ownership = f":{group}"
|
||||
|
||||
CommandExecutor.execute(f'chown {ownership} {path}', distro)
|
||||
|
||||
@staticmethod
|
||||
def batch_set_permissions(permission_list, distro):
|
||||
"""Apply multiple permission changes efficiently"""
|
||||
for perm in permission_list:
|
||||
PermissionManager.set_permissions(
|
||||
perm['path'],
|
||||
perm['mode'],
|
||||
distro,
|
||||
perm.get('owner'),
|
||||
perm.get('group')
|
||||
)
|
||||
|
||||
|
||||
class DownloadHelper:
|
||||
"""Helper for downloading and extracting files"""
|
||||
|
||||
@staticmethod
|
||||
def download_file(url, destination, distro):
|
||||
"""Download a file using wget"""
|
||||
command = f'wget -O {destination} {url}' if destination else f'wget {url}'
|
||||
CommandExecutor.execute(command, distro)
|
||||
|
||||
@staticmethod
|
||||
def extract_archive(archive_path, destination, distro, archive_type='tar'):
|
||||
"""Extract an archive file"""
|
||||
if archive_type == 'tar':
|
||||
command = f'tar -xf {archive_path} -C {destination}'
|
||||
elif archive_type == 'tar.gz':
|
||||
command = f'tar -xzf {archive_path} -C {destination}'
|
||||
elif archive_type == 'zip':
|
||||
command = f'unzip {archive_path} -d {destination}'
|
||||
else:
|
||||
raise ValueError(f"Unsupported archive type: {archive_type}")
|
||||
|
||||
CommandExecutor.execute(command, distro)
|
||||
|
||||
@staticmethod
|
||||
def download_and_extract(url, extract_dir, distro, archive_type='tar.gz'):
|
||||
"""Download and extract in one operation"""
|
||||
filename = os.path.basename(url)
|
||||
DownloadHelper.download_file(url, filename, distro)
|
||||
DownloadHelper.extract_archive(filename, extract_dir, distro, archive_type)
|
||||
return filename
|
||||
|
||||
|
||||
class SSLCertificateHelper:
|
||||
"""Helper for SSL certificate operations"""
|
||||
|
||||
@staticmethod
|
||||
def generate_self_signed_cert(cert_path, key_path, distro, days=3650,
|
||||
subject="/C=US/ST=State/L=City/O=Org/CN=localhost"):
|
||||
"""Generate a self-signed SSL certificate"""
|
||||
command = (f'openssl req -x509 -nodes -days {days} -newkey rsa:2048 '
|
||||
f'-subj "{subject}" -keyout {key_path} -out {cert_path}')
|
||||
CommandExecutor.execute(command, distro)
|
||||
|
||||
@staticmethod
|
||||
def generate_csr(key_path, csr_path, distro,
|
||||
subject="/C=US/ST=State/L=City/O=Org/CN=localhost"):
|
||||
"""Generate a certificate signing request"""
|
||||
command = (f'openssl req -new -key {key_path} -out {csr_path} '
|
||||
f'-subj "{subject}"')
|
||||
CommandExecutor.execute(command, distro)
|
||||
Reference in New Issue
Block a user